gpt4 book ai didi

ios - CLLocationManager 和串行位置更新处理

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:44:50 25 4
gpt4 key购买 nike

我需要使用标准位置服务并执行一些处理,包括一些网络调用,每次位置更新都会收到通知。我需要以 FIFO 顺序处理位置更新,以保持对设备的跟踪,并尽快获得结果。确保按顺序处理位置并且处理不重叠(并且除了获得快速响应之外)的最佳方法或技术应该是什么:操作队列,调度队列或直接线程(或者甚至是其他方式,如果存在) ?看起来操作队列和调度队列在性能方面几乎相同,但是调度队列似乎更容易处理,所以我不知道它们各自的优点是什么。关于线程,我一直不鼓励经常使用它们,但我不知道它们相对于操作/调度队列的效率是否真的很明显,是否值得使用它们。

提前致谢

最佳答案

如果你不想让东西在后台同时运行,那么你需要一个串行队列。创建串行 GCD 队列:

dispatch_queue_t queue = dispatch_queue_create("com.appsdev.project1", 0);

每次您想向该队列添加内容时,只需:

dispatch_async(queue, ^{
// do your background stuff

dispatch_async(dispatch_get_main_queue(), ^{
// update the UI
});
});

如果你想使用NSOperationQueue,其实很简单:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1;

并向该串行队列添加操作:

[queue addOperationWithBlock:^{
// do your stuff

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// update the UI
}];
}];

在回答您的 NSThread 问题时,根据您的描述,我认为没有必要这样做。当然没有明显的性能问题。

顺便问一下,您添加到调度/操作队列中的内容是否保证同步操作(即您没有进行地理编码或类似的操作,它们本身是异步操作的,是吗?)?如果它异步运行,则必须格外小心。


顺便说一句,如果你只关心最近的位置,使用操作队列,你也有机会通过调用取消尚未开始的其他操作:

[queue cancelAllOperations];

正在进行的操作将首先完成(除非您放入代码来测试它是否被取消),但是在您根据最新位置发起新请求之前,可以很容易地取消尚未开始的挂起操作。这仅取决于您是否真的想要串行处理所有位置请求,或者您是否只想完成正在进行的请求,清除其他请求,然后根据新位置对新操作进行排队.这仅取决于您的应用程序需要什么,但通常您只关心当前位置。这可以确保您的队列不会积压太多。

关于ios - CLLocationManager 和串行位置更新处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15044448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com