问题标签 [nsblockoperation]

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

objective-c - 奇怪的核心数据行为

我使用一个和在这个块内执行一些工作NSBlockOperation,持久存储丢失了它的持久存储。

以下代码:

记录下来:

托管对象上下文是 < NSManagedObjectContext: 0xa46ff10 >

----->删除上下文的持久存储有1个存储

操作块中的托管对象上下文是 < NSManagedObjectContext: 0xa46ff10 >

操作块中的持久存储协调器是 < NSPersistentStoreCoordinator: 0xa1a45e0 >

操作块中删除上下文的持久存储有 0 个存储

*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“此 NSPersistentStoreCoordinator 没有持久存储。它无法执行保存操作。

我不确定为什么会突然丢失存储,这可能是因为它在我设置为使用内存存储的测试套件中运行,并且内存不与NSOperationQueue执行块的它共享吗?

0 投票
0 回答
390 浏览

objective-c - NSBlockOperation 是串行的吗?

我们可以一个接一个地添加块。这些会被连续执行吗?

我想不出任何原因。没有什么是具体的。

这不是 NSOperationQueue。这是 NSBlockOperation 也可以有几个块

0 投票
1 回答
8048 浏览

ios - NSOperationQueue 的 addOperation: 操作完成,不能入队?

注意:
这只是一个概念验证。
真正的后台任务将是不断请求原始数据的“HTTP Get”并通过主线程显示;一经请求。

场景:
1)按需切换后台任务(循环)。
2) 后台任务在每次迭代时通知主线程 UI。
3) 队列中仅运行一 (1) 个块操作。

Modus Operandus
1) 使用 NSBlockOperation 来包含后台代码。
2)使用区域BOOL来切换循环;通过 IBAction。

问题
1) 编译器将 BOOL 'isRunning' 标记为链接:

在此块中强烈捕获“自我”可能会导致保留周期。


2) 在尝试添加块操作之前,我检查了队列中是否有任何操作。
但我总是收到以下错误:

-[NSOperationQueue addOperation:]:操作已完成,无法入队

除了所述的问题外,这个概念验证似乎是有效的。

问题:
1) 为什么编译器将 BOOL 'running' 标记为强行,而它只是一个缩放器?
2) 如果队列中没有找到,为什么我不能通过添加另一个 NSBlockOperation 来重用 NSOperationQueue?

以下是整个代码:

控制台输出:

0 投票
0 回答
103 浏览

ios - 同步下载音频文件表单服务器时出错

我正在使用NSBlockOperation其中我试图从服务器下载音频文件并将其存储在文档目录中。

我进行了同步调用以下载音频文件。但是它花费了太多时间,并且在很长一段时间后它返回零字节的 NSData。我认为这是由于我的请求超时 60 秒。然后我删除了超时请求,但问题仍然存在。我的查询是

  1. 超时与服务器连接有关,与从服务器获取数据无关
  2. 服务器的零字节响应应该是什么原因。
0 投票
1 回答
149 浏览

ios - 在 UIWebView 上设置强大的 NSBlockOperation。这是一个坏主意吗?

我正在调试我的应用程序的一个有趣问题。

该应用程序针对 iOS6.1,并且使用 ARC。这是一些背景,因为它太大而无法将粘贴复制到 SO。

有一个具有子视图控制器的仪表板类。这个子视图控制器相当大,它有两个滚动视图,它们是根据仪表板控制器交给它的 CoreData 对象动态创建的。当仪表板控制器使用子控制器完成时,它会破坏它并创建另一个具有不同核心数据对象的控制器。

子控制器中动态创建并填充到 UIScrollView 中的视图之一是 UIWebView 的子类。让我们称之为 SubWeb。当创建 SubWeb 的实例时,它使用 NSOperationBlock 通过网络进行一些文件获取以及其他一些事情(写入磁盘、加密等)。完成后,它需要能够将文件或网页插入到 SubWeb 实例中。

我通过赋予 SubWeb 一个强大的属性来解决这个问题。这是我的问题:我的清理永远无法破坏子视图控制器或子视图;我已经通过针对我的班级的仪器分配研究证实了这一点。通过创建和销毁子视图控制器(和 SubWeb 对象),我可以观察子视图控制器和 Sub wWeb 对象的内存分配,直到应用程序崩溃。奇怪的是,当我将 NSBlockOperation 设置为 weak 时,destroy 例程会按照我的预期进行。

我需要强引用,因为我只用一个真实文件预先加载了几个 SubWeb 对象来启动,然后如果用户滚动到它们,我会通过推送属性来延迟加载所需的文件

