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