【问题标题】:Understanding NSBlockOperation了解 NSBlockOperation
【发布时间】:2014-09-17 22:07:56
【问题描述】:

我正在进入NSBlockOperation,我有一些问题。 值得注意的是,addExecutionBlockdocumentation 表示:

讨论

指定的块不应该对 它的执行环境。

在接收器正在执行或已经执行时调用此方法 finished 会引发 NSInvalidArgumentException 异常。

NSInvalidArgumentException会抛出什么情况? “当接收器正在执行时”到底是什么意思?什么会导致这种情况?

【问题讨论】:

  • 你不应该对环境做任何假设意味着你不知道任何状态如果执行还没有开始将要开始是现在运行八还是已经结束。你也不应该假设你的任务需要一定的时间,而是使用异步方法调用来检查你的执行状态。如果您开始执行,尽管它们当前正在运行或已完成,此方法将抛出一个无效的参数异常。这就是我的理解。

标签: ios nsoperation nsoperationqueue nsexception nsblockoperation


【解决方案1】:

一个块操作对象可以有零个或多个与之关联的执行块。当块操作开始时,其所有关联的执行块都被提交并发执行。警告是在此之后您不能向操作添加更多执行块。

您可以创建更多的块操作对象并将执行块添加到这些对象中。每个块操作都是独立启动的,因此添加更多执行块的规则是单独评估的。

通常,您会创建一个块操作,向其中添加您想要的任何执行块,然后将该操作排队到一个操作队列中。一旦操作排队,它可能随时开始(取决于准备情况,这取决于依赖关系)。因此,一旦执行块排队,最好不要尝试添加它。

【讨论】:

    【解决方案2】:

    您不能在操作正在运行或已经完成时使用addExecutionBlock: 添加执行块。就是这个意思。

    【讨论】:

    • 是否也意味着我不能在执行操作中运行另一个操作?
    • 我认为您不能在操作中有效地运行操作。您可以从操作中将操作排入队列,但是(假设它在同一个队列中),它将在当前队列之后运行。如果你想做这样的事情,你应该研究依赖操作。无论哪种方式,操作内部的操作都与addExecutionBlock: 没有任何关系
    • "它将在当前队列之后运行" ...如果它是一个并发队列(默认情况下是),它不一定要等待当前操作完成。
    • 操作是并发或同步的,不是队列。 NSOperationQueues 总是一个接一个地调度他们的操作。同步操作使队列在执行下一个操作之前等待它完成。这些是重要的区别。
    • “并发”一词有两种完全不相关的用法。一个操作是否并发,不影响队列本身的maxConcurrentOperationCount。如果一个操作(无论是否并发)将一个新操作添加到队列中,那么第二个操作不必等待第一个操作完成即可开始。不要误会我的意思:我赞成您对addExecutionBlock 的回答,因为这是正确的。但是,在讨论不同的操作时,如果第一个操作足够慢,那么第二个操作可能会在第一个操作完成之前开始(甚至可能完成)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多