&引用;addDependency“;在iOS中工作不正常
我有两个&引用;addDependency“;在iOS中工作不正常,ios,objective-c,nsoperationqueue,Ios,Objective C,Nsoperationqueue,我有两个NSOperation对象“A”和“B”,我想使用依赖关系,因为我需要先完成“B”,然后启动“A” 预期产出: B A 但有时: A B 但我想先完成B,然后再开始A。请帮我 首先创建操作op1 如果操作op2提供的数据不可用,请创建操作op2 使操作op1依赖于操作op2。例如,op1.addDependency(op2) 或者也检查一下这个 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSOpera
NSOperation
对象“A”和“B”,我想使用依赖关系,因为我需要先完成“B”,然后启动“A”
预期产出:
B
A
但有时:
A
B
但我想先完成B,然后再开始A。请帮我
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运行时,它可以从操作A中选取结果
- 保留所有A操作直到B运行,然后将完成块重新创建为另一个
参见下面的代码:NSOperation
我可以通过使用
NSBlockOperation
类而不是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
你能告诉我怎么调用这个代码吗?它是连续调用的吗,就像在循环中一样?@danh,不是在循环中。我刚刚加入了“viewDidLoad”方法。我明白了。这完全违背了我的理论。您是否有可靠的方法重现无序行为?只是为了好玩,您可以添加
[myQueue WaitUntillalOperations完成]代码>检查我的ans是否适合..检查此块你得到清晰的想法谢谢你的回复。如果我们像上面那样做,“addDependency”方法的用途是什么?我可以通过“NSBlockOperation”获得它,但我想通过“NSOperation”来实现它。无需再次添加依赖项“[operationB addDependency:OperationDetail];”。
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];
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