ios - 在 swift 3 中调用 mutlile API 时出现问题?

标签 ios swift api alamofire

我有两个类。A 类和 B 类。在 A 类中有表格 View 。当我点击 A 类中的单元格时,我调用第一个 api 来保存数据 /saveData & 响应第一个 API 我调用另一个 API getData。我在后台调用这些 API。现在当我转到 A 类时,我在 viewDidLoad() 上调用另一个 API。我称之为在前台。现在我希望 A 类的 API 不应该影响 B 类。

请说出最好的方法是什么。

我试过 DispatchGroup 但对我不起作用。

    func saveInBackground(parameter : [String : AnyObject]?) -> Void {

        let group = DispatchGroup()
        group.notify(queue: DispatchQueue.global(qos: .background)){

            let apiManager = APIHandler(baseURL: Constants.API.baseURL, APIVersion: "")

            apiManager.requestOfBgMethod(.post, path: Constants.API.Name.addGeneralField.completePath, parameters: parameter, encoding: .url, headers: nil, apiSuccess: { (result) in
                //update user
                self.copyUser = User(copyFrom: self.user)
                self.saveCVResponse(result: result)
                //fetch data in background
                Utility.sharedInstance.updateCVdata(cvManager: self.cvManager)
            }, apiFailure: { (error) in

            })
        }

//        DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async {
//            
//
//        }
    }

最佳答案

使用DispatchSemaphore和一个Singleton实例来逐一调用API:

class ApiHelper {
    static let shardInstance = ApiHelper()
    private let semaphore = DispatchSemaphore(value: 1) //one task allowed at a time
    private let apiManager = APIHandler(baseURL: Constants.API.baseURL, APIVersion: "")

    func saveInBackground(parameter : [String : AnyObject]?) -> Void {
        DispatchQueue.global(qos: .default).async { [unowned self] in
            self.semaphore.wait() //lock

            apiManager.requestOfBgMethod(.post, path: Constants.API.Name.addGeneralField.completePath, parameters: parameter, encoding: .url, headers: nil, apiSuccess: { (result) in
                //.......
                self.semaphore.signal()  //unlock
            }, apiFailure: { (error) in
                self.semaphore.signal()  //unlock
            })
        }
    }
}

在A类和B类使用,互不影响:

ApiHelper.shardInstance.saveInBackground(parameter: nil) 

关于ios - 在 swift 3 中调用 mutlile API 时出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46067291/

相关文章:

javascript - Facebook 是如何构建这个支持 iOS 的固定滚动框的?

ios - 在 iOS 中使用核心数据时,如何为分段 TableView 构建sections数组?

arrays - 在数组中找到可重复的字符串位置

ios - 无法使用阿拉伯名称注册用户

ios - UIScrollView 的右 anchor 不适用

ios - 我们能得到所有 Storyboard View 的数组吗

javascript - 如何通过 jQuery AJAX 从使用 OAuth 1.0 身份验证的 Upwork API 请求 JSONP 文件?

api - REST API 模式的替代方案

java - 具体类中的 protected 构造函数与抽象类中的公共(public)构造函数

ios - MKPolylineView initWithPolyLine : is deprecated in iOS 7