后台api调用不冻结用户界面

Posted

技术标签:

【中文标题】后台api调用不冻结用户界面【英文标题】:Background api call without freezing user interface 【发布时间】:2017-10-13 09:58:42 【问题描述】:

我想在后台以 10 分钟的时间间隔连续调用一个 api,而不会中断用户界面和同一应用内的其他 api 调用。

就像 api 每 10 分钟会在后端数据库中永久更新我的位置一样,但这个 api 不会中断 UI 和另一个在我使用应用程序时会被调用的 api。

【问题讨论】:

使用后台线程或 GCD 或 NSOperationQueue,但您的初学者最好阅读有关这些的任何教程。 已经有很多话题了,发帖前请谷歌(搜索相同的查询)。 Managing asynchronous calls to web API in ios的可能重复 我希望在不中断其他 api 和用户界面调用的情况下调用 api(从应用程序启动后每 10 分钟调用一次)。不像进入后台然后回来更新 api,我希望该 api 一直在后台被调用,直到我关闭应用程序。 【参考方案1】:

您应该在不同的线程中运行代码(在 iOS 中称为队列)。 如果您阅读文档会更好。这里我可以给你看一个例子,这里我在后台下载一张图片然后上传 UI:

 if let url = imageURL
            DispatchQueue.global(qos: .userInitiated).async  [weak self] in  //background queue
                let urlContents = try? Data(contentsOf: url)
                if let imageData = urlContents
                    DispatchQueue.main.async           //come back to the UI Queue to upload the UI
                        self?.image = UIImage(data: imageData)
                    

                
            
        

要了解每个参数和每种可能性,请查看文档。

【讨论】:

我不希望任何关于 api 调用的 UI 更新,此 api 将每 10 分钟调用一次以更新后端数据库中的某些内容,并且其他一些 api 也会像往常一样被调用当我使用应用程序功能时。 Le Global 队列在后台。您创建它并将您的代码放在那里。如果您不需要 UI 更新,则不必调用 DispatchQueue.main,但逻辑是相同的。【参考方案2】:

您可以像递归方法一样编写代码来解决您的问题。下面有一个用Objective-c编码的解决方案

- (void)myRepetitiveMethod 

   dispatch_queue_t q_background = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
                                               double delayInSeconds = 600;
                                               dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
                                               dispatch_after(popTime, q_background, ^(void)
//do something                                                   
[self myRepetitiveMethod];
                                               );

祝你好运

【讨论】:

以上是关于后台api调用不冻结用户界面的主要内容,如果未能解决你的问题,请参考以下文章

VUE使用axios调用后台API接口

CLLocationManager 从后台状态返回时冻结我的应用程序?

即使App被IOS中的用户杀死,如何每10秒调用一次api?

为啥我的 UI 会冻结,直到 api 调用终止?

使用 axios 调用 API 时如何防止 UI 冻结

在angularjs的后台定期调用服务器上的函数