在后台线程上使用CIDetector和其他Core Image API时崩溃

时间:2015-10-26 17:15:13

标签: ios multithreading photosframework cbir

我删除了关于这个主题的最后一个问题,以便进一步研究这个问题。

我正在开发一个基于内容的图像检索数据库,该数据库可以为iPhone上的本地相册编制索引。我已经编写了用于特征提取的过滤器和方法,但作为预处理步骤,我使用CIDetector检测面矩形并通过局部二进制模式过滤器过滤这些矩形并提取小矩形的直方图。

这个过程显然需要花费大量时间来索引大型相册,因此我将其设计为异步,后台线程运行过滤器并提取功能。

问题在于,访问相册图片的唯一方法似乎是通过PHAsset。通常使用两个API,这两个API都需要回调块。其中一个检索UIImage表示,这不是我想要的,主要是因为我需要加载其中许多并且内存约束很紧,我根本不打算显示图像。它还将返回一个对象字典,其中一个是图像文件本身的URL,但使用+[CIImage imageWithContentsOfURL]将返回nil,iOS控制台将在使用此API时显示该图像的权限被拒绝。 / p>

另一个是-[PHAsset requestContentEditingInputWithOptions]。此特定API将强制在主队列中调用回调块,无论哪个队列调用API,回调块始终都会调度到主队列中。使用此API,可以使用+[CIImage imageWithContentsOfURL]成功加载CIImage,这意味着API已经有效地授予了访问该文件的权限。然后,我可以将CIImage放在将执行所有索引处理步骤的不同队列中。

这种方法似乎有效,但只是很短的时间。最终应用程序崩溃了,我所看到的只是在早期处理过程中显示的消息显示为Connection to assetsd was interrupted or assetsd died

如果我没有在另一个队列上排队操作,只是让它在API强制回调的主队列上运行,一切都很好,并且该消息不会显示在控制台中。但是这让我的主线经常忙于做非常昂贵的图像处理。

编辑:我发现我可能会误用这个API,但它似乎是唯一可以以适当的格式提供我想要的数据的东西(可用于加载像素的CIImage)必要时,在处理过程中来自文件的数据。)

我目前使用的API可能更适合于交互式图像过滤会话,其中图像编辑数据与UI一起使用,而管理它的服务会使应用程序打开会话。

0 个答案:

没有答案