質問編集履歴

1

簡潔に書き直しました。

2016/09/07 06:19

投稿

Y_M
Y_M

スコア265

test CHANGED
@@ -1 +1 @@
1
- Alamofireの通信を順番を前後させずループさせたい
1
+ AlamofireでAPIから値が0になるまでループさせたい
test CHANGED
@@ -1,42 +1,22 @@
1
1
  ###前提・実現したいこと
2
2
 
3
- Alamofireの通信をループさせたいのですがうまく順番通りデータを受け取方法が思いつきせん。
3
+ APIからのレスポンスとして`number`が返ってきますがその値が0るま
4
4
 
5
- ・おそらく`while`ループさせると順番がめちゃくちゃなると思
5
+ Alamofireで同じAPI対してリクエストを投げ続けたのでが、
6
6
 
7
- なた知恵を貸してただけないでしょうか
7
+ のようにコーディングすれば良いのつきません
8
8
 
9
9
 
10
10
 
11
- ・nextPrevIdが0以外の時ループさせ(初回のみ必ず`0`)
11
+ 通信結果を投げた順番で結果を受け取るようしたい場合
12
12
 
13
- _受け取ったデータの中の`json["result"]["prev_id"]`を次のnextPrevIdとする。
14
-
15
-
16
-
17
- 例) 1回目 nextPrevId --> 0 受け取った値「1」
18
-
19
- _ 2回目 nextPrevId --> 1 受け取った値「2」
20
-
21
- _ 以下ループ
22
-
23
- _ n回目 nextPrevId --> X 受け取った値「0」 --> ループ終了
24
-
25
-
26
-
27
-
28
-
29
- ・nextPrevIdが、まだデータが残っているかのフラグになっていて
30
-
31
- _それは情報1度も取得していないとわらない。
13
+ どのように記述することで処理実装きます
32
14
 
33
15
 
34
16
 
35
17
  ###該当のソースコード
36
18
 
37
- ```ここに言語を入力
19
+ ```Swift
38
-
39
- let nextPrevId: Int = 0
40
20
 
41
21
 
42
22
 
@@ -44,25 +24,29 @@
44
24
 
45
25
  super.viewWillAppear(animated)
46
26
 
47
- getMessageList(self, prevId: nextPrevId, count: 5, apiResponse: { response in
27
+
48
28
 
49
- for num in 0...response.count {
29
+ /*ここの処理をループさせたいのです。*/
50
30
 
51
- self.messageList.append(response[num])
31
+ getMessageList(apiResponse: { response in
52
32
 
53
- }
33
+ ※省略
54
34
 
55
35
  })
36
+
37
+ /*--------------------------------*/
38
+
39
+
56
40
 
57
41
  }
58
42
 
59
43
 
60
44
 
61
- func getMessageList(uiView: UIViewController, prevId: Int, count: Int, apiResponse: (responseData: [[String: AnyObject?]]) -> ()) {
45
+ func getMessageList(apiResponse: (responseData: Int) -> ()) {
62
46
 
63
47
 
64
48
 
65
- Alamofire.request(.GET, "\(server)/api/user/\(prevId)/\(count)", headers: customHeader)
49
+ Alamofire.request(.GET, "(APIのURL)", headers: customHeader)
66
50
 
67
51
  .responseJSON { response in
68
52
 
@@ -74,31 +58,9 @@
74
58
 
75
59
  let json = JSON(object)
76
60
 
77
- var messageDataGroup: [[String: AnyObject?]] = []
61
+ let number: Int = json["result"]["number"].int!
78
62
 
79
-
80
-
81
- if json["result"]["list"] != nil {
82
-
83
- self.nextPrevId = json["result"]["prev_id"].int!
84
-
85
- json["result"]["list"].forEach { (_, json) in
86
-
87
- var messageData: [String: AnyObject?] = [:]
88
-
89
- messageData["id"] = String(json["id"].int!)
90
-
91
- messageData["data"] = json["data"].string!
92
-
93
-
94
-
95
- messageDataGroup.append(messageData)
96
-
97
- }
98
-
99
- }
100
-
101
- apiResponse(responseData: messageDataGroup)
63
+ apiResponse(responseData: number)
102
64
 
103
65
  }
104
66
 
@@ -110,34 +72,6 @@
110
72
 
111
73
 
112
74
 
113
- ###試したこと
114
-
115
- ```
116
-
117
- while nextPrevId != 0 {
118
-
119
- getMessageList(self, prevId: nextPrevId, count: 5, apiResponse: { response in
120
-
121
- for num in 0...response.count {
122
-
123
- self.messageList.append(response[num])
124
-
125
- }
126
-
127
- })
128
-
129
- }
130
-
131
- ```
132
-
133
-
134
-
135
- 上記のように`while`文でループさせようと思ったのですが、これだとデータによっては通信時間が異なるので
136
-
137
- データの順序がバラバラになるのではと考えました。
138
-
139
-
140
-
141
75
  ###補足情報(言語/FW/ツール等のバージョンなど)
142
76
 
143
77
  ・`Xcode7.3.1`