并发NSOperation和如何设置已完成并正在执行?

我正在尝试使用NSOperations分离我的程序stream程。 我正在使用Parse框架来制作一个简单的消息应用程序。 我想显示一些消息,然后删除它们。 显示消息不应该被调用,除非删除操作完成,所以我想尝试使用NSQueue,并添加一个displayMessages操作,然后deleteMessages操作(下面的名为MyOperation)。 我知道并发操作意味着它们只能以一种接一个的队列方式执行。 以下是我的代码为删除方法。 有没有办法手动告诉操作完成,即设置isFinished或isExecuting?

// MyOperation.h @interface MyOperation : NSOperation { @property (strong, nonatomic) NSMutableArray *toDelete; } @end And the implementation: // MyOperation.m @implementation MyOperation - (id)initWithArray:(NSMutableArray *)array { self = [super init]; if (self == nil) return nil; _toDelete=array; } - (void)main { if ([self isCancelled]) { NSLog(@"** operation cancelled **"); } //how do I get main to finish execution ONLY after deleteAllInBackground has finished? [PFObject deleteAllInBackground:self.toDelete]; if ([self isCancelled]) { NSLog(@"** operation cancelled **"); } NSLog(@"Operation finished"); } @end 

上面的代码现在不能解决我的问题。 它会排队操作,但是即使deleteAllInBackground仍在运行,这个操作仍然会结束。 真的很感谢这里的一些帮助! 谢谢


其他可能的解决方

 -(void)receivedMessage { NSLog(@"push!"); dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ [self displayMessages]; dispatch_async(dispatch_get_main_queue(), ^(void){ if([self.toDelete count]>0) { [PFObject deleteAllInBackground:self.toDelete]; } }); }); } 

我build议你使用dispatch_async像下面一样;

 dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ dispatch_async(dispatch_get_main_queue(), ^(void){ // Display messages }); // Delete messages here }); 

如果您必须使用NSOperationQueue那么我会build议您使用KVO来获取任务完成的通知; 当您设置您的队列时,请执行以下操作:

 [self.deleteQueue addObserver:self forKeyPath:@"delete-operations" options:0 context:NULL]; 

然后在您的observeValueForKeyPath执行此observeValueForKeyPath

 - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == self.deleteQueue && [keyPath isEqualToString:@"delete-operations"]) { if ([self.queue.operations count] == 0) { // Delete operation done // Display messages here } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } 

[编辑]

 -(void)receivedMessage { @synchronized(self) { NSLog(@"push!"); dispatch_async(dispatch_get_main_queue(), ^(void) { [self displayMessages]; dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { if([self.toDelete count]>0) { // this deletion doesn't matter if background or on main thread as it's already in background queue [PFObject deleteAllInBackground:self.toDelete]; } }); }); } } 

如果要在删除完成前阻止当前线程,请使用deleteAll而不是deleteAllInBackground