我需要使用标准位置服务并执行一些处理,包括一些网络调用,通知每个位置更新。我需要按 FIFO 顺序处理位置更新,以跟踪设备并尽快获得结果。确保按顺序处理位置并且处理不重叠(以及获得快速响应)的最佳方式或技术应该是什么:操作队列,调度队列或直接线程(或者甚至是另一种方式,如果存在) ? 看起来操作队列和调度队列在性能方面几乎相同,但调度队列似乎更容易处理,所以我不知道它们各自的优点是什么。关于线程,我一直不鼓励通常使用它们,但我不'
提前致谢
我需要使用标准位置服务并执行一些处理,包括一些网络调用,通知每个位置更新。我需要按 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];
正在进行的操作将首先完成(除非您输入代码来测试它是否被取消),但是在您根据最新位置发起新请求之前,可以轻松取消尚未开始的挂起操作。这仅取决于您是否真的希望串行处理所有位置请求,或者您是否只想完成正在进行的请求,清除其他请求,然后根据新位置排队执行新操作。这仅取决于您的应用程序需要什么,但通常您只关心当前位置。这可以确保您的队列不会太积压。