问题标签 [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 回答
391 浏览

objective-c - NSOperationQueue:无法在主线程的工具栏中添加 UIBarButtonItem

在我的 UIViewController 中,我想在工具栏中添加一个 UIBarButtonItem,但没有出现新的 Button。我究竟做错了什么?

0 投票
2 回答
1356 浏览

iphone - 将 KVO 与 NSOperationQueue 一起使用时更改字典值错误?

我正在研究“更多 iPhone 3 开发”的并发章节中的一个示例,并且无法让 KVONSOperationQueue按预期工作。我创建一个NSOperationQueue并使用以下方法观察它的operations数组:

当第一个NSOperation被添加到队列中时,我希望它被添加到它的底层operations数组(iOS 文档说它是 KVO 兼容的),因此,在更改字典中,找到一个映射 from NSKeyValueChangeKindKeyto NSKeyValueChangeInsertion,以及一个映射 fromNSKeyValueChangeNewKey添加到NSOperation. 但我没有看到任何价值NSKeyValueChangeInsertion

我知道调试器是专业的,但是为了在这里复制一些有用的东西,我开始了我的观察者方法:

那打印:

SquareRootOperation只是我适当NSOperation覆盖的子类,并且只是项目名称。)但请注意,该方法在插入单个操作时被调用两次,并且两次都使用 kind 值 1,即not 。此外,似乎是数组本身,而不是添加的项目。mainStalledNSKeyValueChangeSettingNSKeyValueChangeInsertionnewValueoldValue

有任何想法吗?谢谢!

0 投票
1 回答
586 浏览

objective-c - NSOperation 不会产生新线程?

我有一个 NSOperationQueue,里面有很多 NSOperations。我想确保代码的特定部分不会并行执行。我使用这样的 NSLock 对象:

不幸的是,我收到以下错误,而不是阻塞“锁定”调用:

-[NSLock 锁定]: 死锁 ('(null)')

经过一番调查,我注意到所有 NSOperations 似乎都在同一个线程中运行。在记录线程 ID 后,我得出了这个结论:

所有操作似乎都在同一个线程中运行。即使它们作为操作并行运行。

那有意义吗?我有点困惑。我错过了什么吗?你觉得同时使用 NSOperation 和 NSLock 有什么问题吗?(如果不是,那么我确定错误在我的代码中)

0 投票
2 回答
494 浏览

iphone - 在 iPhone 上设计和启动冗长、依赖异步进程的最佳方式?

我正在设计一个 iPhone 应用程序。我有一个非常紧张的过程要开始,在高层次上定义如下:

  1. 用户从 UITableView 中选择项目进行应用内购买。
  2. 用户在 UI 中确认购买。
  3. 异步过程转到 App Store 以检查项目之前是否已购买。如果没有,则购买该项目。然后通知 iPhone 应用程序购买项目成功。(如果它是之前购买的,则应用程序不关心并继续执行第 4 步。)
  4. 然后,该应用程序会转到我的私人服务器以下载所购买商品的数据。
  5. 然后应用程序将数据导入 CoreData。

当然,在流程的每一步,都会向用户报告错误,整个流程就会停止。

我有一个名为 activityIndi​​catorController 的类,它为用户提供了一个不错的 UIActivityIndi​​cator 以及一些指示正在发生的事情的文本。在流程的每一步,activityIndi​​cator 上的标签都必须更新为新状态。

问题/疑虑:

从设计和编码的角度来看,最简单的事情就是在所有步骤中使用一个大的 NSOperation。但是,我担心这可能会在以后妨碍我。我不想走错路,然后不得不撕下一堆代码。

我的直觉告诉我最好实现三个独立的 NSOperations(OpInAppPurchase、OpDownload、OpImport)。但是,每个后续操作不仅依赖于它之前的操作,而且如果一个操作失败,则根本不应该调用其余的 NSOperations。但是,我不确定如何设计/编码。

任何帮助表示赞赏。

编辑:

感谢大家到目前为止的帮助。对于我想要完成的事情,我不希望用户取消操作。但是,我确实希望该应用程序能够取消后续操作。我没有意识到并且只是通过反复试验(即“duh”时刻)发现的是,当一个操作在一个单独的进程中启动时,任何被启动的子操作也在同一个单独的进程中执行.

在阅读了下面链接的 Apple 文章后,我发现 NSInvocationOperation 完全满足我的需求,并且使我不必为每个进程创建单独的 NSOperation 对象。然后,如果失败,它将使用 NSError 对象对主线程进行回调,或者在成功时对主线程进行不同的回调。

