NS7操作就绪,但未在iOS 7上启动

NS7操作就绪,但未在iOS 7上启动,ios,nsoperation,nsoperationqueue,Ios,Nsoperation,Nsoperationqueue,我们创建了一个操作框架来添加一些基类中没有的功能(例如跟踪成功/失败)。父操作通常是非并发的,并且可能仅用于管理子操作。通常是并发的子操作(异步下载xml和媒体) 当我们在iOS 7上运行应用程序时,向操作队列中添加一些操作,大约3/4的操作完成,然后应用程序似乎挂起 当我在调试器中暂停应用程序,并检查队列中的操作(sOpQueue.operations)时,其中许多操作已经准备好运行(isReady返回TRUE),但显然没有一个正在执行(isExecuting返回FALSE,并且我没有看到任何

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

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

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

从iOS 7开始,这是一个新问题

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

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

谢谢,
Chuck

您是否已发出
isReady
通知

例如,我使用一个属性:

@property (nonatomic, getter = isReady) BOOL ready;
然后有一个自定义设置器:

- (void)setReady:(BOOL)ready
{
    [self willChangeValueForKey:@"isReady"];
    _ready = ready;
    [self didChangeValueForKey:@"isReady"];
}
以及调用
super
的自定义getter:

- (BOOL)isReady
{
    return _ready && [super isReady];
}
而且,由于您同时实现了setter和getter,因此必须在
@实现开始时手动合成属性(通常您不必再这样做,但如果您实现了所有自定义访问器,则必须手动合成
@synthesis
):

然后,当满足以下两个条件时,操作开始:

  • ready
    属性设置为
    YES
    (注意,使用setter,而不是直接使用ivar)

  • 满足所有其他标准
    NSOperation
    标准(例如,操作之间的依赖关系、遵守
    maxConcurrentOperationCount
    、考虑优先级等)


我敢打赌,您的并发操作没有正确完成。提高并发操作的数量,看看是否可以在挂起之前运行更长的时间。然后找出并发操作没有正确设置isFinished的原因

我们没有维护一个单独的属性,但是当就绪状态发生变化时,我们会发出KVO通知调用。@ChuckDoucette好吧,我不知道在没有代码示例的情况下该说什么,因为上面两种方法在iOS7中都能很好地工作(我在发布之前对它们进行了测试)。我怀疑您的
isReady
方法、关联的KVO或其他东西(如依赖项、队列挂起等)中存在一些简单的错误。我建议为您遇到的问题创建尽可能简单的演示,并与我们分享(当然,假设在进行此练习的过程中,您不只是找出问题所在);(b) 未添加到队列中;(c) isReady方法未返回正确的值,且未调用
/
didChangeValueForKey
在更改
isReady
返回值之前/之后;(d) 一些奇怪的依赖关系相关问题(一些依赖操作未启动、未完成等)。这些是我唯一想到的事情。但是我没有看到任何iOS 7问题,我做了很多操作。我偶然发现了这个答案,我想补充一点,如果您为
isReady
创建属性和自定义setter,您还应该重写getter并返回您自己的变量+
[super isReady]
的结果。如果不这样做,某些事情(如依赖关系)可能会中断(如果有的话)。在文档中:“如果这样做,您的自定义实现应该调用super并将其返回值合并到对象的就绪状态中。”我已经尝试增加(和减少)并发操作的数量。两者似乎都没有任何效果。没有完成一个并发操作是一个很好的猜测——但是我们的操作队列中没有一个操作看起来正在执行([op isExecuting]返回FALSE,并且没有操作线程处于活动状态。您是否有可能对这些操作设置依赖项?您能否确认依赖项已成功完成?并且您没有循环依赖项?我在苹果开发者论坛上发布了相同的问题:苹果支持专业人士的回答是:压倒一切的是:“远离老路”。因此,我们正在重新评估我们的方法。
@synthesize ready = _ready;
self.ready = YES;
[self setReady:YES];