RXSWIFTを使用してAlamoFireリクエストを介して次のページデータを取得します -- pagination フィールド と alamofire フィールド と rx-swift フィールド 関連 問題

Retrieve next page data through Alamofire request using RxSwift












2
vote

問題

日本語

サーバーからメッセージを取得する既存のコードがいくつかあります。サーバーはDjangoにあり、ページ化されたデータを返します。したがって、サーバーに送信される最初の呼び出しは10の最新の結果を取得します。次の通話は、より多くの結果などをもたらす必要があります...

しかしながら、問題は最初の要求のみがサーバーに送信されていることです。それで、それは10の最新の結果をロードするだけで、他に何もありません。アプリがすべての結果を取得できるようにコードを変更したい。

JSON応答

要求: http://192.168.0.127:8000/v1 /トピック/ 1 /メッセージ/

<事前> <コード> { "count": 12, "next": "http://192.168.0.127:8000/v1/topic/1/message/?page=2", "previous": null, "results": [ { "id": 12, "topic": 1, "photo_url": "", "message": "Test12", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:50:42.335694Z" }, { "id": 11, "topic": 1, "photo_url": "", "message": "Test11", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:50:13.931648Z" }, { "id": 10, "topic": 1, "photo_url": "", "message": "Test10", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:50:07.819994Z" }, { "id": 9, "topic": 1, "photo_url": "", "message": "Test9", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:49:59.896686Z" }, { "id": 8, "topic": 1, "photo_url": "", "message": "Test8", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:48:47.268219Z" }, { "id": 7, "topic": 1, "photo_url": "", "message": "Test7", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:48:36.587173Z" }, { "id": 6, "topic": 1, "photo_url": "", "message": "Test6", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:48:29.111922Z" }, { "id": 5, "topic": 1, "photo_url": "", "message": "Test5", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:48:22.983123Z" }, { "id": 4, "topic": 1, "photo_url": "", "message": "Test4", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:48:12.986871Z" }, { "id": 3, "topic": 1, "photo_url": "", "message": "Test3", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:48:05.376769Z" } ] }

要求:> http://192.168.0.127 :8000 / V1 /トピック/ 1 /メッセージ/?PAGE = 2

