后台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调用不冻结用户界面的主要内容,如果未能解决你的问题,请参考以下文章
CLLocationManager 从后台状态返回时冻结我的应用程序?