【问题标题】:CLLocationManager and serial location updates processingCLLocationManager 和串行位置更新处理
【发布时间】:2023-11-07 10:39:01
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: ios grand-central-dispatch cllocationmanager nsthread nsoperationqueue


    【解决方案1】:

    如果您不希望内容在后台同时运行,那么您需要一个串行队列。创建串行 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 中似乎不鼓励使用线程,我不知道如何在没有信号量的情况下处理它。
    • 我的位置更新触发了一个方法,该方法在其主体中又调用另一个方法,依此类推。这种调用操作/调度队列的方式是否确保第一个位置的整个处理将在处理下一个位置之前完成?
    • @AppsDev 它将,如果这些方法都同步运行(默认情况下,它们会同步运行)。但是您的问题暗示了一些可能需要异步操作的可能性。例如,您使用的是CLGeocoder?您使用的是NSULRConnection(除非您使用的是sendSynchronousRequest)?等等。这些是异步操作的一些示例(即,需要很长时间以至于 Apple 好心提供异步操作的事情,这就是其中的一种,但只是给我们上面的解决方案增加了一个皱纹。)你必须看看你计划的代码打电话时。
    • 如果您正在处理的方法 (a) 提供完成块;或 (b) 涉及使用委托协议,那么您可能正在处理异步方法。
    • 谢谢!操作队列和调度队列有什么区别?选择其中一种技术时我应该考虑什么?
    最近更新 更多