我需要在我的coredata中同步Web數據庫,爲此我執行服務api調用。我正在使用Alamofire
和Swift 3
。有23個API調用,在不同的coredata實體中提供近24k行。API調用塊UI線程Swift
我的問題:這些api調用阻止用戶界面一分鐘,這是用戶等待很長時間。
我嘗試使用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
}
}
DataSyncingInterface代碼:
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
@Mozahler如果你建議創建一個靜態函數或調用函數的變量,它們都不會影響性能,但我會將這些函數設置爲靜態函數。 – Priyal
是的,我試圖提供幫助,因爲我無法確定您撥打的代碼,但您沒有向我們顯示。 – Mozahler