问题标签 [nsoperation]

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 投票
7 回答
43143 浏览

iphone - iPhone 上的 NSOperation

我一直在寻找一些具体场景,NSOperation说明 iPhone 何时是在应用程序中使用的理想工具。据我了解,这是围绕编写您自己的threaded代码的包装。我还没有看到任何使用它的 Apple 演示应用程序,我想知道我是否错过了一个很棒的工具而不是使用NSThread.

这里的理想解决方案是描述一个用例场景NSOperation以及如何使用它来解决您的问题。

0 投票
15 回答
50747 浏览

iphone - 当 NSOperationQueue 完成所有任务时获取通知

NSOperationQueuewaitUntilAllOperationsAreFinished,但我不想同步等待它。我只想在队列完成时在 UI 中隐藏进度指示器。

实现这一目标的最佳方法是什么?

我无法从我NSOperation的 s 发送通知,因为我不知道哪一个会是最后一个,并且[queue operations]在收到通知时可能还不是空的(或更糟糕的是 - 重新填充)。

0 投票
2 回答
3161 浏览

objective-c - 如何在 iPhone 上使用带有线程的 sqlite + fdbm 库

这个 SO question相关,我想将数据加载放在后台。

但是,我收到“按顺序调用的库例程”错误。

这个 SO 线程中说方法是使用 NSOperation,但是查看网络上的示例我不知道如何解决这个问题。

我与单例模式共享一个 sqlite 连接:

所以更难打开两次相同的分贝......

有任何想法吗?

编辑:

我确认错误在于调用 sqlite。我使用 FDBM 作为瘦包装器来调用它。

我正在运行 2 个线程:用于加载数据的主任务和后台任务。我这样运行它:

db 接口的代码位于http://code.google.com/p/chibiorm/source/browse/#svn/trunk/src — 特别是 Db.h/m 是唯一与 fdbm/ 接口的单元sqlite。

尝试从 FDBM 调用 sqlite 函数时发生错误。

例如发生在这里:

这调用了 FDBM 代码:

0 投票
3 回答
1049 浏览

iphone - NSOperation + Objective-C 类别 = 坏主意?

我为 iPhone 应用程序的UIImageView类设置了一个 Objective-C 类别。该类别的任务是帮助通过内存/磁盘缓存异步加载基于 URL 的图像。

现在,在 UIImageView+Cache.m 中,我可以访问NSOperationQueue,以便启动加载线程。我创建了一个NSOperation派生对象,使用图像 URL 和目标 UIImageView 进行了初始化,并在操作完成后在目标上执行了一个选择器。在 selector 方法中,我们设置了新加载的图像(或者,如果没有找到,我们设置一个替代的占位符图像),我们就完成了!

这工作正常,直到 UIImageView在 NSOperation 完成之前被删除。例如,我的 UI 中有一个上一个/下一个分段控件,它会导致这些 UIImageViews 被删除并重新添加(它们是在应用程序中查看的更大“项目”的一部分),因此很容易点击这些快速连续。

