菜鸟教程小白 发表于 2022-12-12 11:24:16

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(@&#34;method 1&#34;);

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(@&#34;Data synced successfully to server&#34;);
            ;//updating db
            ;//api call


      } andFailureBlock:^(NSURLResponse *task, id resultObject, NSError *error) {
            NSLog(@&#34;Data syncing to cloud FAILED&#34;);
            ;//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(&#34;com.queue1&#34;, 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]
查看完整版本: ios - 如何在后台同步进行api调用?