Cocoa NSOperationQueue WaitUntillalloOperations已完成的块操作

Cocoa NSOperationQueue WaitUntillalloOperations已完成的块操作,cocoa,nsthread,nsoperation,nsoperationqueue,Cocoa,Nsthread,Nsoperation,Nsoperationqueue,我已经创建了自己的NSOperation子类,现在我希望它的一些实例能够并行运行。因为这是一个并发操作,我已经覆盖了 - (void)start { [self willChangeValueForKey:@"isExecuting"]; isExecuting = YES; [self didChangeValueForKey:@"isExecuting"]; error=NO; startedSection=NO; // start the

我已经创建了自己的NSOperation子类,现在我希望它的一些实例能够并行运行。因为这是一个并发操作,我已经覆盖了

- (void)start {
    [self willChangeValueForKey:@"isExecuting"];
    isExecuting = YES;
    [self didChangeValueForKey:@"isExecuting"];

    error=NO;
    startedSection=NO;

    // start the task
    [task launch];
}

- (BOOL)isConcurrent {
    return YES;
}

- (BOOL)isExecuting {
    return isExecuting;
}

- (BOOL)isFinished {
    return isFinished;
}
当操作完成时,执行以下代码:

[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
isExecuting = NO;
isFinished = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];

在将操作添加到
myQueue
之后添加
[myQueue waituntillallooperations完成]
时,没有任何操作会启动!当我删除
[myQueue WaitUntillallOperationsRefiefined]
时,我得到了我想要的,除了这样一个事实,即由于主线程干扰了这些操作,这可能会导致一些错误…

操作的并发性是如何实现的?我怀疑您正在将内容分派到主线程,并且还在
-waituntillallooperations完成中阻塞主线程。当然,这会导致死锁。

实际上我没有实现任何东西。。。该操作不应该在与主线程不同的新线程上运行吗?您重写了
-isConcurrent
以返回
YES
。这意味着您要同时负责运行它。只有当你有特殊要求时,你才应该这样做。这个术语有些混乱。更多地将其视为并发==异步,非并发==同步。“简单”的方法是将操作保持为非并发/同步。在这种情况下,操作队列将安排在队列管理的线程上调用操作。该操作将与其他操作同时运行,但从队列的角度来看是同步的。问题是,我的操作正在运行一个NSTask,该NSTask异步运行以获取其输出…那么,为什么您说您没有实现任何东西?无论如何,请显示您的
-start
方法。另外,最好将
+[NSThread isMainThread]
和/或
+[NSThread currentThread]
中的值记录在它和等待的线程中。我怀疑队列正在您排队的线程上启动操作。这意味着
NSTask
依赖于该线程的运行循环。如果您在
-waituntillallooperations完成时阻塞该线程,则会阻止接收任务终止通知和后台读取输出。我只是做了一些日志记录。。。我从中执行
-waitUntillallOperationsDefined
的线程的地址与操作本身的线程的地址不同,操作本身不在主线程中运行(
[NSThread isMainThread]
返回false)。