问题标签 [nsoperationqueue]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1365 浏览

iphone - NSOperationQueue、内存和 GCD;如何正确实施?

我有一些简单的疑问,NSOperation并且GCD我没有在文档中找到答案。

第一个问题与内存管理有关:

我想知道是否需要为要添加到 NSOperationQueue 的方法创建一个 Autorealease 池;类似于在没有 NSOperations 的不同线程上运行方法时。

下一个问题是是否NSOperation需要处理 GCD 还是需要手动完成?

感谢您的帮助!

0 投票
0 回答
527 浏览

uiimage - iOS 的并发图像加载

我正在为 iOS 编写一个 RSS 阅读器应用程序。将有一个表格视图,其中包含提要中的文章列表。该 tableView 的每个单元格都将包含一个图像 - 文章的缩略图。我希望它以最有效的方式加载:

  1. 最高优先级是可见缩略图。
  2. 如果可以按正确的顺序加载可见的缩略图会很好:从上到下。
  3. 不可见的缩略图也必须预先加载。但优先级最低。
  4. 如果不可见缩略图的加载顺序可以如下所示,那就太好了:从最近(从顶部和底部)到可见单元格到最远的单元格。
  5. 每次 tableView 滚动它的单元格都应该根据它们的可见性和到可见区域的距离来更新它们的加载优先级。

我有点卡住使用什么方法。最棘手的是(5)。之所以需要它,是因为应用程序可能会在窄带宽条件下使用。所以应用程序必须尽量利用低连接速度。

现在我有 NSOperationQueue 用于图像加载。maxConcurrentOperationCount 是 2。加载 NSOperations 是非并发的(用 Apple 的话来说),即在单独的线程中执行。每个 NSOperation 只是一个同步的 NSData 的 initWithContentsOfURL。这种方法的问题是我无法控制已经执行的加载操作。无法取消它们!

理想的情况是我可以随时更改所有(包括已经执行的)加载操作的优先级。所以我正在考虑切换到具有异步 NSURLConnection 加载的并发(用苹果的术语)NSOperations。这样我就可以通过查看 didReceiveData 之间的 isCancelled 属性来取消操作。我计划将取消操作用于优先级降低的操作:存储已由操作加载的数据,取消它,将新的(较低)优先级添加到队列中并恢复下载。希望并发(以 Apple 而言)操作不会减慢 UI,因为加载任务不是 CPU 密集型的,并且可能有很高的延迟。

另外我不确定如何确定操作的优先级。由于 NSOperationQueuePriority 只有 5 个可能的值。即如何保持加载可见(从上到下)和不可见(从近到远)缩略图的顺序?

请指教)

0 投票
1 回答
174 浏览

iphone - 寻求在 iPhone ap 中使用 NSOperationQueue 的建议

IPhone 应用程序是否应该通常只使用一个共享的 NSOperationQueue,可能存储在应用程序委托中,并让每个控制器根据需要将 NSOperations 放入其中,或者每个控制器都可以拥有自己的 NSOperationQueue?两种方法都可以接受吗?

0 投票
1 回答
561 浏览

objective-c - 通过 OperationQueue 加载 UIImageView 的问题

我使用 NSOperationQueue 加载 UIImageView。

加载从 Internet 获取图像,然后将其添加到图像视图。我遇到的问题是该方法完成但图像视图需要大约 3 秒后才能实际显示图像或从超级视图中删除图像视图......

NSLOG 显示前两个日志语句之间的延迟大约 3 秒无法理解为什么....

用我的最新代码更新......

0 投票
1 回答
929 浏览

objective-c - NSOperationQueue 中多个 NSOperation 实例中的 NSUrlConnection

下面的代码在一个 NSOperationQueue 中添加了多个 NSOperation 实例。Operation 只获取 url 的内容。我也提供了php代码...

鉴于以下代码...

test.php 女巫 -requestResponse 调用的内容:

问题是,当我[NSThread sleepForTimeInterval:1.0]在队列中添加每个 NSOperation 之前创建延迟时,所有请求都需要大约相同的时间才能完成。如果我评论这一行,大多数请求需要越来越多的时间才能完成。问题是为什么?

我已经从命令行(使用curl)测试了url,并且请求需要相同的时间来完成对php的任意数量的同时调用,所以问题不在于服务器端。

这是使用 localhost 作为服务器并禁用 sleepForTimeInterval的输出

// 当然,差异更大(从 7 到 20 秒!)用 php 做一些实际的工作。

启用 sleepForTimeInterval

0 投票
2 回答
371 浏览

