Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Objective c 目标C-在队列中串行执行异步操作_Objective C_Multithreading_Asynchronous - Fatal编程技术网

Objective c 目标C-在队列中串行执行异步操作

Objective c 目标C-在队列中串行执行异步操作,objective-c,multithreading,asynchronous,Objective C,Multithreading,Asynchronous,目前,我已经实现了一个类,它包装了一个NSOperationQueue并保存了一个指向上一个操作的指针。每次我向队列中添加另一个操作时,我都会将上一个操作作为依赖项添加,因为这些操作正在写入同一个文件(调用应该按顺序执行,我只需要从主线程中删除这些操作)。当前的实现看起来像这样 @interface FileStoreOperationQueue : NSOperationQueue -(void)createPayloadOperation(NSString* payload); @pro

目前,我已经实现了一个类,它包装了一个NSOperationQueue并保存了一个指向上一个操作的指针。每次我向队列中添加另一个操作时,我都会将上一个操作作为依赖项添加,因为这些操作正在写入同一个文件(调用应该按顺序执行,我只需要从主线程中删除这些操作)。当前的实现看起来像这样

@interface FileStoreOperationQueue : NSOperationQueue

-(void)createPayloadOperation(NSString* payload);

@property(nonatomic, weak) FileStoreOperation* previousOperation;

@end


@implementation FileStoreOperationQueue

-(void)createPayloadOperation(NSString* payload){
    // Create a new FileStoreOperation

    // Add the 'previousOperation' as a dependency 

    // Add new operation to self

    // previous operation = newOperation
}

@end

这让人感觉有点不舒服,有没有更自然、更干净的API方法来实现这一点?

您可以将队列的并发操作数设置为1,从而有效地使队列成为串行队列。文档警告说,您不应该依赖于按顺序执行的操作,因为操作准备就绪的变化可能会改变执行顺序,但如果您的所有操作都准备好执行,您应该不会有问题

请参见“其他操作队列行为”一节

另一种选择是降低级别并使用Grand Central Dispatch的串行队列,而不是
NSOperationQueue
。这将要求您将操作转换为块,但您可以将块一次一个地按顺序执行

最后,您可以创建自己的
NSOperationQueue
子类,自动使每个新操作依赖于前一个操作。这与您现在使用的解决方案相同,只是队列可以跟踪上一个操作并添加依赖项,因此它应该感觉更干净,不太“黑客化”。

来自:

依赖关系是以特定方式执行操作的一种方便方法 秩序。可以使用添加和删除操作的依赖项 addDependency:和removeDependency:方法。默认情况下,一个操作 具有依赖项的对象在其所有 从属操作对象已完成执行。最后一次 从属操作完成后,操作对象将变为 准备好并能够执行


您的任务是异步的还是同步的?这非常重要,因为在第二种情况下(同步任务),有一个非常简单直接的解决方案。但是,如果任务本质上是异步的,那么解决方案就会变得更加复杂。但是,使用NSOperationQueues和NSOperations的解决方案是最复杂的。;)你让它工作了吗?我在找类似的东西。
[operation addDependency: previousOperation];