我有两个数组:
var originalImagesArray = [UIImage]()
var croppedImagesArray = [UIImage]()
我将它们填写为:
for i in from..<to {
let asset: PHAsset = self.images[i] as! PHAsset
let imageFetchOptions = PHImageRequestOptions()
self.imageManager.requestImageForAsset(asset, targetSize: CGSize(width: 50, height: 50), contentMode: .AspectFit, options: imageFetchOptions, resultHandler: { (image: UIImage?, info: [NSObject : AnyObject]?) in
if (image != nil) {
print("Little: \(image!.description)")
self.croppedImagesArray.append(image!)
}
})
self.imageManager.requestImageForAsset(asset, targetSize: CGSize(width: 600, height: 600), contentMode: .AspectFit, options: imageFetchOptions, resultHandler: { (image: UIImage?, info: [NSObject : AnyObject]?) in
if (image != nil) {
print("Big: \(image!.description)")
self.originalImagesArray.append(image!)
}
})
}
所以,在一个数组中,我将图像保存为50x50,而另一个则保存为600x600。
问题是,当我稍后在didSelect
中显示图像时,我会得到2张不同的图像。
例如,在索引5中的cropped
数组中,我得到一个图像,但在索引5的original
中,我得到另一个图像。
我希望那是2张相同的图片。我怎样才能做到这一点?
1解决方案是以相同的方式对2个阵列中的图像进行排序 2解决方案是我以错误的方式完成所有这些。在那种情况下我需要什么?
答案 0 :(得分:1)
requestImageForAsset
默认是异步的,因此这些请求可以按任何顺序返回。一个简单的解决方案是在synchronous
上设置PHImageRequestOptions
标志。当然,对requestImageForAsset
的每次调用都会阻塞,直到它完成,因此它可能不是一个理想的解决方案。
允许同步进行提取的另一种方法是创建UIImage?
的数组
var originalImagesArray = [UIImage?]()
var croppedImagesArray = [UIImage?]()
然后修改你的循环
if self.originalImagesArray.count < to {
self.originalImagesArray.appendContentsOf(Array(count: to - self.originalImagesArray.count, repeatedValue: nil))
}
if self.croppedImagesArray.count < to {
self.croppedImagesArray.appendContentsOf(Array(count: to - self.croppedImagesArray.count, repeatedValue: nil))
}
for i in from..<to {
let asset: PHAsset = self.images[i] as! PHAsset
let imageFetchOptions = PHImageRequestOptions()
self.imageManager.requestImageForAsset(asset, targetSize: CGSize(width: 50, height: 50), contentMode: .AspectFit, options: imageFetchOptions, resultHandler: { (image: UIImage?, info: [NSObject : AnyObject]?) in
if (image != nil) {
print("Little: \(image!.description)")
self.croppedImagesArray[i] = image
}
})
self.imageManager.requestImageForAsset(asset, targetSize: CGSize(width: 600, height: 600), contentMode: .AspectFit, options: imageFetchOptions, resultHandler: { (image: UIImage?, info: [NSObject : AnyObject]?) in
if (image != nil) {
print("Big: \(image!.description)")
self.originalImagesArray[i] = image
}
})
}
在您使用图片时,如果特定索引处的项目包含nil
,您可以显示加载指示符或某些内容。
答案 1 :(得分:1)
来自PHImageManager.requestImageForAsset的文档:
默认情况下,此方法异步执行。如果从后台线程调用它,您可以将options参数的同步属性更改为YES以阻止调用线程,直到请求的图像准备就绪或发生错误,此时Photos调用结果处理程序。
问题在于您按照所需的顺序调用requestImageForAsset
,但它们是异步完成的,这可能会根据首先完成的大小以不同的顺序填充数组。
如果您希望它们采用相同的顺序,我建议您将croppedImagesArray
和originalImagesArray
更改为可以在它们之间共享的字典。例如,如果资产的实际顺序无关紧要,只要它们在两个集合之间相同,您就可以通过资产的localIdentifier
键入,然后在枚举时按该标识符对字典进行排序。集合。如果实际的顺序很重要,则传递一些其他序列密钥(可能是当前时间戳)并在两个完成处理程序之间共享它。