菜鸟教程小白 发表于 2022-12-13 15:51:29

ios - 移动到后台后保持调度队列运行 5 秒


                                            <p><p>当用户将应用程序移至后台时,我正在使用串行调度队列来序列化一些网络请求。 </p>

<pre><code>- (void)applicationDidEnterBackground:(UIApplication *)application
{
    dispatch_queue_t opQ = dispatch_queue_create(&#34;com.myapp.network&#34;, NULL);
    dispatch_async(opQ, ^{
      ;
      ;
      ;
    });
}
</code></pre>

<p>问题是,当它们在我创建的这个队列上运行时,应用程序即使在它应该保持的 5 秒内也不会保持事件状态。 </p>

<p>相反,当我在队列外发送相同的请求时,它们的发送时间大约为 8 秒。但应用程序随后崩溃。 </p>

<pre><code>- (void)applicationDidEnterBackground:(UIApplication *)application
{
      ;
      ;
      ;
}
</code></pre>

<p>我还想把剩下的写到磁盘上,以便下次用户打开应用时发送。 </p>

<p>实现这一点的最佳方法是什么? </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>当应用程序进入后台时,如果它需要额外的时间来完成某些任务,您需要通知操作系统。详细文档在这里:<a href="http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html" rel="noreferrer noopener nofollow">http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html</a> .这是一个快速而肮脏的补丁。</p>

<pre><code>- (void)applicationDidEnterBackground:(UIApplication *)application
{
   __block UIBackgroundTaskIdentifier backgroundTask; //Create a task object

    backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^ {
      ;
      backgroundTask = UIBackgroundTaskInvalid; //Set the task to be invalid
   }];

    dispatch_queue_t opQ = dispatch_queue_create(&#34;com.myapp.network&#34;, NULL);
    dispatch_async(opQ, ^{
      ;
      ;
      ;
      ;
      backgroundTask = UIBackgroundTaskInvalid; //Set the task to be invalid
    });
}
</code></pre>

<p>底线是您通知应用程序需要在后台运行 beginBackgroundTaskWithExpirationHandler: 然后当您完成后调用 endBackgroundTask: 通知操作系统您已完成后台处理。最后确保将 backgroundTask 变量重置为 UIBackgroundTaskInvalid。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 移动到后台后保持调度队列运行 5 秒,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12145627/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12145627/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 移动到后台后保持调度队列运行 5 秒