iphone - 延迟、取消或替换 NSOperationQueue 中的 ASIFormDataRequest(用于搜索框)

我使用下面的代码成功地制作了 ASIFormDataRequest。

当前,用户在搜索框中的每次按键都会发出此请求(键入的文本在请求中作为搜索字符串发送)。但是,我不想在每次按键时都发送请求,而是希望将请求延迟一秒钟,以允许用户在发送请求之前在搜索框中输入更多字符。

我已经成功创建了一个线程,在用户继续输入时等待一秒钟(尽管我承认我不相信这是最好的方法,但它现在有效)......

称之为

但是,如果用户继续输入,我还没有弄清楚如何取消请求或不将请求放入队列,或者清空队列并用新请求替换它。

最后,显然我可以强迫用户等到他们按下弹出键盘上的“搜索”按钮,但我希​​望在没有这个的情况下提供搜索结果。

谢谢

0 投票
2 回答
2150 浏览

iphone - 未调用委托方法

我正在制作一个用于异步下载图像的 OpenSource (github) 助手类(我遇到了很大的麻烦)。

但是,我设置了委托方法来提醒委托图像已完成下载。问题是委托方法没有被调用。我正在设置委托和所有内容,但我不知道为什么会出现问题。

请看我的代码!我只发布了相关代码。

MKAsyncImageDownloader.h

MKAsyncImageDownloader.m

MKOperation.m NSOperation 的子类。我 alloc/init MKAsynImageDownloader 只执行选择器。代码:

RootViewController.h

RootViewController.m 只是为了展示我是如何设置委托的。

0 投票
2 回答
544 浏览

iphone - 连接通知以恢复 NSOperationQueue

我需要从 Internet 下载一些图像,现在我正在使用NSOperationQueue.

我想知道是否可以接收 Internet 连接通知以暂停/恢复下载。

我不需要冻结下载,但是能够将它(NSOperation)放回队列并等待连接再次启动它会很棒。

有任何想法吗?:)

0 投票
1 回答
828 浏览

objective-c - NSOperation & NSOperationQueue 冻结应用

我正在使用 NSOperationQueue 和 NSOperation 来执行对 twitter 的请求。但是,当我执行此请求并接收结果时,应用程序会冻结几秒钟,直到所有结果都已下载。

有没有办法阻止这种情况发生?

编辑 - -

我的代码是:

TwitterRequest (NSOperation)

}

}

推特经理:

我只发布了获取公共时间表的代码。

0 投票
3 回答
2173 浏览

objective-c - 如何正确处理排队 nsoperation 的解除分配委托

在我当前的项目中,几个视图控制器(如vc)生成在静态 NSOperationQueue 上执行的 NSOperation 对象(如operation)。当操作等待或运行时,它将通过委托(operation.delegate = vc,分配不保留)向视图控制器报告。

但是这些操作可能需要一段时间,同时应用程序可以释放视图控制器(通过将它们从导航控制器的堆栈中弹出)。

到目前为止,一切都是故意的。包含静态 NSOperationQueue 的类有办法返回操作,因此视图控制器不会保留它们。它们只是分配/初始化/自动释放并放入队列中。

现在这也导致了问题。在视图控制器解除分配后,对 NSOperation 的精神委托的任何调用都将导致错误的访问冲突。据我了解,无法检查指针处的对象是否已被释放,如本问题所述

我能想到的一种解决方法是保留操作并将 operation.delegate 设置为 nil on dealloc。但这将是我最不受欢迎的修复,因为它会引入很多额外的 ivars/属性来跟踪。

因此,我的问题是,有没有其他方法可以解决这个问题,如果有,你能在这里画一个吗?

干杯,
EP。

解决方案:最适合我的方法是与 Guiliano 的回答略有不同:

  • 在队列管理器中实现每个委托协议是不可行的(20 多种不同的协议和 50 多种方法),所以我保留了直接委托分配。我所做的更改是进行分配调用的班级。这曾经是创建请求的类(和委托),但现在它被卸载到队列管理器。

  • 队列管理器除了将委托分配给操作之外,还拥有一个辅助可变字典来跟踪委托/操作对。

  • 每个委托实例在释放时调用一个[QueueManager invalidateDelegate:self]方法,然后查找属于该委托的请求并将其归零。然后还删除字典操作/委托对以允许正确解除分配操作。

  • 最后,通过 KVO 观察isFinished每个操作的属性,可变 dict 保持干净,以确保所有操作保留计数在完成后实际释放。

感谢 Guiliano 提供使用 KVO 破解此问题的提示!