- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个 NSOperation
,其目标是从 20 个 URL 下载一些图像(例如 20 个)。因此,在这个 NSOperation
中,我创建了 20 个 AFImageRequestOperation
,将它们添加到 NSOperationQueue
中,并在队列上调用 -waitUntilAllOperationsAreFinished
。
问题是,它不会等待,它会立即返回。这是代码
- (void)main {
NSArray *array = [I have the 20 links stored in this array];
self.queue = [[NSOperationQueue alloc]init];
self.queue.maxConcurrentOperationCount = 1;
for (int i = 0; i < array.count; i++) {
NSURL *url = [NSURL URLWithString:[array objectAtIndex:i]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFImageRequestOperation *op = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:^UIImage *(UIImage *image) {
return image;
} success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// SUCCESS BLOCK (not relevant)
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
// FAILURE BLOCK (not relevant)
}];
[self.queue addOperation:op];
}
[self.queue waitUntilAllOperationsAreFinished]; // Here is the problem it doesn't wait
DDLogWarn(@"-- %@ FINISHED --", self);
}
在控制台中,DDLogWarn(@"-- %@ FINISHED --", self);
在每个操作开始之前打印,所以我的猜测是 waitUntilAllOperationsAreFinished
code> 没有完成它的工作,也没有等待,但是 20 个操作在那之后仍在运行,这可能意味着 main
还没有返回,所以我不知道该怎么办再想一想。
编辑1:实际上我想知道,成功和失败中的DDLog
是否因为waitUntilAllOperationsAreFinished
阻塞线程,直到所有操作完成。这也许可以解释为什么我看不到任何事情正在发生,而且一切都是突然发生的。
最佳答案
出于与您类似的原因,我发现创建一个包含其他 NSOperations
的 NSOperation
很有用,即我有很多较小的任务组成了一个较大的任务我想将更大的任务视为一个单元,并在完成时收到通知。我还需要序列化较大任务的运行,因此一次只能运行一个任务,但是当每个大任务运行时,它可以在其内部执行多个并发操作。
在我看来,像你一样,创建一个 NSOperation
来管理大任务是一个好方法,而且我没有在文档中读过任何说不要这样做的内容。
看起来您的代码可能仍然可以工作,因此您可以继续使用 NSOperation。
根据您的情况,阻塞线程可能是合理的。如果阻塞不合理,但您想继续使用 NSOperation,则需要创建一个“并发”NSOperation
,请参阅 Concurrency Programming Guide: Configuring Operations for Concurrent Execution
如果您一次只允许下载一张图像,则可以使用 @jackslashs 建议来表示操作结束,或者如果您想允许并发图像下载,则可以使用单个 NSBlockOperation
作为最后一个操作,并使用 -[NSOperation addDependency:]
使其依赖于所有其他操作,以便它最后运行。
当您收到一切都已完成的信号时,您可以按照文档中的描述适当设置 isFinished
和 isExecuting
标志来完成您的主要 NSOperation
.
诚然,这有一定程度的复杂性,但您可能会发现它很有用,因为一旦这种复杂性隐藏在 NSOperation
中,外部的代码可能会更简单,就像我的情况一样。
如果您决定创建并发 NSOperation
,您可能会发现 Apple 示例代码 LinkedImageFetcher
: QRunLoopOperation
作为起点非常有用。
关于objective-c - NSOperationQueue 位于 NSOperation 内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14832956/
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
我正在尝试做类似的事情: SELECT SUM( CASE WHEN ( AND EXISTS(SELECT 1
我想问如何在外部 ng-repeat 内部正确使用内部 ng-repeat: 这意味着你想使用这样的东西: {{milestone.id}} {{
我希望在 wordpress 的仪表板内编辑 css 样式并且如果可能的话不必编辑 php 文件。 我知道至少可以编辑一些属性,所以我希望我可以直接在仪表板中编辑所有属性。 更具体地说如何更改自定义类
我在安装在 windows10 上的 vmware 中的 Ubuntu 上安装了伪分布式独立 hadoop 版本。 我从网上下载了一个文件,复制到ubuntu本地目录/lab/data 我在 ubun
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
在我的一些测试帮助程序代码中,我有一个名为 FakeDbSet(Of T) 的 IDbSet(Of T) 实现,它模拟了许多 EF 行为,但没有实际的数据库。我将类声明为 Friend ,因为我想强制
我正在寻找 Cassandra/CQL 的常见 SQL 习语 INSERT INTO ... SELECT ... FROM ... 的表亲。并且一直无法找到任何以编程方式或在 CQL 中执行此类操作
如何防止内部 while 循环无限运行?问题是,如果没有外部 while 循环,内部循环将毫无问题地运行。我知道它必须对外循环执行某些操作,但我无法弄清楚是什么导致了问题。 import java.u
我正在努力学习更多有关 C++ 的知识,但在国际象棋程序中遇到了一些代码,需要帮助才能理解。我有一个 union ,例如: union b_union { Bitboard b; st
这是我项目网页中的代码片段。这里我想显示用户选择的类别,然后想显示属于该类别的主题。在那里,用户可以拥有多个类别,这没有问题。我可以在第一个 while 循环中打印所有这些类别。问题是当我尝试打印主题
我想知道如何在 swing 中显示内部框架。这意味着,当需要 JFrame 时,通常我所做的是, new MyJFrame().setVisible(true); 假设之前的表单也应该显示。当显示这个
我最近发现了一些有趣的行为,这让我想知道对象如何知道存在哪些全局变量。例如,假设我有一个文件“test.py”: globalVar = 1 toDelete = 2 class Test(objec
我知道它已经在这里得到回答: google maps drag and drop objects into google maps from outside the Map ,但这并不完全是我所需要的
我目前正在学习Javascript DOM和innerHTML,发现在理解innerHTML方面存在一些问题。 这是我的代码:http://jsfiddle.net/hphchan/bfjx1w70/
我构建了一个布局如下的库: lib/ private_class_impl.cc private_class_decl.h public_class_impl.cc include/
我有一个使用 bootstrap 3 的组合 wordpress 网站。它基本上是一个图像网格。当屏幕展开时,它会从三列变为四列。移动时它是一列。 我想出了如何调整图像的顶部和底部边距,但我希望图像的
我正在试用 MSP-EXP430G2 的教程程序,使用 Code Composer Studio 使 LED 闪烁。最初,它有一个闪烁的无限循环: for(;;) // This emp
我是一名优秀的程序员,十分优秀!