Chu*_*tte 3 nsoperation nsoperationqueue ios
我们创建了一个操作框架来添加一些在基类中没有的功能(例如跟踪成功/失败)。父操作通常是非并发的,可能只是为了管理子操作而存在。通常并发的子操作(异步下载 xml 和媒体)。
当我们在 iOS 7 上运行我们的应用程序时,将一些操作添加到操作队列中,大约有 3/4 的操作完成,然后应用程序似乎挂起。
当我在调试器中暂停应用程序,并检查队列中的操作 (sOpQueue.operations) 时,其中许多已准备好运行(isReady 返回 TRUE),但显然它们都没有执行(isExecuting 返回 FALSE,而我看不到任何线程上运行的任何操作的证据)。
这是 iOS 7 的新问题。
当我增加或减少并发操作的数量时,行为似乎没有改变。
有没有人对如何确定未启动就绪操作的原因有任何建议?
谢谢,查克
您是否正在发布isReady Key Value Observing通知?
例如,我使用一个属性:
@property (nonatomic, getter = isReady) BOOL ready;
Run Code Online (Sandbox Code Playgroud)
然后有一个自定义设置器:
- (void)setReady:(BOOL)ready
{
[self willChangeValueForKey:@"isReady"];
_ready = ready;
[self didChangeValueForKey:@"isReady"];
}
Run Code Online (Sandbox Code Playgroud)
以及调用的自定义 getter super:
- (BOOL)isReady
{
return _ready && [super isReady];
}
Run Code Online (Sandbox Code Playgroud)
并且,因为你同时实现了 setter 和 getter,所以你必须在开始时手动合成属性@implementation(通常你不必再这样做了,但是如果你实现了所有的自定义访问器,你必须手动@synthesize) :
@synthesize ready = _ready;
Run Code Online (Sandbox Code Playgroud)
然后,当满足以下两个条件时,操作开始:
该ready属性设置为YES(注意,使用的setter,不能直接伊娃);
self.ready = YES;
Run Code Online (Sandbox Code Playgroud)
或者
[self setReady:YES];
Run Code Online (Sandbox Code Playgroud)NSOperation满足所有其他标准标准(例如,操作之间的依赖关系、尊重maxConcurrentOperationCount、考虑优先级等)。
| 归档时间: |
|
| 查看次数: |
2700 次 |
| 最近记录: |