<事前> <コード> { "count": 12, "next": null, "previous": "http://192.168.0.127:8000/v1/topic/1/message/", "results": [ { "id": 2, "topic": 1, "photo_url": "", "message": "Test2", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:47:59.367765Z" }, { "id": 1, "topic": 1, "photo_url": "", "message": "Test1", "user": { "id": 2, "first_name": "John", "photo": "https://graph.facebook.com/437334666655912/picture/?type=large", "last_seen_event": null, "blocked": false }, "created_on": "2017-05-22T07:47:49.372195Z" } ] }

コード

<事前> <コード> fileprivate lazy var _getMessagesAction: Action<EnumerableType, EnumerableType> = Action { (last: EnumerableType?) -> Observable<EnumerableType> in self.isNewRequest = last?.next == nil ? true : false return self.messagesRequest(last) }

last 変数は常にnilです。

<コード> typealias EnumerableType = Enumerable<Message>

これは列挙型クラス

です。 <事前> <コード> data "aws_lambda_function" "myfunction" { function_name = "my-function-name" } data "aws_api_gateway_rest_api" "my_rest_api" { name = "my-rest-api" } 0
英語

I have some existing code that fetches messages from the server. The server is in Django and returns paginated data. Hence, the first call that goes to the server fetches the 10 latest results, the next call should bring more results and so on...

However, the problem is that only the first request is being send to the server. So it only loads the 10 latest results and nothing else. I want to modify the code such that app is able to fetch all results.

JSON Response

Request: http://192.168.0.127:8000/v1/topic/1/message/

{   "count": 12,   "next": "http://192.168.0.127:8000/v1/topic/1/message/?page=2",   "previous": null,   "results": [     {       "id": 12,       "topic": 1,       "photo_url": "",       "message": "Test12",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:50:42.335694Z"     },     {       "id": 11,       "topic": 1,       "photo_url": "",       "message": "Test11",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:50:13.931648Z"     },     {       "id": 10,       "topic": 1,       "photo_url": "",       "message": "Test10",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:50:07.819994Z"     },     {       "id": 9,       "topic": 1,       "photo_url": "",       "message": "Test9",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:49:59.896686Z"     },     {       "id": 8,       "topic": 1,       "photo_url": "",       "message": "Test8",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:48:47.268219Z"     },     {       "id": 7,       "topic": 1,       "photo_url": "",       "message": "Test7",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:48:36.587173Z"     },     {       "id": 6,       "topic": 1,       "photo_url": "",       "message": "Test6",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:48:29.111922Z"     },     {       "id": 5,       "topic": 1,       "photo_url": "",       "message": "Test5",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:48:22.983123Z"     },     {       "id": 4,       "topic": 1,       "photo_url": "",       "message": "Test4",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:48:12.986871Z"     },     {       "id": 3,       "topic": 1,       "photo_url": "",       "message": "Test3",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:48:05.376769Z"     }   ] } 

Request: http://192.168.0.127:8000/v1/topic/1/message/?page=2

{   "count": 12,   "next": null,   "previous": "http://192.168.0.127:8000/v1/topic/1/message/",   "results": [     {       "id": 2,       "topic": 1,       "photo_url": "",       "message": "Test2",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:47:59.367765Z"     },     {       "id": 1,       "topic": 1,       "photo_url": "",       "message": "Test1",       "user": {         "id": 2,         "first_name": "John",         "photo": "https://graph.facebook.com/437334666655912/picture/?type=large",         "last_seen_event": null,         "blocked": false       },       "created_on": "2017-05-22T07:47:49.372195Z"     }   ] } 

Code

fileprivate lazy var _getMessagesAction: Action<EnumerableType, EnumerableType> = Action { (last: EnumerableType?) -> Observable<EnumerableType> in          self.isNewRequest = last?.next == nil ? true : false          return self.messagesRequest(last) } 

The last variable is always nil right now.

typealias EnumerableType = Enumerable<Message>

Here is the Enumerable class

public struct Enumerable<EnumerableType: ResponseCollectionModelSerializable> : ResponseModelSerializable {      let count: Int     let prev: String?     let next: String?     let results: [EnumerableType]?      public init?(response: HTTPURLResponse, json: JSON) {         guard let countOBj = json["count"] else {             return nil         }          self.count = countOBj as! Int         self.prev = json["previous"] as? String         self.next = json["next"] as? String          if let results = json["results"] as? AnyObject {             self.results = EnumerableType.collection(response: response, json: JSON(results))         } else {             self.results = nil         }      }  } 
</div
        

回答リスト

1
 
vote

うーん...あなたがあなたの状況の具体的な例を作成するのに十分に投稿されたような気がしませんが、このようなものをするためのサンプルコードがあります。

RXSWIFT GitHub Repoでは、ページにデータをロードするGitHubsearchRepositiesを含む例がいくつかあります。

私はこのgistを書きました: https://gist.github.com/danielt1263/10bc5eb821C752AD45F281C6F4E3034BWHWAD/アクティビティインジケータを表示するための観察可能なビューコントローラのビューモデルをテストと詳細に含めるA>。

 

Hmm... I don't feel like you posted enough to create a specific example for your situation, but there is sample code for doing this sort of thing.

In the RxSwift GitHub repo, there are several examples including GitHubSearchRepositories which loads data in pages.

I also wrote this gist: https://gist.github.com/danielt1263/10bc5eb821c752ad45f281c6f4e3034b which includes tests and details a view model for a view controller complete with an Observable for displaying an activity indicator.

</div
 
 
       
       

関連する質問

0  観測可能に加入している間にOnNextケースのステータスコードを取得する方法  ( How to get the status code in the onnext case while subscribing to an observable ) 
私はネットワーク要求のための私のSwiftアプリでMOYAを使っています。 私は早くアラモフォールを使いました、そして私は投稿をする方法、要求を取得し、そして応答を読む方法に精通しています。 以下は、要求をして展望可能なに加入しているコードです。 <事前> <...

0  TableViewセルRXSWIFTのスイッチボタン  ( Switch button on tableview cell rxswift ) 
各TableViewセルにスイッチの変更状態のアクションを追加しようとしているテーブルビューのセルには、最初にアプリケーションを実行したときに、作成された各セルに対して状態アクションが呼び出されることです。 データベース上で最初に5項目がある場合は、最初にTa...

1  別の単一の作成RXSwiftの中で観察可能な単一の観察可能なものを購読します  ( Subscribe a single observable inside another single creation rxswift ) 
サーバーからデータを取得し、その後私のDBを更新したいのですが、受信したデータをユーザーに表示します。この目標のために、私のビューモデル内のメソッド( getData() )は、 Single i呼び出しを返し、このメソッドをView Controllerに...

2  RxSwift計算された変数は2つの変数から組み合わされました  ( Rxswift computed variable combined from 2 other variables ) 
他の2つの変数から計算される var isOn: Variable<Bool> を持つ必要があります。私の isOn 変数と同様に最新の値を読むことができるときに他の変数の変更を購読する方法は? は、<コード> Observable および Variable ...

1  RXSwift 1つの購読を投入すると、別の購読の処分を確認します  ( Rxswift disposing one subscription invokes dispose of another subscription ) 
ViewControllerに PublishSubject<InfoData> があります。そして私はそれを購読するので、イベントを発行するとき - 私はUIALertViewControllerを表示します。 <事前> <コード> let infoDat...

4  RXSWIFT .ASDriverOnErrorJustComplete()コア/ユーティリティライブラリの一部ではない  ( Rxswift asdriveronerrorjustcomplete not being part of core utility library ) 
RxSwiftを使ってアプリを作成し、複数のオープンソースプロジェクトを調べる方法(すなわち、 cleanArchitecturerxswift そして swifthub )私はよく使用されています <事前> <コード> extension Observab...

8  RXSWIFTはフラットマップのチェーンを通して値を伝播します  ( Rxswift propagating a value through a chain of flatmaps ) 
だから私は非同期操作の連鎖を実行したいいくつかのRxSwiftコードを持っています、すべて監査ファイルを使用して構成されています。 <コード> flatMap はこれを行う方法であり、それは私が理解できるチェーンの下に変数を渡すことができないようです。これは疑...

1  TableViewCell MVVMのCollectionView  ( Collectionview in tableviewcell mvvm ) 
MVVM非反応性を使用してSWIFT 4でアプリを構築しています。 Spagetthiコードに変換しないようにするには、TableViewのビュー・モデルからViewModelアップデートを呼び出したいと思います。 CollectionViewCellごとに...

-1  RXSWIFT:順次生成再発性の異常が検出されましたエラーが検出されました  ( Rxswift implementing concatmap generating reentrancy anomaly was detected error ) 
RxSwift 内の concatMap を実装しようとしていますが、 concatMap i '内でObservableに新しい値を設定しようとしました。 mこのエラーを得る: <事前> <コード> Reentrancy anomaly was det...

6  RX-SWIFTクリーンアーキテクチャ[クローズ]  ( Rx swift clean architecture ) 
閉鎖。この質問は意見ベースです。現在答えを受け付けていません。 この質問を改善したいですか?この記事を編集することで事実と引用と...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有