问题标签 [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.
iphone - iPhone / iOS popViewControllerAnimated 不刷新屏幕
.navigationController popViewControllerAnimated:YES
从NSOperation
屏幕未正确更新并使弹出视图可见但显然已解除分配的位置调用时,我遇到了一个奇怪的问题。
详细信息:我有一个访问本地sqlite
数据库的列表视图。当点击一条记录时,它会显示该记录的详细视图并启动一个异步 NSOperation(在主线程上)以检查 XML 后端数据库以查看该记录在数据库中是否仍然可用。由于架构原因,我不会进入,我无法在列表视图上运行此操作,它必须在详细视图中。如果自上次同步后删除了记录,它会通知用户该记录已被删除,并popViewControllerAnimated
在共享应用程序委托上调用。理想情况下,这将弹出当前详细视图并返回到先前的列表视图。
错误:正确的视图实际上已在内存中弹出(已被释放),但仍显示在屏幕上。导航栏是空白的,但我可以点击“返回”按钮应该在的位置,它会在列表视图之前导航到开始屏幕,这意味着至少导航栏知道它应该在哪里,甚至如果它没有正确显示标题或后退按钮。主要问题是详细视图仍然可见并且可以与之交互,这会导致应用程序崩溃。例如,详细视图还显示 a 中的数据UITableView
,如果用户在表格中向下滚动,则会引发异常“-[xAccountDetailController tableView:cellForRowAtIndexPath:]:
消息已发送到已释放实例”
这让我相信细节控制器已经被popViewControllerAnimated
调用正确地释放了,但是如果表实际上调用了,那么显然有些东西仍然驻留在内存中cellForRowAtIndexPath
,即使它的视图控制器已经从导航控制器中弹出。
在“详细信息”视图中手动按下后退按钮(对于未在后端删除的记录)效果很好。
解决方法尝试:当我向 NSOperation 传递对详细视图控制器的引用时,我试图popViewControllerAnimated
直接从该视图的 navigationController 属性和共享应用程序委托调用。我还尝试弹出两个视图并将列表视图重新推送到 navigationController 上,但这会带来更令人不安的界面效果,其中根视图控制器和列表视图控制器似乎同时存在于导航栏中(标题相互覆盖而不是不存在)。我试图将 NSOperation 中存在的详细视图控制器的引用设置为 nil,但这没有任何作用。我尝试[detailView release]
在弹出之前调用 a ,但正如预期的那样,它在弹出时失败,因为它在发布之前只有 1 的保留计数。我'popToViewController
而且popToRootViewController
似乎没有任何效果。旧视图始终存在,导航栏是唯一似乎可以做任何事情的界面元素,即使那样,它也显示不正确。我也尝试过重新加载表格,因为我真的不介意视图是否保持可见(没有弹出),我只想清除数据——但表格由于某种原因不会重新加载数据。
想法:由于运行 NSOperation 的 operationQueue 是相关详细视图的属性,因此我确保在详细视图的 dealloc 中取消所有操作并将对 operationQueue 的引用设置为 nil。我还尝试确保其他对象中对该视图的所有引用都设置为 nil。直接从详细视图上的按钮调用popViewControllerAnimated
可以完美运行,所以一定是我从 NSOperation 调用该方法,在 NSOperationQueue 上运行,这是我想要弹出的详细视图的属性。某处的某些引用必须使该视图部分保持活动状态,但是当调用 pop 时,我似乎找不到任何仍在引用该视图的内容。
太多地方的代码太多了,无法在这里发布。
有什么想法吗?
抱歉问了这么长的问题,提前谢谢,
格雷格
编辑 1:我可以使用新的 UIViewController 在 NSOperation 之外轻松重现此问题。
在一种tableView:didSelectRowAtIndexPath
方法中,我调用以下内容:
在vc中,popView方法:
我认为这与保留计数或 NSOperation 无关。以这种方式弹出视图,我在做一些根本错误的事情吗?
iphone - NSOperation 队列问题
您好,我有 2 个方法在同一方法 redrawView 上访问,它们是 moveThePlayerWithDeltasAndQueue 和 movethePlayerAroundYAxisAndQueue 我想使用注释代码中的操作队列,但我没有运气很好地运行它什么是构建队列的正确方法和让他们工作好吗?
iphone - NSOperation(s) 仅在 iOS 3 设备上泄漏
我有一些处理 CoreData 导入的 NSOperations 子类。我相信我已经勾选了大多数非主线程问题
main
我在方法中创建了自己的自动释放池NSManagedObjectContext
我为每个操作创建一个
这些操作被加载到一个 NSOperationQueue 中,最大并发操作数设置为 1。
该代码在 iOS 4.0.1 上完美运行,但在 iOS 3.1.3 设备上会收到大量日志消息,如下所示
NSOperation 子类主方法
__lookup:inContext:
方法_
大多数其他方法的实例方法,即threadContext
看起来与__lookup:inContext:
方法相似。我知道我不会为实例方法创建 Autorelease 池,但根据我对 autorelease 工作原理的理解,只要这些方法仅在 main 方法内部调用,在NSAutoreleasePool
创建之后,最外层池应该使用。我懒惰地创建诸如 NSManagedObjectContext 之类的对象,并且在大多数情况下不使用该start
方法
iphone - 带有 NSOperations 的 iOS 应用架构
两个月前,我开始编写一个新的 iPhone 应用程序,为此我创建了一个通用的 RESTFul Web 服务,它允许我拥有许多这些必要的功能,例如用户身份验证、用户配置文件、友谊系统、媒体处理、消息传递系统等等。在我看来,有几个用例可以将这个 Web 服务重用于未来的 iPhone 应用程序。
带着这种心态,我决定为这个应用程序(以及所有未来的应用程序)编写一个静态库,以处理所有繁重的工作,如媒体(图像、视频、声音)设置和处理、与 Web 服务通信、解析和映射结果,处理CoreData等。
鉴于我的应用程序有很多并行任务正在运行(最坏情况)的场景,例如用户当前更改了他/她的个人资料图片,而应用程序将用户位置发送到服务器(在后台)并且新的推送通知是已收到。
因此决定将每个逻辑操作(如 SendUserLocation 或 GetCurrentFriendList)封装在一个 NSOperation 中,并将它们添加到一个服务队列(NSOperationQueue)中。
当操作成功地从 web 服务获得结果并且现在应该处理它时,每个操作都能够产生子任务。
一个典型的 ServiceManager 方法看起来像
每个操作、请求(对服务器)和 subTask 都使用 GUID 作为 notificationName,以在完成处理时通知父对象。如果操作中的所有内容都已完成,它会将通知发送回用户界面。
也就是说,添加和删除子任务的代码如下所示
现在我所要做的就是在我的 gui 中调用 serviceManager 来启动一个特定的操作,比如
如果我想注册一个观察者,我只需传递一个观察者对象和一个像这样的选择器
最后但并非最不重要的问题:“架构”运行得非常好且稳定,但值得做吗?它会产生过多的开销吗?它甚至有意义吗?您个人如何实现并发操作?
最好的亨利克
PS 随意编辑我的问题,提出问题(作为评论),给我起这个想法的名字。
我真的很难解释它,主要是因为我不是以英语为母语的人。不要误会我的意思。我写这篇文章不是为了炫耀。我想做的就是学习(也许写一个更高级的iphone/objective c问题)
iphone - NSOperationqueu 的 NSURLConnection 问题
您好我正在尝试创建一个 NSOperaion 队列来下载一堆 PDF 文件。但它不起作用。NSURLConnection 没有调用委托方法,因为我将它们放在 NSOperation 队列中......任何替代方法或解决方案???
iphone - 将 NSOperation 子类化为并发和可取消
我找不到关于如何将子类化为NSOperation
并发以及支持取消的好的文档。我阅读了 Apple 文档,但找不到“官方”示例。
这是我的源代码:
在我找到的示例中,我不明白为什么使用 performSelectorOnMainThread:。它会阻止我的操作同时运行。
此外,当我注释掉该行时,我的操作会同时运行。但是,isCancelled
即使我调用了cancelAllOperations
.
iphone - 为什么我的 NSOperationQueue 在 iOS 4.0 中的行为不正确?
我之前在 iPhone OS 3.0 中的 iPhone 应用程序中使用过 NSOperationQueue,但现在在 iOS 4.0 中代码无法正常工作。它只在所有后续调用中正常运行一次,它不起作用。iOS 4.0 中的 NSOperationQueue 有变化吗?
相关代码如下:
iphone - Crashing with ASIHTTPRequest and NSOperationQueue when cancelling operations
I'm having a really hard time when trying to cancel requests in an NSOperationQueue.
Before deallocating my 'engine' object, I call a cancelOperations method to cancel everything in the queue, so this will include in flight ASIHTTPRequests and queued ones... e.g.
Engine.m
Now, In my engine I have a number of getContent type methods, so my queue has different request objects in it. The flow when using an Engine object is:
1) Open View Controller - view did load - alloc and init Engine object
2) // Call various getContent style methods to queue up some operations
3) Upon view exit, call [engine cancelOperations]; in order to (a) Stop any network requests in flight, and to also empty the queue
4) Deallocate the view, and with that the engine: [engine release];
This works fine if all requests have finished in the queue (as it's empty), however if I cancelOperations whilst a request is active, the application crashes with a EXC_BAD_ACCESS error... but AFTER the engine is deallocated successfully...
Any ideas why this would be?
--EDIT-- Adding Backtrace for error:
objective-c - NSOperation 最佳实践,响应取消
在我的 NSOperation 子类中,我在子类方法中的长循环顶部或任何长方法(核心数据提取、数组排序等)之前检查取消main
。请参阅下面的示例。
除了排干游泳池并尽快退出该方法之外,我还应该做些什么吗?
iphone - 关于在 iphone OS 中使用 NSOperationQueue 和 NSOperation 的问题
我使用 NSOperation 执行任务:使用 NSURLConnection 下载一些文件,然后合并占用大量 CPU 和内存的文件
我需要在新/后台线程中执行任务
所以我将这些任务添加到 NSOperationQueue 并设置 maxConcurrentOperationCount = 2
但结果是在合并文件时它会阻塞主线程(UI 暂时没有响应),似乎没有在新/后台线程
中执行如何让它按我预期的那样运行?