teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

簡潔に書き直しました。

2016/09/07 06:19

投稿

Y_M
Y_M

スコア265

title CHANGED
@@ -1,1 +1,1 @@
1
- Alamofireの通信を順番を前後させずループさせたい
1
+ AlamofireでAPIから値が0になるまでループさせたい
body CHANGED
@@ -1,73 +1,40 @@
1
1
  ###前提・実現したいこと
2
+ APIからのレスポンスとして`number`が返ってきますがその値が0になるまで
2
- Alamofireの通信ループさせたいのですがうまく順番通りにデータを受け取る方法が思いつきません。
3
+ Alamofireで同じAPIに対してリクエスト投げ続けたいのですが
3
- ・おそらく`while`でループさせると順番がめちゃくちゃになると思います。
4
- なたか知恵を貸していただけないでしょうか。
4
+ のよにコーディングすれば良いの思いつきません
5
5
 
6
- ・nextPrevIdが0以外の時ループさせ(初回のみ必ず`0`)
6
+ 通信結果を投げた順番で結果を受け取るようしたい場合
7
- _受け取ったデータ中の`json["result"]["prev_id"]`を次のnextPrevIdとする
7
+ ように記述することで処理を実装できますか?
8
8
 
9
- 例) 1回目 nextPrevId --> 0 受け取った値「1」
10
- _ 2回目 nextPrevId --> 1 受け取った値「2」
11
- _ 以下ループ
12
- _ n回目 nextPrevId --> X 受け取った値「0」 --> ループ終了
13
-
14
-
15
- ・nextPrevIdが、まだデータが残っているかのフラグになっていて
16
- _それは情報を1度でも取得していないとわからない。
17
-
18
9
  ###該当のソースコード
19
- ```ここに言語を入力
10
+ ```Swift
20
- let nextPrevId: Int = 0
21
11
 
22
12
  override func viewWillAppear(animated: Bool) {
23
13
  super.viewWillAppear(animated)
24
- getMessageList(self, prevId: nextPrevId, count: 5, apiResponse: { response in
14
+
25
- for num in 0...response.count {
15
+ /*ここの処理をループさせたいのです。*/
26
- self.messageList.append(response[num])
16
+ getMessageList(apiResponse: { response in
27
- }
17
+ ※省略
28
18
  })
19
+ /*--------------------------------*/
20
+
29
21
  }
30
22
 
31
- func getMessageList(uiView: UIViewController, prevId: Int, count: Int, apiResponse: (responseData: [[String: AnyObject?]]) -> ()) {
23
+ func getMessageList(apiResponse: (responseData: Int) -> ()) {
32
24
 
33
- Alamofire.request(.GET, "\(server)/api/user/\(prevId)/\(count)", headers: customHeader)
25
+ Alamofire.request(.GET, "(APIのURL)", headers: customHeader)
34
26
  .responseJSON { response in
35
27
  guard let object = response.result.value else {
36
28
  return
37
29
  }
38
30
  let json = JSON(object)
39
- var messageDataGroup: [[String: AnyObject?]] = []
40
-
41
- if json["result"]["list"] != nil {
42
- self.nextPrevId = json["result"]["prev_id"].int!
31
+ let number: Int = json["result"]["number"].int!
43
- json["result"]["list"].forEach { (_, json) in
44
- var messageData: [String: AnyObject?] = [:]
45
- messageData["id"] = String(json["id"].int!)
46
- messageData["data"] = json["data"].string!
47
-
48
- messageDataGroup.append(messageData)
49
- }
50
- }
51
- apiResponse(responseData: messageDataGroup)
32
+ apiResponse(responseData: number)
52
33
  }
53
34
 
54
35
  }
55
36
  ```
56
37
 
57
- ###試したこと
58
- ```
59
- while nextPrevId != 0 {
60
- getMessageList(self, prevId: nextPrevId, count: 5, apiResponse: { response in
61
- for num in 0...response.count {
62
- self.messageList.append(response[num])
63
- }
64
- })
65
- }
66
- ```
67
-
68
- 上記のように`while`文でループさせようと思ったのですが、これだとデータによっては通信時間が異なるので
69
- データの順序がバラバラになるのではと考えました。
70
-
71
38
  ###補足情報(言語/FW/ツール等のバージョンなど)
72
39
  ・`Xcode7.3.1`
73
40
  ・`Swift2`