Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在同一线程上调度async进行串行处理_Ios_Multithreading_Core Data_Queue_Grand Central Dispatch - Fatal编程技术网

Ios 如何在同一线程上调度async进行串行处理

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

当客户端收到推送通知时,我会运行一些冗长的同步任务。如果两个通知到达得太快,我会在同步任务之间产生冲突,因为这两个任务都试图枚举coredata并对其进行更改

如何保留对队列的引用并将下一个同步任务分派到同一队列?对这个问题的回答,但我不擅长简单的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\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提供的细节。