NSOperation已准备就绪,但未在iOS 7上启动

时间:2013-10-08 20:15:09

标签: ios nsoperation nsoperationqueue

我们创建了一个操作框架来添加基类中没有的一些功能(例如跟踪成功/失败)。父操作通常是非并发的,并且可能仅用于管理子操作。通常是并发的子操作(异步下载xml和媒体)。

当我们在iOS 7上运行我们的应用程序时,在操作队列中添加一些操作,约3/4的操作完成,然后应用程序似乎挂起。

当我在调试器中暂停应用程序,并检查队列中的操作(sOpQueue.operations)时,其中许多已准备好运行(isReady返回TRUE),但显然它们都没有执行(isExecuting返回FALSE) ,我没有看到在任何线程上运行任何操作的证据。)

这是iOS 7中的一个新问题。

当我增加或减少并发操作的数量时,行为似乎没有改变。

有没有人对如何确定未启动就绪操作的原因有任何建议?

谢谢, 卡盘

2 个答案:

答案 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的原因。