Ich bin ziemlich neu in iOS und will und Verwendung von Alamofire. Ich möchte folgende Fragen stellen: Wie man einen Abschlussblock aufruft, wenn alle Elemente (in meinem Fall Benutzer) bereits behandelt werden. Completion-Block ist in defer BlockAlamofire - Wie geht man mit Fertigstellungsblöcken um?
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)
}
}
}
Ich gehe davon aus, dass mein Code läuft in main_queue
und ich mag die Ausgabe des folgenden (Ich habe 4 Benutzer auf dem Server):
i in = 0
i in = 1
i in = 2
i in = 3
Aber plötzlich habe ich folgendes:
i in = 3
i in = 1
i in = 2
i in = 0
Und ich weiß nicht, warum. Jede Hilfe wird massiv geschätzt! Danke im Voraus!
Sie haben 4 Benutzer, also rufen Sie die Anfrage 4 Mal, und Sie möchten etwas tun, nachdem Sie alle 4 Benutzer abgerufen, das ist Ihre Frage? Ziemlich unklar, was Sie wirklich fragen wollen – Tj3n
@ Tj3n ja, das richtige ich möchte etwas tun, nachdem ich alle Benutzer verarbeitet –
haben Sie die Anzahl der Anfrage im Voraus? wie du weißt, dass du es 4 mal anrufen musst? – Tj3n