问题标签 [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 回答
880 浏览

objective-c - 嵌套objective-c块时的语法/格式

我正在嵌套块,它看起来 UGGGGLY。有没有办法写这个不那么难看?主要是寻找语法建议,而不是结构性的,但我都会接受。

我的块工厂方法,

从许多与此类似的函数中调用它,

queue 是一个 NSOperationQueue 对象。如果没有所有(丑陋的)强制转换,它将无法编译。亚硝酸胺?

编辑:根据 Dave DeLong 的回答和http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/,我改变了行

成为,

0 投票
3 回答
1077 浏览

objective-c - NSBlockOperation 和 NSAutoreleasePool

通常,当您创建一个NSOperation子类时,您负责NSAutoreleasePool-main方法中创建和释放一个。

使用时NSBlockOperation,是否需要在块中创建自动释放池?

0 投票
10 回答
67589 浏览

objective-c - 如何在后台线程上创建 NSTimer?

我有一个需要每 1 秒执行一次的任务。目前我有一个 NSTimer 每 1 秒重复触发一次。如何在后台线程(非 UI 线程)中触发计时器?

我可以在主线程上触发 NSTimer,然后使用 NSBlockOperation 调度后台线程,但我想知道是否有更有效的方法来执行此操作。

0 投票
1 回答
343 浏览

ios - viewDidLoad 中异步加载声音资源崩溃

全部,

我试图在加载 UIViewController 时异步加载一组声音。大约在同一时间,我(偶尔)还会在我的 ViewController 层次结构的顶部放置一个 UIView 以呈现帮助覆盖。当我这样做时,应用程序会因执行错误而崩溃。如果未添加视图,应用程序不会崩溃。我的 ViewController 看起来像这样:

(从'initWithSounds'调用)的主要异步加载方法SoundHelper如下所示:

当块退出时,崩溃似乎发生了。的看起来像这样initFHSCoachMarkView

我尝试使用两者来调用异步块NSBlockOperationdispatch_async并且两者都具有相同的结果。此外,我完全删除了 aysnch 调用并将声音加载到主线程上。这很好用。我还尝试了@Jason 在中建议的解决方案:NSOperationQueue 和 UITableView 版本正在使我的应用程序崩溃,但同样的事情也发生在那里。

这实际上是在 FHSCoachMarkView 中添加的视图的问题,还是可能与两者都访问的事实有关mainBundle?我对 iOS 中的异步编码有点陌生,所以我有点茫然。任何帮助,将不胜感激!

谢谢,斯科特

0 投票
1 回答
943 浏览

iphone - NSBlockOperation 泄露 ARC

我在引用块本身内部的“NSBlockOperation”时遇到了麻烦。我需要检查操作是否被取消,并且在启用 ARC 的项目中运行时,似乎对“searchOperation”的任何访问都会泄漏。

这段代码基本上什么都不做,它显示了启用 ARC 的项目中的泄漏,而在非 ARC 项目中工作正常。

谢谢。

0 投票
3 回答
16756 浏览

objective-c - 学习 NSBlockOperation

我是块的忠实粉丝,但没有将它们用于并发。经过一番谷歌搜索,我拼凑出这个想法,将我学到的所有东西都隐藏在一个地方。目标是在后台执行一个块,完成后,执行另一个块(如 UIView 动画)...

我的问题是:

  1. 当我运行它时它可以工作,但我错过了什么......隐藏的地雷吗?我还没有测试过取消(因为我还没有发明一个长操作),但这看起来会起作用吗?
  2. 我担心我需要限定我的 backgroundOperation 声明,以便我可以在完成块中引用它。编译器没有抱怨,但是那里潜伏着一个保留循环吗?
  3. 如果“字符串”是一个 ivar,如果我在块运行时观察到它的键值会发生什么?或者在主线程上设置一个计时器并定期记录它?我能看到进步吗?我会宣布它是原子的吗?
  4. 如果这按我的预期工作,那么它似乎是隐藏所有细节并获得并发的好方法。为什么 Apple 不为我写这个?我错过了什么重要的东西吗?

谢谢。

0 投票
2 回答
3066 浏览

iphone - NSBlockOperation 或 NSOperation 与 ALAsset 块使用 ALAsset URL 显示照片库图像

我问这个问题关于我的问题以有效的方式显示照片库图像 iPhone高效的 UITableView "cellForRowIndexPath" 方法来绑定 PhotoLibrary 图像

所以我想要求不要在不阅读以下详细信息的情况下将答案复制到这个答案:)

让我们来解决问题,

我已经详细研究了我上面提到的问题,并且我从这里找到了关于操作队列的文档。

