Ios 如何在同一线程上调度async进行串行处理
当客户端收到推送通知时,我会运行一些冗长的同步任务。如果两个通知到达得太快,我会在同步任务之间产生冲突,因为这两个任务都试图枚举coredata并对其进行更改 如何保留对队列的引用并将下一个同步任务分派到同一队列?对这个问题的回答,但我不擅长简单的C。谢谢Ios 如何在同一线程上调度async进行串行处理,ios,multithreading,core-data,queue,grand-central-dispatch,Ios,Multithreading,Core Data,Queue,Grand Central Dispatch,当客户端收到推送通知时,我会运行一些冗长的同步任务。如果两个通知到达得太快,我会在同步任务之间产生冲突,因为这两个任务都试图枚举coredata并对其进行更改 如何保留对队列的引用并将下一个同步任务分派到同一队列?对这个问题的回答,但我不擅长简单的C。谢谢 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { dispatch_que
- (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\u get\u global\u queue()
提供了一个并发调度队列。
如果需要串行队列,可以使用以下方法创建自己的队列:
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
并将其存储在应用程序委托的属性中
但是,如果这是为了进行核心数据操作,那么最好创建一个
NSPrivateQueueConcurrencyType的NSManagedObjectContext
,并使用其performBlock:
方法。dispatch\u get\u global\u queue()。
如果需要串行队列,可以使用以下方法创建自己的队列:
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
并将其存储在应用程序委托的属性中
但是,如果这是为了进行核心数据操作,那么最好创建一个
NSPrivateQueueConcurrencyType的NSManagedObjectContext
,并使用其performBlock:
方法。类可以像任何其他属性一样具有dispatch\u queue\t
属性
@property (readwrite, assign) dispatch_queue_t myQueue;
只需像分配任何其他属性值一样分配队列
self.myQueue = queue;
但是,您不希望在该代码中使用队列DISPATCH\u QUEUE\u PRIORITY\u DEFAULT
是一个全局队列,这意味着
- 您不需要将其保存在属性中,因为它始终存在(这就是为什么函数名中有“global”)
- 无论如何,您都不希望该队列用于您的目的,因为它是一个并发队列,所以不会序列化操作。这个队列非常适合并行运行多个操作,这正是您想要避免的
听起来您需要创建自己的串行队列。差不多
dispatch_queue_t queue = dispatch_queue_create("my queue", DISPATCH_QUEUE_SERIAL);
然后使用该队列而不是全局队列。完成后,请确保使用dispatch\u release
将其清理干净。类可以像任何其他属性一样具有dispatch\u queue\t
属性
@property (readwrite, assign) dispatch_queue_t myQueue;
只需像分配任何其他属性值一样分配队列
self.myQueue = queue;
但是,您不希望在该代码中使用队列DISPATCH\u QUEUE\u PRIORITY\u DEFAULT
是一个全局队列,这意味着
- 您不需要将其保存在属性中,因为它始终存在(这就是为什么函数名中有“global”)
- 无论如何,您都不希望该队列用于您的目的,因为它是一个并发队列,所以不会序列化操作。这个队列非常适合并行运行多个操作,这正是您想要避免的
听起来您需要创建自己的串行队列。差不多
dispatch_queue_t queue = dispatch_queue_create("my queue", DISPATCH_QUEUE_SERIAL);
然后使用该队列而不是全局队列。完成后,请确保使用新版本的ARC下不需要(也不允许)的dispatch\u release
dispatch\u release
将其清理干净;属性应该是强的。@JesseRusak同意,但从技术上讲,它不是“ARC版本”的函数或编译器的版本,而是取决于应用程序的部署目标。如果部署目标小于iOS 6.0(或者如果您使用-DOS\u OBJECT\u use\u OBJC=0
编译器标志),则需要调度\u发布
。我只针对iOS7,并且使用ARC。因此,我将相应地调整属性并跳过发布。感谢您的回答。感谢Jesse和Rob提供的详细信息。dispatch\u release
在新版本的ARC下不需要(也不允许);属性应该是强的。@JesseRusak同意,但从技术上讲,它不是“ARC版本”的函数或编译器的版本,而是取决于应用程序的部署目标。如果部署目标小于iOS 6.0(或者如果您使用-DOS\u OBJECT\u use\u OBJC=0
编译器标志),则需要调度\u发布
。我只针对iOS7,并且使用ARC。因此,我将相应地调整属性并跳过发布。谢谢你的回答,谢谢Jesse和Rob提供的细节。