我有两个类。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/