サービスAPIコールを実行する私のコアデータにWebデータベースを同期する必要があります。私はとAlamofire
を使用しています。 23のapi呼び出しがあり、異なるcoredataエンティティにほぼ24k行を与えます。API呼び出しブロックUIスレッドSwift
私の問題点:これらのAPIは、ユーザーが待機するのに長い時間ですが、1分間ブロック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
}
}
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または操作キューを使用することをお勧めしますが、DispatchQueues
は私にとってはうまくいきませんでした。
何か間違っていますか? UIをブロックしてapi呼び出しを同時に実行できないのはなぜですか?
DatasyncController()を変更します。 DatasyncControllerに送信します。 – Mozahler
@Mozahler静的関数を作成することを提案している場合や、関数を呼び出すための変数には影響がありませんが、静的関数として関数を作成します。 – Priyal
はい私はあなたが電話しているコードについてはわからないが、私たちには表示しなかったので、助けになることを試みていた。 – Mozahler