我有四个 api 调用要做。它们应按以下顺序排列:
apiSyncDataToCloud;
apiSyncImagesToServer;
apiDeleteDataFromCloud;
apiSyncDataFromCloudInBackground;
无论前一个是成功还是失败,都将调用它们中的每一个。
此外,它们每个都有成功和失败完成 block 。
成功完成 block 数据库更新。
所有这些过程都必须在后台中执行,并且必须完成 没有次数。
Api 调用当然是在后台执行的,但是一旦调用完成,就会在主线程上执行数据库更新,从而卡住应用程序。
所以,我采用了几种解决方案:
尝试了以下代码:
NSOperationQueue *queue = [NSOperationQueue new];
queue.maxConcurrentOperationCount = 1;
[queue addOperationWithBlock:^{
[self apiSyncDataToCloud];
}];
[queue addOperationWithBlock:^{
[self apiSyncImages];
}];
[queue addOperationWithBlock:^{
[self apiDeleteDataFromCloud];
}];
[queue addOperationWithBlock:^{
[self apiSyncDataFromCloudInBackground];
}];
但这只能保证api方法调用会按顺序执行。但他们的结果没有特定的顺序。也就是说,方法调用将按照指定的顺序进行,但 apiSyncImagesToServer 的成功 block 可能会在 apiSyncDataToCloud 的成功 block 之前被调用。
然后我采用了以下解决方案:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self apiSyncDataToCloud];
});
在 apiSyncDataToCloud 的成功和失败 block 中,我调用了 apiSyncImagesToServer。这也没有用。
现在我只是使用我的最后一个解决方案。我只是在调用 apiSyncDataToCloud。
在成功完成 block 中,该方法首先更新数据库,然后调用其他api。
在失败完成 block 中,此方法只是简单地进行 api 调用而不更新数据库。
例如-
apiSyncDataToCloud 结构如下:
-(void)apiSyncDataToCloud{
NSLog(@"method 1");
NSMutableDictionary *dicDataToBeSynced = [NSMutableDictionary dictionary];
dicDataToBeSynced = [self getDataToBeSynced];
if (dicDataToBeSynced.count!=0) {
if ([[StaticHelper sharedObject] isInternetConnected]) {
[[ApiHandler sharedObject] postRequestWithJsonString:API_SYNC_DATA_TO_CLOUD andHeader:[UserDefaults objectForKey:kAuthToken] forHeaderField:kAccessToken andParameters:dicDataToBeSynced WithSuccessBlock:^(NSURLResponse *response, id resultObject, NSError *error) {
NSLog(@"Data synced successfully to server");
[self updateColumnZSYNC_FLAGForAllTables];//updating db
[self apiSyncImagesToServer];//api call
} andFailureBlock:^(NSURLResponse *task, id resultObject, NSError *error) {
NSLog(@"Data syncing to cloud FAILED");
[self apiSyncImagesToServer];//simply make api call without updating db
}];
}
}else{
[self apiSyncImagesToServer];make api call even if no data to be synced found
}
}
类似,在 apiSyncImagesToServer 内部我调用 apiDeleteDataFromCloud.....
因此,我的问题仍然存在。成功阻止更新数据库,下载图像...所有操作都在主线程上执行时,应用程序卡住。
请告诉我一个更清洁、更好的解决方案。
Best Answer-推荐答案 strong>
您可以一一创建自己的自定义队列和调用请求。
即
dispatch_queue_t myQueue;//declare own queue
if (!myQueue) {//check if queue not exists
myQueue = dispatch_queue_create("com.queue1", NULL); //create queue
}
dispatch_async(myQueue, ^{[self YOUR_METHOD_NAME];});//call your method in queue block
如果您想在接收到数据后更新一些 UI,请在主线程上更新 UI。
关于ios - 如何在后台同步进行api调用?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/37405732/
|