gpt4 book ai didi

ios - Alamofire - 如何处理完成 block ?

转载 作者:行者123 更新时间:2023-11-28 08:29:11 25 4
gpt4 key购买 nike

我是 iOS 新手,想要使用 Alamofire。我想问以下问题:当所有项目(在我的例子中是用户)都已处理时如何调用一些完成 block 。完成 block 在延迟 block 中

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

我也不知道为什么。非常感谢任何帮助!提前致谢!

最佳答案

Alamofire.request 不在主队列上运行。它运行异步,尽管.responseJSON 默认返回主队列 以允许您更新用户界面。因此,您的输出不是您所期望的。

如果您希望它按顺序返回,您必须将您的请求包装在调度主队列中。

像这样:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(Double(0.2) * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {
// your code here.
})

关于ios - Alamofire - 如何处理完成 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39247519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com