-(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处悬停,所有线程都已停止。不知何故,某些++不能被 - 平衡。但那怎么可能呢?
我不知道怎么做。
我查看周围没有办法自我。其他抓取指示符在其他地方被更改。
我打算做的一件事是在某个数组中添加一个块的值并适当地删除这些块。问题是如果我知道块怎么知道块代表什么代码?
过去工作正常,现在却没有。这让我疯狂。
我能想到的唯一方法是以某种方式阻塞()无法完成,但是哪个块无法完成,又怎么会发生呢?
如果我按暂停,则所有线程都为空。
更新:将@synchronized()添加到++和 - 解决问题。但是,它没有意义。
没有@synchronized它仍然可以工作,因为mainQueue只有一个最大线程并且一次执行一个。
答案 0 :(得分:1)
不幸的是,我没有最终答案。但是,我最近与NSOperations一起经历过类似的事情,我将与您分享。
关于您的代码的一些问题:
addOperationWithBlock中的第一个块是否需要在执行“block()”调用之前完成?
第二个块是否需要在执行之前完成其他操作?
在我的情况下,按正确的顺序添加但基于操作队列的线程调度(低于其他需要操作结果的其他线程)的操作,它们执行得太晚并使代码失败。
我不知道你的抓取过程对时间至关重要,但在我的情况下,在我的应用程序的时间关键部分使用NSOperation从未在100%的时间内工作。因此,我重新设计使用NSThread,我们可以控制优先级,从那时起一切正常。
根据这一经验,我的结论是NSOperation是一个很好的工具,因为它易于使用,但在时间紧迫的情况下没有多大帮助,因为它并不是真正意义上的用例。
希望这对你有所帮助,祝你好运。