也许我会有一些其他的进程,我确实希望用户将来能够取消,我会将 NSOperation 与其他事件一起使用。

0 投票
2 回答
3330 浏览

cocoa-touch - 使用 UIImage 从 URL 异步加载图像时出现明显延迟

我正在尝试编写一个从 URL 加载图像的 iPad 应用程序。我正在使用以下图像加载代码:

所有这些代码都作为操作添加到 NSOperationQueue 中,因此它将异步加载,并且如果图像的网络服务器很慢,则不会导致我的应用程序锁定。我添加了 NSLog 行,这样我就可以在控制台中看到这段代码何时完成执行。

我一直注意到,在代码完成执行后大约 5 秒,图像会在我的应用程序中更新。但是,如果我自己使用此代码而不将其放入 NSOperationQUeue 中,它似乎几乎会立即更新图像。

延迟并不完全是由缓慢的网络服务器引起的......我可以在 Safari 中加载图像 URL,加载时间不到一秒钟,或者我可以使用相同的代码加载它而不使用 NSOperationQueue,它加载速度更快.

有什么方法可以减少我的图像显示之前的延迟但继续使用 NSOperationQueue?

0 投票
1 回答
760 浏览

objective-c - IOS4.2 应用程序以 EXC_BAD_ACCESS 退出

在 IOS3 下运行良好的 iPad 应用程序在 IOS4.2 下失败。它有一个类从操作队列运行 http 会话,并且失败与此活动相关联。这是控制台输出:

运行 NSZombies 启用并没有显示任何内容,因此我一直将 NSLog 语句放入代码中,发现当局部变量更改时会发生崩溃。这是代码部分:

这是控制台日志输出:

就像状态已变为只读(它的属性被声明为原子和读写)。

另一条相关信息是子视图刚刚被更改,它触发了对上述例程的调用。它的代码是:

有没有人见过这样的事情?

有没有人知道下一步该往哪里看?

问候罗宾

这是堆栈跟踪:

0 投票
1 回答
2465 浏览

iphone - 在for循环中取消NSOperation?

我正在尝试使用NSOperationon在后台线程上实现搜索iOS。我不想继承NSOperation,所以这就是我正在做的事情:

search 方法包括一个 for 循环,用于检查正在搜索的内容是否在数组中。现在,当我NSOperation通过调用取消时cancelAllOperations,for 循环继续在数组中运行。我想防止这种情况发生,并想知道从 for 循环中调用它是否合法:

0 投票
2 回答
2815 浏览

iphone - 如何为 nsoperationqueue 正确使用 autoreleasepool

我有一个正在重构的应用程序,我刚刚实现了多线程,以便 UI 可以运行得更流畅。在 iphone 模拟器中,我没有任何泄漏,但在运行 iOS 4.2 的 iPhone 3G 上进行测试时,我得到了内存泄漏。我已经做了很多寻找使用操作队列实现自动释放池的正确方法,我们将不胜感激。

我在我的视图控制器中创建了一个 nsoperationqueue

0 投票
3 回答
234 浏览

iphone - 以与 NSOperationQueue 相同的顺序接收数据

我有一个 NSOperationQueue,在其中我不断添加 NSOperation 对象,这些对象会命中服务器并带来数据。有没有办法按照它们被触发的顺序存储接收到的数据?例如,假设 A、B 和 C 对象以 ABC 的顺序添加到 NSOperationQueue 中。现在三个 A、B 和 C 中的每一个都将在其相应的线程中带来数据。我想将结果以相同的顺序存储在数组中,以便数组的内容变为“结果 A”、“结果 B”和“结果 C”。请为此问题提供解决方案或正确答案的方向。多谢你们

已编辑 - 基本上,我想设计一个自动提示组件,它从服务器中获取数据(与谷歌应用程序相同),我认为 NSOperationQueue 是实现这一点的最佳方法。目前我将 maxConcurrentOperationCount 设置为 1,但我想将其设置为大于 1,因为数据来自服务器的速度非常慢。请指出这个问题的正确解决方案或方向。谢谢

0 投票
2 回答
1449 浏览

iphone - 使用 NSOperationQueue 并尝试更改滑块/选择器等时在 iphone 设备上遇到大量泄漏

使用 NSOperationQueue 并尝试更改滑块/选择器等时,在 iphone 设备上遇到大量泄漏。

我可以毫无问题地更改标签,但是如果我尝试更改在界面构建器上创建的滑块或选择器,我会得到这些泄漏。

下面的代码