3

我正面临着一些奇怪的结果addOperationWithBlock

我的函数看起来像这样:

-(void) myFunction{
   NSLog(@"VISITED");

 ..



  for (NSDictionary *Obj in myObjects)
  {
    [operationQueue addOperationWithBlock:^(void){
         MyObject* tmp = [self tediousFunction:Obj];
         // threadTempObjects is member NSMutableArray
         [self.threadTempObjects addObject:tmp];
         NSLog(@"ADDED");
    }];
  }

 [operationQueue addOperationWithBlock:^(void){
       [self.myArray addObjectsFromArray:self.threadTempObjects];

       for(myObject *myObj in self.myArray)
       {
            // MAIN_QUEUE
            [[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
                [self updateUI:myObj];
            }];
       }
   }];



   [operationQueue addOperationWithBlock:^(void){
       [[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
             [self filterResults];
       }];
   }];

}

我的字典包含 4 个值,因此 ADDED 在日志中显示 4 次。 但是,当我检查filterResults内部时,我发现myArray内部只有2 个对象。这意味着在调用 filterResults 操作之前调用了 4 次 operationQueue 并没有结束(尽管它是后来添加的!)

我认为 operationQueue 是串行的,并且我可以依靠它,当我添加一个操作时,它将在最后一个操作之后立即添加。所以奇怪的是,在之后的数组中只有 2 个操作。我错过了什么?谢谢

4

1 回答 1

3

从您共享的初始化代码中,我们可以了解到它operationQueue不是串行的,这意味着它将执行操作并分配线程直到系统设置最大线程数(与 GCD 相同)。
这意味着添加到的操作operationQueue是并行运行的。
要连续运行它们,请将其设置maxConcurrentOperationCount为 1。
尝试以下操作:

__block __weak id weakSelf = self;
[operationQueue setMaxConcurrentOperationCount:1];

for (NSDictionary *Obj in myObjects)
{
    [operationQueue addOperationWithBlock:^{
        MyObject* tmp = [weakSelf tediousFunction:Obj];
        // threadTempObjects is member NSMutableArray
        [weakSelf.threadTempObjects addObject:tmp];
        NSLog(@"ADDED");
    }];
}

[operationQueue addOperationWithBlock:^{
    [weakSelf.myArray addObjectsFromArray:weakSelf.threadTempObjects];

    for(myObject *myObj in weakSelf.myArray)
    {
        // MAIN_QUEUE
        [[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
            [weakSelf updateUI:myObj];
        }];
        [[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
            [weakSelf filterResults];
        }];
    }
}];

但是,这与简单地相同(甚至效率更低):

__block __weak id weakSelf = self;
[operationQueue addOperationWithBlock:^{
    for (NSDictionary *Obj in myObjects) {
        MyObject* tmp = [weakSelf tediousFunction:Obj];
        // threadTempObjects is member NSMutableArray
        [[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
            [weakSelf updateUI:tmp];
        }];
        [weakSelf.myArray addObject:tmp];
        NSLog(@"ADDED");
    }
    [[NSOperationQueue mainQueue] addOperationWithBlock:^(void) {
        [weakSelf filterResults];
     }];
}];
于 2013-04-08T19:09:57.357 回答