【发布时间】:2017-06-09 09:08:01
【问题描述】:
我需要在我的 coredata 中同步 Web 数据库,为此我执行服务 api 调用。我正在使用Alamofire 和Swift 3。有 23 个 api 调用,在不同的 coredata 实体中提供了近 24k 行。
我的问题:这些 api 调用会阻塞 UI 一分钟,这对于用户来说是很长的等待时间。
我尝试使用DispatchQueue 并在后台线程中执行任务,但没有任何效果。我就是这样尝试的:
let dataQueue = DispatchQueue.init(label: "com.app.dataSyncQueue")
dataQueue.async {
DataSyncController().performStateSyncAPICall()
DataSyncController().performRegionSyncAPICall()
DataSyncController().performStateRegionSyncAPICall()
DataSyncController().performBuildingRegionSyncAPICall()
PriceSyncController().performBasicPriceSyncAPICall()
PriceSyncController().performHeightCostSyncAPICall()
// Apis which will be used in later screens are called in background
self.performSelector(inBackground: #selector(self.performBackgroundTask), with: nil)
}
来自 DataSyncController 的 API 调用:
func performStateSyncAPICall() -> Void {
DataSyncRequestManager.fetchStatesDataWithCompletionBlock {
success, response, error in
self.apiManager.didStatesApiComplete = true
}
}
DataSyncRequestManager 代码:
static func fetchStatesDataWithCompletionBlock(block:@escaping requestCompletionBlock) {
if appDelegate.isNetworkAvailable {
Util.setAPIStatus(key: kStateApiStatus, with: kInProgress)
DataSyncingInterface().performStateSyncingWith(request:DataSyncRequest().createStateSyncingRequest() , withCompletionBlock: block)
} else {
//TODO: show network failure error
}
}
数据同步接口代码:
func performStateSyncingWith(request:Request, withCompletionBlock block:@escaping requestCompletionBlock)
{
self.interfaceBlock = block
let apiurl = NetworkHttpClient.getBaseUrl() + request.urlPath!
Alamofire.request(apiurl, parameters: request.getParams(), encoding: URLEncoding.default).responseJSON { response in
guard response.result.isSuccess else {
block(false, "error", nil )
return
}
guard let responseValue = response.result.value else {
block (false, "error", nil)
return
}
block(true, responseValue, nil)
}
}
我知道 Stackoverflow 上已经发布了许多类似的问题,并且大多数情况下建议使用 GCD 或 Operation Queue,尽管尝试 DispatchQueues 对我没有用。
我做错了吗? 如何不阻止 UI 并同时执行 api 调用?
【问题讨论】:
-
更改 DatasyncController()。到 DatasyncController。
-
@Mozahler 如果您建议创建一个静态函数或一个用于调用函数的变量,它们都不会影响性能,尽管我会将这些函数设为静态函数。
-
是的,我试图提供帮助,因为我无法确定您调用的代码,但您没有向我们展示。
-
另外,我相信您只在队列中添加了一个工作单元。如果每个 performXXX() 将它们添加到队列中一次,它们可以同时处理。您正在寻找并发性。
-
@Mozahler 没找到你。能再解释一下吗?你是说要创建多个队列吗?
标签: ios swift multithreading asynchronous core-data