私はiOSでかなり新しく、Alamofireを使いたいと思っています。私は次のように頼みたい:すべてのアイテム(私の場合はユーザ)がすでに処理されているときに完了ブロックを呼び出す方法。完了ブロックは延期ブロックであるアラモファイア - どのように完了ブロックを処理するには?
StopsHandler.swift
func requestStopsForUser(user: User, completion: (result: RequestResult, json: JSON?) -> Void) {
alamofireManager?.request(.GET, "\(AppSettings.ApiURL)/v1/users/\(user.id)/stops.json", headers: ["Authorization": "Token token=\(user.apiKey)"]).responseJSON { response in
switch response.result {
case .Success:
if let value = response.result.value {
completion(result: .Success, json: JSON(value))
}
case .Failure(let error):
if error.code == NSURLErrorTimedOut {
completion(result: .TimedOut, json: nil)
} else {
completion(result: .ConnectionFailed, json: nil)
}
}
}
}
Main.swift
func fetchUsersAndStops(completion: (result: RequestResult) -> Void) {
var allStopsToWrite = [[Stop]]() //for each user we have array of stops to write in model
requestAllUsers() { result, json in
switch result {
case .Success:
let users = self.usersFromJSON(json)
for (i, user) in users.enumerate() {
StopsHandler.sharedInstance.requestStopsForUser(user) { result, json in
print("i in = \(i)")
switch result {
case .Success:
defer {
let isLastUser = (i == users.count - 1)
if isLastUser {
try! self.realm.write(transactionBlock: {
for (index, stopsToWrite) in allStopsToWrite.enumerate() {
users[index].stops.appendContentsOf(stopsToWrite)
self.realm.add(users[index], update: true)
}},
completion: {
completion(result: .Success) //I want to call this completion when last user is already handled.
})
}
}
guard let json = json else {return}
let stops = StopsHandler.sharedInstance.stopsFromJSON(json)
let globalStops = self.realm.objects(Stop)
var stopsToWrite = [Stop]()
for stop in stops {
if globalStops.filter("id = '\(stop.id)'").first == nil {
stopsToWrite.append(stop)
if let currentUserId = self.currentUser?.id {
if currentUserId == user.id {
user.loggedIn = true
}
}
}
}
allStopsToWrite.append(stopsToWrite)
case .TimedOut:
completion(result: .TimedOut)
case .ConnectionFailed:
completion(result: .ConnectionFailed)
}
}
}
case .TimedOut:
completion(result: .TimedOut)
case .ConnectionFailed:
completion(result: .ConnectionFailed)
}
}
}
私は私のコードはmain_queue
に実行されることを想定して、私は(次のような出力をしたいですサーバーに4人のユーザーがいる):
i in = 0
i in = 1
i in = 2
i in = 3
しかし、突然、私は次のようしている:
i in = 3
i in = 1
i in = 2
i in = 0
そして、私は理由を知りません。どんな助けも大いにありがとう!前もって感謝します!
あなたは4人のユーザーを持っているので、4回のリクエストを呼び出して、4人のユーザーをすべて取得した後で何かしたいのですか?私はすべてのユーザーを処理した後に何かしたいと思うよ、 – Tj3n
@ Tj3nはいああああああああああああああ –
あなたはあらかじめリクエスト数を持っていますか?あなたはそれを4回呼ぶ必要があるのを知っていますか? – Tj3n