取消NSOperation

时间:2012-02-09 06:31:00

标签: iphone nsoperationqueue

我在循环中使用以下代码:

-(void)getUpdatedComments
{
    if(checkComments)
    {

        objParseOperation=[[ParseOperation alloc] initWithUDID:[[NSUserDefaults standardUserDefaults] valueForKey:kDeviceUDID]:self];
        [operationQueue addOperation:objParseOperation3];

    }
}

其中operationQueue是NSOperationQueue类型的对象。我每隔几秒就会调用一次这个方法。

如果我在第一次之后调用此方法,是否需要取消之前的操作或只执行[objParseOperation release]

1 个答案:

答案 0 :(得分:2)

如果您要使用相同的队列添加更多新操作,那么释放它并创建一个新操作没有多大用处。简单地取消所有操作然后添加更多操作就足够了。您可以通过调用队列中的cancelAllOperations来执行此操作。请注意,已运行的操作将继续运行,除非他们检查取消。

  

此方法向当前队列中的所有操作发送取消消息。排队操作在开始执行之前被取消。如果操作已在执行,则由该操作识别取消并停止正在执行的操作。

是否释放队列将立即释放排队的操作,或者没有记录,因此应被视为未定义的行为。因此,你不应该假设它会以任何一种方式工作而你不应该依赖它(见dangerous to autorelease NSOperationQueue)。

但有证据表明,操作将保留其队列,例如系统在运行/挂起异步块时保留GCD队列。您可以在Grand Central Dispatch documentation中读取“系统保留队列,直到块运行完成”。尽管如此,文档还没有像上面提到的那样为NSOperationQueues指定行为。

  

dispatch_async

     

在调度队列上提交异步执行块并立即返回。

void dispatch_async(
  dispatch_queue_t queue,
  dispatch_block_t block);
     

<强>参数

     

队列

     

提交块的队列。系统保留队列,直到块运行完成。此参数不能为NULL。

     

     

要提交到目标调度队列的块。此函数代表调用者执行Block_copy和Block_release。此参数不能为NULL。

     

<强>讨论

     

此函数是将块提交到调度队列的基本机制。调用此函数后,始终在提交块后立即返回,并且永远不会等待调用该块。目标队列确定是否相对于提交到同一队列的其他块串行或同时调用该块。独立的串行队列彼此同时处理。