因此,如果您决定在所有图像加载之前开始敲击 - KABLAM!不开心的线程有一个无效的对象并且不知道它。:(

我能找到的最有助于缓解这种情况的方法是 NSOperation 的cancelisCancelled方法,但您无法跟踪类别中要取消的操作对象,因为 - 如果我理解正确 - 类别无法将 IVAR 添加到对象!

也许这意味着类别在这里不是一个好主意?(呜咽:“但我喜欢分类!哇!”

建议赞赏!

0 投票
3 回答
6537 浏览

iphone - Cocoa - 从 NSOperation 返回信息

我有一个使用网络服务从服务器获取数据的 iPhone 应用程序。我将对网络服务的每个调用都放在一个 NSOperation 子类中,以便它可以被线程化。我的问题是,从已完成的 NSOperation 子类传回信息的推荐方法是什么。我目前正在我的主要方法结束时发送一个 NSNotification ,并且任何等待 NSOperation 完成的代码都订阅了通知。然后我将使用 NSNotificationWithName:Object: 的对象部分从操作中传回信息。

我不确定是否有更好的方法来做到这一点。我听说过键值编码,然后我可以使用键值观察来检测操作的 isFinished 属性何时更改,但我不确定最佳实践是什么。

我还试图确保我的应用程序是线程安全的,我认为这不会是一个问题,只要我的通知是在 main 方法结束时发出的,因此通知中的对象将不再被使用在线程中,因为它会结束。

最后,我这样调用通知:

0 投票
1 回答
935 浏览

iphone - 使用 NSOperation 进行线程处理会创建太多对象

我有一个进行 SOAP 调用的应用程序。为了防止 UI 阻塞,我们将每个 SOAP 调用放入 NSOperation 的子类中。这很好用,但是我们有大量不同类型的 SOAP 调用。因此,如果我们使用 3 个 WSDL,每个 WSDL 有 10 个端口或操作,那么我们在 SOAP 中有 30 个不同的调用,如果我们使用 NSOperation 将每个调用放在一个线程中,我们最终会得到 30 个 NSOperation 子类。

这可能不是一件坏事,但我们正在尝试创建一个可重用的库,因此每个 WSDL 都有一个对象来封装调用。这很好,因为我们使用的是 WSDL2ObjC,它封装了所有逻辑。但是在这么多的 NSOperations 中有一个很好的 api 来包装调用似乎很奇怪。此外,我们正在 api 本身中进行线程化,以便调用者可以按照他/她认为合适的方式使用它。

任何建议都会很棒。

0 投票
1 回答
15683 浏览

iphone - 如何在 NSOperation 中执行异步 NSURLConnection?

我想在后台线程上的 NSOperation 内执行异步 NSURLConnection 。

(这是因为我在数据返回时对数据进行了一些非常昂贵的操作,这些操作希望在数据进入和后台时完成)

这是我的第一次尝试:

在我的 AppDelegate 中:

这是我的操作:

当它运行时,我在日志中看到以下消息:

这个事件发生在最后 [self didChangeValueForKey:@"isFinished"]; 这表明我设置 NSOperation 错误。

0 投票
2 回答
582 浏览

iphone - 使用 NSOperation 时的 EXEC_BAD_ACCESS

这与我遇到的问题几乎相同,只是代码非常不同:http: //www.cocoabuilder.com/archive/message/cocoa/2009/3/24/233015

我想将一些处理卸载到 NSOperation,将文件名作为 NSOperation 加载和解析的引用传递。EXEC_BAD_ACCESS该应用程序在进入时崩溃-(void)init

这是我启动操作的方式:

在剥离了我的 NSOperation 中的所有内容后,我仍然以崩溃告终。以下代码崩溃:

这是崩溃的汇编程序输出(我不是忍者,无法理解它所说的内容)。这发生在 __opLock 中的 addOperation 之后

有任何想法吗?:)

0 投票
2 回答
1817 浏览

cocoa - 如何将 NSProgressIndicator 绑定到 NSOperation 的属性?

我有一个反映NSOperation. 我应该如何将 绑定NSProgressIndicatorNSOperation的进度属性?

0 投票
3 回答
1211 浏览

objective-c - Snow Leopard 上的 NSOperationQueue 有多轻量级?

我正在使用一些代码,这些代码使用各种回调执行一堆异步操作;Snow Leopard 使用积木和 GCD 让这一切变得异常简单。

我是这样打电话NSTaskNSBlockOperation

这种方法非常有效。这就像魔术一样,只要我的回调正确处理并发。

现在,我希望能够合并其中的一些调用;这是在模型对象的“刷新”方法中,可能需要很长时间才能完成。让用户点击刷新按钮不应该占用机器等等。

我可以在这里看到一个实施困境。我可以创建一大堆队列——每种呼叫类型一个——并将它们的并发操作计数设置为 1,然后-cancelAllOperations在需要进行新呼叫时进行呼叫。

或者,我可以对当前正在发生的调用进行更多的手动簿记,并为每个模型对象管理一个队列(就像我正在做的那样),或者我可以更进一步并使用全局队列。

有多重NSOperationQueue?创建大量队列是一个糟糕的架构决策吗?有没有更好的方法来合并这些任务?