2010-09-03 41 views
1

我创建了一个在的NSOperation队列,像这样:与NSOperationQueue和dealloc的问题被称为和崩溃应用

ImageLoadingOperation *operation = [[ImageLoadingOperation alloc] initWithImageURL:url target:self action:@selector(didFinishLoadingImageWithResult:)]; 
[operationQueue addOperation:operation]; 
[operation release]; 

这工作正常,但如果视图获取操作前弹出结束应用程序崩溃与“EXC_BAD_ACCESS”

我试图通过调用cancelAllOperations来取消操作Queue,但是因为它已经在进行中,所以它不会阻止App崩溃。 docos表示,如果操作正在运行,那么检测操作是否已被取消并做出适当的响应,但不太确定该如何实现?

任何想法?

+0

因此,operationQueue属于视图,并且队列与视图一起被释放? – 2010-09-03 01:42:29

+0

我已经尝试在队列和视图被释放之前停止操作队列,但没有成功 – Rudiger 2010-09-03 01:44:16

回答

1

这是查看调用某个网络然后回调的一般问题。

我的解决方案是您可以在调用操作之前保留该视图。然后,当操作结束时,您释放视图。

- (void)longTask { 
    [self retain]; 
} 

- (void)longTaskDidFinish { 
    // do something if you want 
    [self release]; 
} 
+0

如此简单并且有魅力。谢谢你 – Rudiger 2010-09-03 04:45:18

0

你将不得不要么重写你的ImageLoadingOperation类中的“取消”操作,也可以让ImageLoadingOperation本身作为志愿观察员加入了“取消”属性。在那里 - 你可以聪明地取消你的操作,使它不会崩溃。另外,如果ImageLoadingOperation在后台运行,那么将主视图的视图以某种方式推迟到主线程(所有绘图发生的地方)会更明智一些。你可以使用dispatch_sync(dispatch_get_main_queue(),^ {});甚至执行SelectorOnMainThread以实际访问相关视图。

您会发现 - 使用操作队列的关键是去除依赖关系,并让事件并行运行,但操作必须与视图系统更改同步,并且必须针对完整性和健壮性进行设计。

0

您可以在调用操作的回调之前保留该视图,如上面提到的vodkhang。但是这会延长视图的寿命,因为视图弹出后,您不希望操作继续。
这里是你应该做的到取消命令做出响应什么草图:

- (void)start{ 
    if(self.isCancelled){ 
     [self markAsFinished]; 
     return; 
    } 
    //start your task asynchronously 
} 


//If you want to cancel the downloading progress immediately, implement your own 'cancel' method 
- (void)cancel{ 
    [super cancel]; 
    if(self.isExecuting){ 
     { 
      ...... 
      cancel load process 
      ...... 
     } 
     [self markAsFinished]; 
    } 
} 

- (void)markAsFinished{ 
    ...... 
    change 'finished' to YES' generate KVO notifications on this key path 
    change 'executing' to 'YES'; generate KVO notification on this key path 
    ...... 
} 

该草图是基于ASIHTTPRequest网络库,并且 有你应该如何应对取消命令的official guide

相关问题