gpt4 book ai didi

ios - 我如何确定我的 Alamofire 请求的优先级,以便它们在函数返回之前执行?

转载 作者:搜寻专家 更新时间:2023-11-01 07:22:16 25 4
gpt4 key购买 nike

所以我有一个返回主题列表的函数,该列表应该通过 api 返回,但响应闭包仅在函数返回后执行。

我的代码:

    func getSectionsList (syllabus_ID: String) -> [String:String] {

var sectionDictionary = [String:String]()
var errorString: String!
let token = Keychain.value(forKey: "Auth_Token")! as String
manager.request(.GET, "\(BASE_URL)/syllabi/\(syllabus_ID)/sections?token=\(token)", encoding:.JSON).validate()
.responseJSON { response in
switch response.result {
case .Success:

let responseJSON = JSON(response.result.value!)
sectionDictionary = self.serializeJSON(responseJSON)

break
case .Failure(let error):
NSLog("Error result: \(error)")
errorString = "\(error)"
return
}
}
return sectionDictionary
}

我试过像这样使用完成处理程序:

func getSectionsList (syllabus_ID: String, completionHandler: ([String:String], String?)->()) {

var sectionDictionary = [String:String]()
var errorString: String!
let token = Keychain.value(forKey: "Auth_Token")! as String
manager.request(.GET, "\(BASE_URL)/syllabi/\(syllabus_ID)/sections?token=\(token)", encoding:.JSON).validate()
.responseJSON { response in
switch response.result {
case .Success:

let responseJSON = JSON(response.result.value!)
sectionDictionary = self.serializeJSON(responseJSON)

break
case .Failure(let error):
NSLog("Error result: \(error)")
errorString = "\(error)"
return
}
completionHandler(sectionDictionary, errorString)
}
}

然后这样调用它:

var dictionary = [String:String]()

api.getSectionsList("1"){
(dict, error)in
if dict.count != 0{
dictionary = dict
}
}

所以现在它确实返回了值,但感觉一定有更简单的方法吗?难道不可能有一个函数只返回我想要的值而不必像我那样实现它吗?

最佳答案

不,闭包(完成处理程序)方法一针见血。

Alamofire 函数 .responseJSON() 异步返回给您,您还必须通过闭包完成处理程序模式异步返回。

闭包内的任何返回都是闭包本身的返回,而不是闭包周围的范围。

您已将闭包类型定义为,

([String:String], String?)->()

AKA,为了更好地说明我的观点,与此相同,

[String:String], String?)->Void

这意味着你的闭包无论如何都不想要返回值(因此是 Void),如果你试图这样做,我希望编译器会提示。

您使用得越多,您就会习惯这种async 闭包模式。

如果你真的想要从你的函数中返回一个值,我认为你可以使用同步请求使用 Alamofire 来完成它,尽管我从来没有这样做过,而且我没有看到锁定执行周期的原因,为什么你等待相对较慢的任务完成。

另一件需要注意的事情是你的闭包最初被调用的线程。如果我没记错的话,我相信 .responseJSON() 将始终在后台线程上返回。因此,假设您想在该请求返回后更新您的 UI,如果它不在主线程上,您最终会遇到问题。一个快速测试会告诉你,

if NSThread.mainThread() == NSThread.currentThread() {
print("ON MAIN THREAD")
} else {
print("NOT ON MAIN THREAD")
}

为了确保它在 main 上用 GCD 做这样的事情,

dispatch_async(dispatch_get_main_queue(),{
completionHandler(sectionDictionary, errorString)
}

关于ios - 我如何确定我的 Alamofire 请求的优先级,以便它们在函数返回之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38208054/

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