问题标签 [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.
objective-c - 内部连接取消操作
我有一个使用 NSURLConnection 下载一些数据的 NSOperation,它看起来有点像这样:
问题是连接不时挂起,并且由于没有其他源触发,循环一直在运行,没有机会取消操作。由于我的操作队列中有 1 个操作的限制,所以一切都卡住了。
问题是什么是这个问题的最佳解决方案。
- 使用更小的时间段(例如半秒)来代替 distinctFuture。(可能会吃掉额外的 CPU 周期)
- 尝试在 ivar 中存储对正在运行的线程的引用,并通过在操作的取消方法中对线程执行选择器来触发运行循环。(可能会导致我们在已经退出且将不再运行的运行循环上排队选择器,据我所知,这会导致泄漏)
或者也许还有另一种方式?
iphone - 如何正确使用 Core Data 进行多线程处理?
我在尝试在线程化 NSOperation 中执行一些核心数据操作时遇到了很多问题。
目前,我在我的应用程序委托中创建了一个托管对象上下文,它纯粹用于我的线程化 NSOperations。我设置了一个最大并发为 1 的 NSOperationQueue,因此每个操作都是连续执行的。对于每个操作(从 Internet 获取数据并创建新的托管对象),我都会将上下文传递给它以供使用。创建新对象后,我保存并重置上下文以供下一个操作使用。但是,我在执行此操作时间歇性地遇到 malloc 错误,并且我花了几天时间试图弄清楚它,这似乎与它的线程化方式有关。
我得到的错误可以在这个相关的堆栈溢出问题中看到。
当我只是将托管对象的属性设置为对象时,会发生 malloc 错误NSNumber
。这也是我第一次设置该属性,所以我没有过度释放自己!我根本想不通,我无法使用 GuardMalloc 重现错误,它只是不会发生!就好像错误发生在其他被触发的地方,但我不知道在哪里!
我所能推断的就是这个错误与我如何设置整个事情有关。我尝试自己运行该操作而不是将其添加到 中NSOperationQueue
,它似乎工作正常(尽管它挂起主线程!)。
当进行保存时,我还需要上下文来通知我的应用程序中的其他上下文,所以我观察它的NSManagedObjectContextDidSaveNotification
通知。但是,由于保存是在 NSOperation (其他线程)中执行的,因此是否会出现问题,因为通知仅在其运行的线程上分派?
iphone - initWithContentsOfURL 在 NSOperation 子类中泄漏内存。还有人看到这个吗?
过去几个小时我一直在 Instruments 上生活,盯着一个令人费解的内存泄漏。我已将其隔离到我编写的 NSOperation 子类中的这一行代码中:
这将定期泄漏 3500 字节。还有人看到这个吗?如果是这样,是否有解决方法?
提前致谢。
更新:
这是我的 NSOperation 子类的 main() 主体中的相关代码部分:
如您所见, sequenceData 和 sequenceString 已正确释放。此外,我已经确认这个子类(染色体等)的所有 ivars 都得到了适当的内存管理。
-道格
iphone - 主线程在等待 NSOperationQueue 操作取消时无限期挂起 [仅在设备上!]
我的主线程上有一个 NSOperationQueue,它运行一组我希望能够随时取消的 NSOperations(最大并发设置为 1)。当我按下一个按钮时,我告诉队列取消所有操作并等到完成。这应该挂起主线程,直到操作队列为空,但是它无限期地挂起我的主线程。
这是我用来阻止它的代码:
注意:我需要使用waitUntilAllOperationsAreFinished
,因为进一步的流程要求队列为空。
奇怪的是,这只发生在设备上。在模拟器中运行时,它按预期工作。
我已经观察了断点,我可以跟踪当前正在运行的操作,直到它完成。它检测到 [self isCancelled],停止它正在做的事情,然后一直运行到main
方法的末尾。我可以看到操作中没有任何内容导致它挂起,并且通过取消所有操作,其他操作都不应该开始,队列应该完成。我已经通过添加断点进行了检查,并且没有其他操作开始。
为什么会这样?
iphone - 主线程上的 NSOperation 和 NSNotificationCenter
我有一个 NSOperation。完成后,我触发 NSNotificationCenter 让程序知道 NSoperation 已完成并更新 gui。
据我了解,NSNotification 的侦听器不会在主线程上运行,因为 NSOperation 不在主线程上。
当我触发我的事件时,如何让监听器在主线程上运行?
iphone - NSAssert 在线程中的使用
我正在尝试在NSAssert
整个 iPhone 应用程序中使用,以便如果发生意外情况,应用程序会快速失败并在崩溃日志中显示有意义的消息而崩溃。
如果失败发生NSAssert
在主线程上,这可以正常工作,因为NSInternalInconsistencyException
默认情况下它会引发未捕获并停止执行。但我也在后台线程中进行处理,在这种情况下NSAssert
只是中止线程,但编程继续运行。
我目前的解决方案是在主线程中捕获并重新抛出异常(在本例中为NSOperation
'smain
方法):
有没有更好的办法?也许使用自定义的 NSAssertionHandler?
我知道我可以将 Cassert
与静态注释一起使用:
但这不允许我展示实际失败的价值x
是什么。
iphone - 如何优化来自 NSOperationQueue 启动线程的回调
考虑一下:
用英语:
我有一个在主线程中运行的视图控制器,它带有一个子模型对象来做某事(通过网络获取数据)。视图控制器是孩子的委托,所以孩子可以用委托发回结果。为了执行昂贵的工作,我使用 NSInvocationOperation 生成 child.doSomething 方法,该方法在后台线程中启动操作。完成后,子进程调用委托(视图控制器)的 callbackA 或 callbackB 并得到一些结果。由于(我认为)这些回调是在运行 doSomething 调用的同一后台线程中调用的,因此我需要调用 performSelectorOnMainThread 将控制权转移回主线程。
这很好用,但我不喜欢每个回调都有两个与回调相关的方法。(实际上有更多的回调,所以真正的代码更加臃肿。)理想情况下,我会做这样的事情:
问题:
1)如何进行“not_running_on_main_thread”测试?
2)还有其他方法可以减少回调膨胀吗?
编辑:好的,我在发布之前从未阅读过 NSThread 文档 :) 看起来 [NSThread isMainThread] 是我正在寻找的。但是有没有其他方法可以重组或让它变得更好呢?
ios - NSOperation 阻止 UI 绘画?
我对使用NSOperation
和绘图有一些建议:
我有一个主线程创建我的NSOperation
子类,然后将其添加到NSOperationQueue
.
我NSOperation
做了一些繁重的处理,它打算在它的 main() 方法中循环几分钟,不断处理一些工作,但现在我只有一个 while() 循环,里面有一个 sleep(1),它被设置为 go大约只有 5 次(用于测试)。
产生它的主(原始)线程NSOperation
负责绘制到视图并更新 UI。
我打算让 NSOperation 线程使用通知来告诉主线程它已经完成了一些处理,目前这个通知在每次通过它的 while() 循环时发送一次(即每秒一次,因为它只是在做睡眠(1))。主线程(视图)注册以接收这些通知。
通知立即进入主线程,看起来是异步的,看起来还不错。似乎两个线程都按预期运行......也就是说 - 同时运行。(我使用 NSLog() 只是为了大致检查每个线程何时发送和接收通知)。
当视图收到通知并调用其处理程序方法时,我只需增加一个整数变量,并尝试将其绘制到视图(当然作为字符串)。在测试中,drawRect: 中的代码将这个整数(作为字符串)绘制到屏幕上就好了。
但是:这是我的问题(抱歉,这里花了一点时间):当主线程(视图)收到来自 NSOperation 的通知时,它会更新这个测试整数并调用 [self setNeedsDisplay]。但是,在 NSOperation 完成之前,视图不会重绘自身!我预计 NSOperation 作为一个单独的线程将无法阻止主线程的事件循环,但似乎这就是正在发生的事情。当 NSOperation 完成并且它的 main() 返回时,视图最终会立即重新绘制自己。
也许我没有NSOperation
正确使用。我在“非并发”模式下使用它,但尽管有这个名字,我的理解是它仍然会产生一个新线程并允许异步处理。
非常感谢任何帮助或建议,如果您想查看一些代码,请告诉我。
iphone - NSOperation 用于在解析数据时绘制 UI?
希望你们能帮助我:)
在主线程中,我创建了一个 NSOperation 并将其添加到队列中。该操作所做的是使用 NSURLConnection 连接到数据服务器,保存收到的数据并解析它。
操作.m
然后在这个 NSURL 委托方法中,我解析刚刚从服务器接收到的数据。
操作.m
在数据中,我可以找到诸如 screenItem、CellItem、TextItem 之类的项目,这些项目在到达时发送到主线程以绘制它们。(如果 itemTable 到达,我创建一个 UITableView,或者如果 itemWeb 到达,我创建一个 UIWebView)
使用它发送项目到主线程:
操作.m
然后在通知接收器中:
AppDelegate.m
我的问题是直到 NSOperation 完成后才绘制 UI。我认为 NSPertion 作为一个不同的线程,不会阻塞主线程,但相信这就是正在发生的事情。
这个问题的一些提示?
非常感谢阅读!
cocoa - ASIHTTPRequest 在同步模式下吞噬了我的 NSOperation 变量
嘿,我一直在与这个问题作斗争一段时间。也许我在多线程知识中缺少一些东西,但这就是发生的事情。当我创建一个 nsoperation 队列时,所有分配的变量在“[request startSynchronous];”之后都会被清除。行代码。这就是我所说的:
对象在这里仍然存在
[请求开始同步];
然后对象消失在这里!
我确信这与原则理解上的差距有关,但我几天来一直在重新安排代码,但没有成功。
...