gpt4 book ai didi

ios - 如何在同一线程上调度异步以进行串行处理

转载 作者:行者123 更新时间:2023-12-01 17:31:26 24 4
gpt4 key购买 nike

当客户端收到推送通知时,我会运行一些冗长的同步任务。如果 2 个通知到达太快,我会在同步任务之间发生冲突,因为两者都尝试枚举和更改 coredata。

如何保留对队列的引用并将下一个同步任务分派(dispatch)到同一个队列?为这个问题道歉,但我不擅长纯 C。谢谢。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// I would need to keep reference to 'queue' so I can dispatch to it again with next push notification

dispatch_async(queue, ^{

[self.connection synchronizeWithLocal];

dispatch_async(dispatch_get_main_queue(), ^{
// make UI updates
});
});
}

最佳答案

一个类可以有 dispatch_queue_t属性(property)就像任何其他属性(property)一样。

@property (readwrite, assign) dispatch_queue_t myQueue;

只需像分配任何其他属性值一样分配队列。
self.myQueue = queue;

但是,您不希望在该代码中使用该队列。 DISPATCH_QUEUE_PRIORITY_DEFAULT是一个全局队列,这意味着
  • 您不需要将其保存在属性中,因为它始终存在(这就是函数名称中包含“全局”的原因)。
  • 无论如何,您都不希望该队列用于您的目的,因为它是一个并发队列,因此它不会序列化操作。该队列非常适合并行运行多个操作,这正是您想要避免的。

  • 听起来您需要创建自己的串行队列。就像是
    dispatch_queue_t queue = dispatch_queue_create("my queue", DISPATCH_QUEUE_SERIAL);

    然后使用该队列而不是全局队列。完成后,请务必使用 dispatch_release 进行清理。 .

    关于ios - 如何在同一线程上调度异步以进行串行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20598650/

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