NSOperationQueue:麻烦理解顺序 [英] NSOperationQueue: Trouble understanding the order
问题描述
我在理解 NSOperationQueue
的工作方式时遇到问题。
I'm having trouble understanding the way NSOperationQueue
works.
说我有:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount=1;
[queue addOperationWithBlock:^{
[someObject someSelector];
}];
[queue addOperationWithBlock:^{
[someObject anotherSelector];
}];
第二个块在第一个块完成之前被调用 - 与我想要的相反。我尝试使用 - performSelectorOnMainThread:withObject:waitUntilDone:
,但是第二个块仍然被首先执行 - 可能是因为块线程没有在主线程上完成,所以它不会被waitUntilDone阻塞。我在someSelector块中添加了一个断点,它在第二个块内的断点之后到达。
The second block is being called even before the first block finishes - the opposite of what I want. I tried using – performSelectorOnMainThread:withObject:waitUntilDone:
instead, but the second block is still being executed first - presumably because the block thread is not being completed on the main thread, and so it is not blocked with waitUntilDone. I added a break point inside my someSelector block, and it is reached after a break point inside the second block.
我不太明白。帮助我!
推荐答案
如果操作之间有明确的依赖关系,请使用 addDependency
:
If there are explicit dependencies between the operations, then use addDependency
:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount=1;
NSOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
[someObject someSelector];
}];
NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
[someObject anotherSelector];
}];
[operation2 addDependency:operation1];
[queue addOperation:operation1];
[queue addOperation:operation2];
如果您的操作正在进行异步活动,应该定义一个自定义操作,并且当异步任务完成时,只调用 completeOperation
(它将发布 isFinished
消息) )。
If your operations are doing asynchronous activity, then you should define a custom operation, and only call completeOperation
(which will post the isFinished
message) when the asynchronous task is done).
// SomeOperation.h
#import <Foundation/Foundation.h>
@interface SomeOperation : NSOperation
@end
和
// SomeOperation.m
#import "SomeOperation.h"
@interface SomeOperation ()
@property (nonatomic, readwrite, getter = isFinished) BOOL finished;
@property (nonatomic, readwrite, getter = isExecuting) BOOL executing;
@end
@implementation SomeOperation
@synthesize finished = _finished;
@synthesize executing = _executing;
#pragma Configure basic operation
- (id)init
{
self = [super init];
if (self) {
_finished = NO;
_executing = NO;
}
return self;
}
- (void)start
{
if ([self isCancelled]) {
self.finished = YES;
return;
}
self.executing = YES;
[self main];
}
- (void)completeOperation
{
self.executing = NO;
self.finished = YES;
}
- (void)main
{
// start some asynchronous operation
// when it's done, call `completeOperation`
}
#pragma mark - Standard NSOperation methods
- (BOOL)isConcurrent
{
return YES;
}
- (void)setExecuting:(BOOL)executing
{
[self willChangeValueForKey:@"isExecuting"];
_executing = executing;
[self didChangeValueForKey:@"isExecuting"];
}
- (void)setFinished:(BOOL)finished
{
[self willChangeValueForKey:@"isFinished"];
_finished = finished;
[self didChangeValueForKey:@"isFinished"];
}
@end
,它将不会启动 operation2
,直到 main
中启动异步任务 SomeOperation
object,
operation1
,调用其 completeOperation
方法。
Thus, with the following code, it won't start operation2
until the asynchronous task initiated in main
in SomeOperation
object, operation1
, calls its completeOperation
method.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount=1;
NSOperation *operation1 = [[SomeOperation alloc] init];
NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
[someObject anotherSelector];
}];
[operation2 addDependency:operation1];
[queue addOperation:operation1];
[queue addOperation:operation2];
这篇关于NSOperationQueue:麻烦理解顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!