是否可以同时填充两个阵列?

时间:2016-06-08 13:54:59

标签: ios arrays swift

我有两个数组:

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解决方案是我以错误的方式完成所有这些。在那种情况下我需要什么?

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,但它们是异步完成的,这可能会根据首先完成的大小以不同的顺序填充数组。

如果您希望它们采用相同的顺序,我建议您将croppedImagesArrayoriginalImagesArray更改为可以在它们之间共享的字典。例如,如果资产的实际顺序无关紧要,只要它们在两个集合之间相同,您就可以通过资产的localIdentifier键入,然后在枚举时按该标识符对字典进行排序。集合。如果实际的顺序很重要,则传递一些其他序列密钥(可能是当前时间戳)并在两个完成处理程序之间共享它。