为了进一步研究这个问题,我删除了关于这个主题的最后一个问题。
我正在开发一个基于内容的图像检索数据库,该数据库为 iPhone 上的本地相册编制索引。我编写了特征提取的过滤器和方法,但作为预处理步骤,我使用 CIDetector 检测面部矩形并通过局部二进制模式过滤器过滤这些矩形并提取小矩形的直方图。
该过程显然会花费大量时间来索引大型相册,因此我将其设计为异步的,并使用后台线程运行过滤器并提取特征。
这样做的问题是访问相册图像的唯一方法似乎是通过 PHAsset。有两个常用的 API,它们都需要回调块。其中一个检索 UIImage 表示,这不是我想要的,主要是因为我需要加载其中的许多并且内存限制很紧,我根本不打算显示图像。它还将返回一个对象字典,其中一个是图像文件本身的 URL,但 using+[CIImage imageWithContentsOfURL]
将返回 nil,并且 iOS 控制台将显示在使用此 API 时对图像的权限被拒绝。
另一个是-[PHAsset requestContentEditingInputWithOptions]
。这个特定的 API 将强制回调块在主队列中被调用,无论哪个队列调用 API,回调块总是被分派到主队列中。使用此 API,可以使用 成功加载 CIImage +[CIImage imageWithContentsOfURL]
,这意味着 API 已有效地授予访问文件的权限。然后,我可以将 CIImage 放在将执行所有索引处理步骤的不同队列中。
这种方法似乎有效,但只持续了很短的时间。最终应用程序崩溃了,我所看到的只是在之前的处理过程中出现了一条消息,上面写着Connection to assetsd was interrupted or assetsd died
.
如果我不在另一个队列上排队操作,只是让它在 API 强制回调进入的主队列上运行,那么一切都很好,并且该消息不会显示在控制台中。但这让我的主线程一直忙于进行非常昂贵的图像处理。
编辑:我突然想到我可能误用了这个 API,但它似乎是唯一能以适当格式为我提供我想要的数据的东西(一个 CIImage,可用于从文件中加载像素数据)必要的,在处理过程中)。
我目前使用的 API 可能更适合交互式图像过滤会话,其中图像编辑数据与 UI 一起使用,并且管理它的服务保持与应用程序的会话打开。