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

标签 ios swift alamofire

所以我有一个返回主题列表的函数,该列表应该通过 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/

相关文章:

ios - 处理 Response JSON 数据结构的最佳方法?

ios - 一个 iOS(或 OS X)项目依赖于一个框架的两个版本

xcode - Xcode 4.2 beta 是否也带有 iOS SDK 4?

ios - 如何根据用户id存储上传的图片

ios - SwiftUI 图像剪辑到边界

swift - 在 swift 3 中使用 UIViewControllerAnimatedTransitioning 时遇到问题

ios - 将 Swift 委托(delegate)分配给 Objective-C 对象时出错

ios - 从嵌套 json 数组获取数据时出现问题

ios - 'InboxTableViewController' 与协议(protocol) 'UITableViewDataSource' 的冗余一致性

ios - 将开发者添加到 Apple 开发者帐户