因此,我创建了一个示例应用程序,通过 ALAsset 块使用操作队列显示七个照片库图像。

以下是示例应用程序详细信息。

第1步:

在 NSOperationalQueueViewController viewDidLoad方法中,我已将所有照片库 ALAsset URL 检索到名为urlArray.

第2步:

将所有 URL 添加到 中后urlArrayif(group != nil)条件将为 false assetGroupEnumerator,因此我创建了一个NSOperationQueue,然后通过for循环创建了七个 UIImageView,并NSOperation使用相应的图像视图URL创建了我的子类对象对于每一个,并将它们添加到NSOperationQueue.

在这里查看我的NSOperation子类。

在此处查看我的实现 (VierwController) 类

让我们来看看这个问题。

它没有一致地显示所有七个图像。部分图像丢失。丢失的顺序多次更改(一次不显示第六和第七,另一次不显示第二和第三)。控制台日志显示找不到照片图片编号。但是,URL 已正确记录。

您可以在此处查看日志详细信息。

我的课有错误吗?

此外,当我浏览上述操作队列文档时,我已经阅读了关于NSBlockOperation. 我是否需要在处理 ALAsset 块时实施NSBlockOperation而不是?NSOperation

描述NSBlockOperation

您按原样使用的类可以同时执行一个或多个块对象。因为它可以执行多个块,所以块操作对象使用组语义进行操作;只有当所有相关块都完成执行时,操作本身才被认为完成。

如何实现NSBlockOperation与我的示例应用程序有关的 with ALAsset 块?

我已经完成了 Stack Overflow 问题Learning NSBlockOperation。但是,我没有任何想法来实现NSBlockOperationwith ALAsset 块!

0 投票
1 回答
1203 浏览

objective-c - NSBlockoperation is not getting cancelled

I've a uitableview which shows images in each cell, which are downloaded online.

To make this call async, I use NSBlockoperation. I prefer to use this, because i used GCD before but you cannot cancel GCD. The reason is that if I leave the view, the images gets downloaded at the background of the App, and when I get into the previous view again GCD would let it queue all again, so eventually there would be a whole stack of images and the user would never see the uitableview. So thats why I choose for NSBlockoperation.

However, my blocks don't get cancelled. This is the code I use (it is a part of - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ):

I've used this code to cancel:

However, my NSLog tells me that even after my view dissappeared (i put an nslog there), there are still blocks.

Notice: there are each time 4 cells displayed in the view, so I think that even though I leave the view they are still in the queue..

0 投票
1 回答
522 浏览

objective-c - 分组 NSOperation 在同一个对象上工作并检测它们何时在 iOS 中完成

我有一个 iOS 应用程序,其中 5 个 NSBlockOperation 每个生成一个 NSArray 对象,并将其添加到一个共享的同步 NSMutableArray 中,该 NSMutableArray 用作 UITableView 数据源。

该操作彼此独立,一旦完成,我需要启动 UITableView 数据重新加载。

不幸的是,我找不到使用 NSOperation 的方法。我需要使用另一个多线程设计吗?

0 投票
1 回答
416 浏览

objective-c - NSBlockOperation 的粒度状态

我已经扩展NSOperationQueue以允许添加NSBlockOperation特定NSString的作为标识符。

标识符值保存在NSMutableArray作为注册表的服务中。这就是我实现注册表的方式。

基本上,我添加了一个完成块,该块在该特定操作完成时清理注册表。

但是,虽然这可行,但我需要向队列添加更多粒度。

我只将队列与块操作一起使用,并且在块执行期间,我可能会NSNotification根据执行的方式向侦听器发送不同的消息。

我试图实现的目标:

调用者尝试将NSBlockOperation带有标识符的特定添加到队列中。如果队列已经有这样的标识符,就不要添加块,并且调用类将自己设置为侦听器。

什么不见​​了 ?检查标识符是不够的,可能存在NSBlockOperation已经调度NSNotification但尚未调用完成块的情况。

所以调用者类询问队列,这表示标识符存在于注册表中,调用者错误地将自己设置为监听一个永远不会到达的通知,因为它已经被发送了。

相反的情况是:调用者询问队列,它说'标识符在注册表中'但是NSNotification被发送了。来电者NSBlockOperation排队。

注册表的检查是通过一个简单的方法进行的:

但在这一点上,我对如何扩展这种方法不太了解。我正在编写的代码是一种“学术”,它没有任何特定目的,只是我在尝试实验。因此我在代码中有很大的灵活性。但这对我来说是一个相当新的主题,所以请尽可能具体地说明建议实施的任何缺点。