我们创建了一个操作框架来添加基类中没有的一些功能(例如跟踪成功/失败)。父操作通常是非并发的,并且可能仅用于管理子操作。通常是并发的子操作(异步下载xml和媒体)。
当我们在iOS 7上运行我们的应用程序时,在操作队列中添加一些操作,约3/4的操作完成,然后应用程序似乎挂起。
当我在调试器中暂停应用程序,并检查队列中的操作(sOpQueue.operations)时,其中许多已准备好运行(isReady返回TRUE),但显然它们都没有执行(isExecuting返回FALSE) ,我没有看到在任何线程上运行任何操作的证据。)
这是iOS 7中的一个新问题。
当我增加或减少并发操作的数量时,行为似乎没有改变。
有没有人对如何确定未启动就绪操作的原因有任何建议?
谢谢, 卡盘
答案 0 :(得分:3)
您是否发出了isReady
Key Value Observing通知?
例如,我使用了一个属性:
@property (nonatomic, getter = isReady) BOOL ready;
然后有一个自定义setter:
- (void)setReady:(BOOL)ready
{
[self willChangeValueForKey:@"isReady"];
_ready = ready;
[self didChangeValueForKey:@"isReady"];
}
以及调用super
的自定义getter:
- (BOOL)isReady
{
return _ready && [super isReady];
}
并且,因为你实现了setter和getter,你必须在@implementation
的开头手动合成属性(通常你不必再这样做了,但是如果你实现了所有的自定义访问者,您必须手动@synthesize
):
@synthesize ready = _ready;
然后,当满足以下两个条件时,操作开始:
ready
属性设置为YES
(注意,请使用setter,而不是直接使用ivar);
self.ready = YES;
或
[self setReady:YES];
满足所有其他标准NSOperation
条件(例如,操作之间的依赖关系,尊重maxConcurrentOperationCount
,优先级因素等等。)
答案 1 :(得分:2)
我敢打赌你的并发操作还没有完成。提高并发操作的数量,看看它是否可以在挂起之前运行更长时间。然后找出你的并发操作未正确设置isFinished的原因。