【问题标题】:ios NSOperationQueue, operations all run when added and don't queueios NSOperationQueue,操作全部在添加时运行并且不排队
【发布时间】:2011-08-08 20:43:50
【问题描述】:

所以,我有一组 ASINetworkQueue,它们当前一起运行,导致数据库保存时出现争用情况。我正在尝试创建一个 NSOperationQueue ,它将对这些“子队列”中的每一个进行排队。我目前已经创建了一个带有 main 方法的 NSOperation,该方法启动“子队列”以开始下载。

我的问题是,每次我使用“addOperation”将子队列添加到主队列时,它都会立即触发“main”方法,因此我的子队列同时运行。我的印象是主要方法一次被解雇。即仅用于队列顶部的操作。

也许我在这里遗漏了一些东西,但我似乎无法弄清楚如何在第一个操作完成之前停止其他操作。此外,我什至无法让我的程序进入导致 NSOperation 的 isReady = 0 的情况。这总是返回是。

这里有一些代码:

注意:我已将 NSOperation 队列 maxConcurrentOperations 设置为 1。

NSOperation 主要方法:

-(void)main {
    [subQueue download];
}

设置队列:

ChapterDownloadOperation *cdo =  [[ChapterDownloadOperation alloc] init];
cdo.chapter = ch;
[chapterDownloadQueue addOperation:cdo];
[cdo release];

如果我添加多个操作,main 方法会在它添加到队列中的实例处触发。当该操作准备好时,是否还有另一个我应该覆盖和使用的功能。我感觉主要方法是设置操作。

非常感谢任何想法。

非常感谢。

【问题讨论】:

    标签: objective-c ios nsoperation nsoperationqueue


    【解决方案1】:

    NSOperationQueue 将在能够平衡额外处理能力时立即触发 main 方法。

    要将队列一次限制为一个操作,您可以尝试在每个操作之间添加依赖关系,然后再将它们排队: [B addDependency:A]; //[B main] 在 A 执行完毕之前不会被调用

    但请注意,如果 A 被取消,B 仍将运行。

    希望有帮助!

    【讨论】:

    • 您的意思是通过获取队列中的操作数组来为操作添加依赖关系吗?为了使依赖项正常工作,您需要在将其添加到队列之前将它们添加到每个操作中。
    • 好的,但是在单击按钮时会创建操作并将其添加到队列中。那么,在点击另一个按钮之前将第一个操作添加到队列中时,如何将第一个操作作为依赖项添加到第二个操作。有什么想法吗?
    • 嗯,那么在这种情况下,您可能需要考虑使用串行调度队列而不是操作队列。串行调度队列一次执行一个,顺序是先进先出。 Concurrency Programming Guide 中有很多关于串行队列的有用信息
    • 酷,谢谢。我刚刚将 Array 锭转换为 Queue 并使用全局布尔值作为信号量。现在似乎工作正常,有机会我会看看串行调度队列。非常感谢!
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多