当子视图控制器和 SubWeb 视图的实例未清理时,这是我指的 WebView:

这是清理后的 WebView(但是 - 现在,当我需要它们时,惰性 Blocak 操作为空:

唯一的区别是强类型和弱类型。有没有人使用过 NSBLockOperation 进行这种类型的延迟加载操作?有没有一种不同/更好的方法可以用来解决延迟加载?

0 投票
3 回答
26538 浏览

ios - 带有 NSBlockOperation 和队列的 NSURLSession

我有一个应用程序,目前NSURLConnection用于其绝大多数网络。我想搬到那里,NSURLSession因为苹果告诉我这是要走的路。

我的应用程序只是NSURLConnection通过+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error类方法使用同步版本。我在NSBlockOperation运行中执行此操作,NSOperationQueue因此我不会不必要地阻塞主队列。以这种方式做事的一大优势是我可以使操作相互依赖。例如,我可以让请求数据的任务依赖于登录任务的完成。

我没有在NSURLSession. 我能找到的只有一些文章嘲笑我甚至考虑同步使用它,而且我是一个阻塞线程的可怕人。美好的。但我认为没有办法让NSURLSessionTasks 相互依赖。有没有办法做到这一点?

或者有没有描述我将如何以不同的方式做这样的事情?

0 投票
2 回答
10654 浏览

ios - Objective-C中另一个线程中的计时器

我必须定义应该以一定时间间隔定期调用的方法。我需要在另一个线程(不是主线程)中调用它,因为该方法用于从外部 API 获取信息并在核心数据中同步数据。

如何定义此方法以不阻塞主线程?

0 投票
1 回答
109 浏览

ios - 在执行使用对 self 的强引用的块时更改 self 的 @property 值

我正在我的应用程序中处理网络请求,并在 NSOperationQueue 中使用 NSBlockOperations 来异步执行此操作。但是,如果调用它们的视图控制器被释放(已从导航堆栈中弹出),我希望能够取消这些操作。

这是我所拥有的简化版本:

refreshPostsInPart:DataController 的方法中,我使用 while 循环对来自 App.net 的分页数据进行重复的网络请求。在循环的每次迭代中,我都会检查 DataController 的属性self.isCancelled(类型为 BOOL),如果是,NO我会继续发出请求。

在我dealloc的 DataController 方法中,我将此属性设置为YES,以便在 while 循环的下一次迭代中,我将停止发出请求。从本质上讲,我cancelAllOperations在使用 NSBlockOperation 时实现了一个穷人。

问题:self.isCancelledNO我的 dealloc 方法中设置为时,我是否也设置self.isCancelled了块中正在使用的 strongSelf 引用?

0 投票
3 回答
1162 浏览

ios - 正确使用 NSBlockOperations 以便一切都在后台执行

我试图在后台线程上发出网络请求,我决定使用 NSBlockOperations。我正在使用ADNKit来处理我的获取请求。这是代码:

我的代码应该是自我解释的,但是当我调用 self.apiCallMaker 时,我引用的是配置对象中定义的属性。请参阅我之前提出的这个问题,以获取有关该属性发生了什么的更多详细信息

当我尝试获取超过 40 个帖子时,我无法保持界面不卡顿。我将数据划分为 1 - 5 个部分,每个部分可以包含 1 - 200 多个帖子。当然,如果可以的话,我会把这些剪掉。我的问题是,当我重新加载所有数据时,我会使用这些 NSBlockOperations 之一重新加载每个部分。我在这里只展示了一个,以使其尽可能简洁。我已经在仪器中对此进行了测试,每次 ANKClient 对象将其 JSON 响应转换为 ANKPost 对象时,我的 CPU 都固定在 100% 以上,并且我的界面卡顿了。

问题:

  1. 将 JSON 响应转换为由 ANKClient 的完成处理程序执行的 ANKPost 对象是否在主线程之外完成?
  2. 每个 NSBlockOperation 中的所有内容都是在主线程之外执行的吗?
  3. 一切都是在refreshPostsInPart:主线程之外执行的吗?
  4. 我的数据对象的方法是setPosts:withMeta:在主线程之外执行的吗?
  5. 如果我删除了该dispatch_async块,上述问题的任何答案都会改变吗?
0 投票
2 回答
299 浏览

ios - NSBlockOperation 和块中的对象

这是简单的代码:

由于 someString 被释放,当 nsblockoperation 运行时,此代码将崩溃。防止这种情况的最佳做法是什么?

谢谢你。

编辑: ARC 不是一个选择,因为这不是我的决定。有什么办法可以在 MRC 中解决这个问题?

EDIT2:下面的代码呢?它会起作用吗?