-2
-(void)GrabbingProcess:(void (^)())block;
{
    AssertNonMainThread;
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        if (self.OtherGrabbingIndicator == 0)
        {
            self.isStillLoading = true;
        }
        self.OtherGrabbingIndicator ++;
        AssertMainThread
    }];

    block();


    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [self updateStatusAtList];
        self.OtherGrabbingIndicator --;
        if (self.OtherGrabbingIndicator ==0)
        {
            self.isStillLoading = false;
        }
        AssertMainThread
    }];
}

基本上,代码设置为 self.OtherGrabbingIndicator++ 将始终与 self.OtherGrabbingIndicator 平衡--

我想不出它会失败的任何原因。它不会失败。

现在,偶尔会失败。self.OtherGrabbingIndicator 将悬停在 2 或 1 并且所有线程都已停止。不知何故,一些++没有被--平衡。但怎么可能呢?

我不知道怎么做。

我检查了一下,没有办法 self.OtherGrabbingIndicator 在其他任何地方更改。

我打算做的一件事是在某个数组中添加一个块的值并适当地删除这些块。问题是如果我知道块,我怎么知道块代表什么代码?

以前可以正常工作,现在不行了。这让我抓狂。

我能想到的唯一方法是 block() 以某种方式无法完成,但哪个块无法完成,这怎么会发生?

如果我按暂停,所有线程都是空的。

更新:将 @synchronized() 添加到 ++ 和 -- 解决了问题。但是,这没有任何意义。

如果没有@synchronized,它仍然可以工作,因为 mainQueue 只有 1 个最大线程并且一次执行一个。

4

1 回答 1

1

不幸的是,我没有给你最终的答案。但是,我最近在 NSOperations 上确实遇到了类似的事情,我将与您分享。

关于您的代码的几个问题:

addOperationWithBlock 中的第一个块是否需要在执行“block()”调用之前完成?

第二个块是否需要在执行之前完成其他两个操作?

在我的例子中,操作以正确的顺序添加,但基于操作队列的线程调度(低于需要操作结果的其他线程),它们执行得太晚并导致代码失败。

我不知道你的抓取过程有多关键,但在我的情况下,在我的应用程序的时间关键部分使用 NSOperation 从来没有 100% 的时间工作。因此,我重新设计为使用我们可以控制优先级的 NSThread,从那时起一切正常。

经过这次体验,我得出的结论是 NSOperation 是一个很棒的工具,因为它使用简单,但在时间紧迫的情况下没有多大帮助,因为它并不是真正适用于该用例。

希望这会有所帮助,祝你好运。

于 2013-04-02T13:09:26.580 回答