问题标签 [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 投票
3 回答
456 浏览

iphone - 使用 NSOperationQueue (iPhone) 时模型类中的非原子属性?

我有一个带有 NSMutableData ivar 的自定义模型类,将由自定义 NSOperation 子类(使用 NSOperationQueue)访问。我认为我可以通过使用依赖项来保证从多个 NSOperations 对 ivar 的线程安全访问,并且我可以通过等待 Q 完成所有操作来保证我不会从其他代码(比如我的主应用程序线程)访问 ivar .

我应该使用非原子属性规范,还是让它保持原子性?对性能有显着影响吗?

0 投票
1 回答
988 浏览

cocoa - 当对象从 NSOperations 添加到托管对象上下文时,NSOutlineView 不刷新

背景

  • 使用核心数据的 Cocoa 应用程序 两个进程 - 守护进程和主 UI
  • 守护进程不断写入数据存储
  • UI 进程从同一数据存储中读取
  • UI 中 NSOutlineView 中的列绑定到 NSTreeController
  • NSTreeControllers managedObjectContext 绑定到 Application 的 key path 为 delegate.interpretedMOC
  • NSTreeControllers 实体设置为 TrainingGroup(NSManagedObject 子类称为 JGTrainingGroup)

我想要的是

当 UI 被激活时,大纲视图应该使用守护程序插入的最新数据进行更新。

问题

主线程方法

我获取所有我感兴趣的实体,然后迭代它们,执行 refreshObject:mergeChanges:YES。这工作正常 - 项目正确刷新。但是,这一切都在主线程上运行,因此 UI 在刷新时会锁定 10-20 秒。好的,所以让我们将这些刷新转移到在后台运行的 NSOperations。

NSOperation 多线程方法

一旦我将 refreshObject:mergeChanges: 调用移动到 NSOperation 中,刷新就不再起作用。当我添加日志消息时,很明显新对象是由 NSOperation 子类加载并刷新的。似乎无论我做什么, NSOutlineView 都不会刷新。

我试过的

我已经搞砸了 2 天,并尝试了我能想到的一切。

  • 将 objectIDs 传递给 NSOperation 以刷新而不是实体名称。
  • 在不同点重置解释的MOC - 在数据刷新之后和大纲视图重新加载之前。
  • 我将 NSOutlineView 子类化。我丢弃了我的子类并将视图重新设置为 NSOutlineView 的一个实例,以防万一这里发生任何有趣的事情。
  • 在重新加载 NSOutlineView 数据之前添加了对 NSTreeController 的重新排列对象调用。
  • 确保我已在我使用的所有托管对象上下文中将过时间隔设置为 0。

我有一种感觉,这个问题在某种程度上与在内存中缓存核心数据对象有关。但是我已经完全用尽了所有关于如何让它发挥作用的想法。

我将永远感激任何能够阐明为什么这可能行不通的人。

代码

主线程方法

NSOperation 多线程方法

更新 1

我刚刚发现了这个问题。在发布我的之前,我无法理解我是如何错过它的,但总结是:Core Data 并不是为了做我正在做的事情而设计的。只有一个进程应该使用数据存储。

NSManagedObjectContext 和 NSArrayController 重置/刷新问题

但是,在我的应用程序的不同区域中,我有两个进程共享一个数据存储,其中一个具有只读访问权限,这似乎工作正常。另外,我关于这个主题的最后一个问题的答案都没有提到 Core Data 不支持这一点。

I'm going to re-architect my app so that only one process writes to the data store at any one time. I'm still skeptical that this will solve my problem though. It looks to me more like an NSOutlineView refreshing problem - the objects are created in the context, it's just the outline view doesn't pick them up.

0 投票
1 回答
1410 浏览

iphone - IconDownloader,延迟下载问题

我的问题描述起来很简单,但似乎很难解决。IconDownloader.m问题是加载图标,使用Apple 官方示例提供的自定义类,如果我释放视图,可以避免崩溃。

我已经将该IconDownloader类添加到我的应用程序中,但很明显,只有当 tableview 是根时,这种方法才有效。最大的问题是当视图不是根视图时。Fe:如果我开始滚动我的第二个视图(应用程序现在加载图标)并且没有时间完成下载,我回到根目录,应用程序崩溃,因为必须用新图标更新视图不存在了。

一种可能的解决方案是OperationQueue在视图中实现一个,但是通过这种方法,我必须在更改视图时停止队列,并在我回来时重新启动它,拥有 N 个队列的想法不会让我充满热情。

有人找到解决这个问题的好方法吗?

0 投票
2 回答
652 浏览

cocoa-touch - 可可和可可触感。如何从普通的 ole 指针创建 NSData 对象?

我在 NSOperation 实例中 malloc 了一大堆数据。我有一个指针:

如何将其打包为 NSData 实例并将其返回到主线程?我假设在转换为 NSData 实例后,我可以简单地调用:

是的?

另外,回到主线程如何检索指针?

谢谢,
道格

0 投票
2 回答
761 浏览

iphone - NSOperation 需要额外的保留

我正在开发一个 iPad 应用程序。它使用 NSOperation 在后台下载一些东西,由 NSOperationQueue 处理。我发现,除非我向 NSOperation 添加保留,否则在执行操作操作后我会崩溃。NSOperationQueue 的 addOperation 表示它保留了 NSOperation,而 NSOperation 本身保留了目标对象。因此,我不明白为什么需要我的额外保留。

这不会阻碍我的进步,除非我试图实现取消异步操作并在其位置创建一个新操作的模式。我还不能在 iPhone OS 4.0 上进行开发(它提供了 waitUntilFinished),所以我需要另一种方法来知道释放我的额外保留是安全的(或者找到一种根本没有额外保留的方法)。

有什么建议么?

0 投票
2 回答
1446 浏览

iphone - NSOperation KVO 问题

我正在使用以下函数在 nsoperationqueue 中的操作完成后通知我的应用程序,以便我可以安排取决于操作结果的任务。我正在使用:

我的问题是,由于分配给这些操作的任务大多是解析数据,如果我尝试点击其他按钮或基本上做一些导致动作的事情,我会得到以下异常:

我完全理解,因为我尝试在主线程上做其他事情,因此对主线程的调用:

未能被执行。但是这个问题的解决方案是什么,因为我希望既允许用户在发出请求后执行任何操作,又在完成分配给操作的任务后执行计划的操作。

真的有可能吗?

提前谢谢。

0 投票
1 回答
1254 浏览

iphone - 如何同步两个 NSManagedObjectContext


我正在开发一个使用 coredata 的 ipad 应用程序。它在网络上的数据库中下载信息,并将它们记录在 coredata 中。该应用程序基于拆分视图。我的问题是在后台进行数据的下载和记录。
以下是我的做法:
- 我创建了一个 NSOperation,用于下载和记录数据。
- 此 NSOperation 使用与 appDelegate 的上下文不同的 NSManagedObjectContext,由该函数返回,即在 appDelegate 中:

- 我在 NSOperation 中有一个观察者,当我保存上下文时,它将在 appDelegate 中调用此函数,以修改委托的上下文:

但是我有一个问题,同步不起作用,因为 rootViewController(即 UITableViewController)上的数据,具有使用 appDelegate 的上下文初始化的 NSManagedObjectContext 并用作 NSFetchedResultsController 的数据源,不会自动实现信息,因为它通常必须这样做。
所以我问你:
我做错了什么?使用两个不同的上下文并同步它们是好方法吗?

0 投票
2 回答
775 浏览

iphone - NSOperationQueue 调度线程缓慢?

我正在使用 NSOperationQueue 编写我的第一个多线程 iPhone 应用程序,因为我听说它比管理我自己的线程调度更好并且可能更快。

我正在计算生命游戏板的结果,方法是将板分成单独的部分,让单独的线程计算每个板,然后将它们拼接在一起,对我来说,这似乎是一种更快的方法,即使分割和拼接的开销很大. 我正在为每个板创建一个 NSInvocationOperation 对象,然后将它们发送到 OperationQueue。在我发送了所有的板子后,我坐下来等待它们都完成对 OperationQueue 的 waitUntilAllOperationsAreFinished 调用的计算。

这似乎应该可以工作,并且确实可以正常工作,但是线程被调用得很慢,因此实际上多线程版本的计算时间比单线程版本要长!哦不!我监视了发送到 NSOperationQueue 的 NSOperations 的创建和终止,发现有些只是在 Operation Queue do-diddly-daddlin 中坐了一会儿,然后才被调用。起初我想“嘿,也许队列一次只能处理这么多线程”,然后将队列 maxConcurrentOperationCount 提高到某个任意高的数字(远高于板件的数量),但我遇到了同样的事情!

我想知道是否有人可以告诉我如何将 NSOperationQueue 踢到“超速”状态,以便它尽快调度其队列,或者告诉我发生了什么!

0 投票
1 回答
383 浏览

uiview - NSOperation 未将子视图添加到主视图

我在使用 NSOpeation 时遇到了一个奇怪的行为。我正在调用一个函数 (-createTagView),该函数创建一个 UIButton,然后将其添加到视图中。由于某种原因,它没有添加它们。如果我从 NSOperation 外部调用该函数,一切正常。

有任何想法吗?谢谢。

这就是我创建 NSOperation 的方式(在 ViewController 对象中)

这是调用的函数([Tag view] 是 UIButton):

0 投票
2 回答
803 浏览

objective-c - 为什么自动释放的 NSTask 会无限期地阻塞 NSOperation 线程上的运行循环?

我尝试NSTaskNSOperation.

这是我整理的一个非常简单的应用程序来展示这个问题。单击按钮时,将NSOperation排队。它设置一个NSRunLoop, 并调用一个调用NSTask. 这个任务真的很简单——它只启动/bin/sleep两秒钟(当一切正常时,足以很容易地看到微调器)。

该应用程序的工作原理与宣传的一样,但是如果您将 TaskPerformer.m 的第 23 行更改为autorelease, (对不起,我是新海报,所以我无法直接链接)或完全注释掉它(从而泄漏NSTask对象),NSOperation' s 线程永远不会退出。它的主要运行循环似乎阻塞了某些东西。

现在,这里的问题是双重的。首先,我不明白为什么我的线程会阻塞,但此外,如果我为此应用程序打开垃圾收集,同样的行为会表现出来。因为我无法手动释放NSTask,所以无论如何线程都会阻塞。

如果有人能告诉我发生了什么,我将永远感激不尽!