&引用;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
  • 如果操作op2提供的数据不可用,请创建操作op2
  • 使操作op1依赖于操作op2。例如,
    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