"addDependency" 在 iOS 中无法正常工作
"addDependency" is not working properly in iOS
我有两个 NSOperation
对象 "A" 和 "B",我想使用依赖项,因为我需要先完成 "B" 然后再开始 "A".
- (void)viewDidLoad {
[super viewDidLoad];
NSOperationQueue *myQueue = [NSOperationQueue new];
NSOperation *op1 = [[NSOperation alloc] init]; // Its a background(concurrent) thread.
op1.completionBlock =^{
NSLog(@"A");
};
NSOperation *op2 = [[NSOperation alloc] init];
op2.completionBlock =^{
NSLog(@"B");
};
[op1 addDependency:op2];
[myQueue addOperation:op1];
[myQueue addOperation:op2];
}
预期输出:
B
A
但有时:
A
B
但是我想先完成B,然后再开始A,请帮帮我。
- 首先创建操作op1
- 如果操作 op2 提供的数据不可用,则创建操作 op2
- 使操作 op1 依赖于操作 op2。 IE。像
op1.addDependency(op2);
或者也检查这个
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSOperation *op1;
NSOperation *op2;
//... initialize op1 and op2 however you please ...
[op1 setCompletionBlock:^{
if ([op1 satisfiesSomeCriteria]) {
[queue addOperation:op2];
}
}];
[queue addOperation:op1];
这里的完成块不是队列的一部分,而是 运行 在另一个线程上的操作队列之外。因此操作 A 的 completionBlock 将 运行 与操作 B.
同时
根据您的问题,您正在使用 completionBlocks 将信息从操作 A 传递到 B。
这里有一些解决方案:
给 B 引用所有的 A(不是弱的)所以当 B 运行s 它可以从操作 A 中选择结果。
保持所有 A 操作直到 B 运行s,然后将您的完成块重新创建为另一个 NSOperation
参见下面的代码:
NSOperation *operA = [NSBlockOperation blockOperationWithBlock:^{ // do stuff
}];
NSOperation *operationATail = [NSBlockOperation blockOperationWithBlock:^{ // do completionBlock stuff
}];
// First bullet point
[operationATail addDependency:operA];
// Second bullet point
[operationB addDependency:operationATail];
[self.queue addOperations:@[operA, operationATail, operationB] waitUntilFinished:NO];
我可以通过使用 NSBlockOperation
class 而不是 NSOperation
来实现它。这是一个示例代码片段。
NSOperationQueue *myQueue = [NSOperationQueue new];
NSBlockOperation *blockOp1 = [[NSBlockOperation alloc] init];
[blockOp1 addExecutionBlock:^{
NSLog(@"1");
}];
NSBlockOperation *blockOp2 = [[NSBlockOperation alloc] init];
[blockOp2 addExecutionBlock:^{
NSLog(@"2");
}];
[blockOp1 addDependency:blockOp2];
[myQueue addOperation:blockOp1];
[myQueue addOperation:blockOp2];
Output: 2
1
我有两个 NSOperation
对象 "A" 和 "B",我想使用依赖项,因为我需要先完成 "B" 然后再开始 "A".
- (void)viewDidLoad {
[super viewDidLoad];
NSOperationQueue *myQueue = [NSOperationQueue new];
NSOperation *op1 = [[NSOperation alloc] init]; // Its a background(concurrent) thread.
op1.completionBlock =^{
NSLog(@"A");
};
NSOperation *op2 = [[NSOperation alloc] init];
op2.completionBlock =^{
NSLog(@"B");
};
[op1 addDependency:op2];
[myQueue addOperation:op1];
[myQueue addOperation:op2];
}
预期输出:
B
A
但有时:
A
B
但是我想先完成B,然后再开始A,请帮帮我。
- 首先创建操作op1
- 如果操作 op2 提供的数据不可用,则创建操作 op2
- 使操作 op1 依赖于操作 op2。 IE。像
op1.addDependency(op2);
或者也检查这个
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSOperation *op1;
NSOperation *op2;
//... initialize op1 and op2 however you please ...
[op1 setCompletionBlock:^{
if ([op1 satisfiesSomeCriteria]) {
[queue addOperation:op2];
}
}];
[queue addOperation:op1];
这里的完成块不是队列的一部分,而是 运行 在另一个线程上的操作队列之外。因此操作 A 的 completionBlock 将 运行 与操作 B.
同时根据您的问题,您正在使用 completionBlocks 将信息从操作 A 传递到 B。
这里有一些解决方案:
给 B 引用所有的 A(不是弱的)所以当 B 运行s 它可以从操作 A 中选择结果。
保持所有 A 操作直到 B 运行s,然后将您的完成块重新创建为另一个
NSOperation
参见下面的代码:
NSOperation *operA = [NSBlockOperation blockOperationWithBlock:^{ // do stuff
}];
NSOperation *operationATail = [NSBlockOperation blockOperationWithBlock:^{ // do completionBlock stuff
}];
// First bullet point
[operationATail addDependency:operA];
// Second bullet point
[operationB addDependency:operationATail];
[self.queue addOperations:@[operA, operationATail, operationB] waitUntilFinished:NO];
我可以通过使用 NSBlockOperation
class 而不是 NSOperation
来实现它。这是一个示例代码片段。
NSOperationQueue *myQueue = [NSOperationQueue new];
NSBlockOperation *blockOp1 = [[NSBlockOperation alloc] init];
[blockOp1 addExecutionBlock:^{
NSLog(@"1");
}];
NSBlockOperation *blockOp2 = [[NSBlockOperation alloc] init];
[blockOp2 addExecutionBlock:^{
NSLog(@"2");
}];
[blockOp1 addDependency:blockOp2];
[myQueue addOperation:blockOp1];
[myQueue addOperation:blockOp2];
Output: 2
1