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

Ios 是否可以同时填充两个阵列?,ios,arrays,swift,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.imageMana

我有两个阵列:

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!)
            }
        })
    }

for i in from.
requestImageForAsset
在默认情况下是异步的,因此这些请求可以以任何顺序返回。一个简单的解决方案是在
PHImageRequestOptions
上设置
synchronous
标志。当然,每次调用
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
        }
    })
}
如果self.originalImagesArray.count
默认情况下,此方法异步执行。如果从后台线程调用它,则可以将options参数的synchronous属性更改为YES,以阻止调用线程,直到请求的图像准备就绪或出现错误,此时Photos调用结果处理程序

问题是,您正在按所需的顺序调用
requestImageForAsset
,但它们是异步完成的,这可能会根据首先完成的大小以不同的顺序填充数组


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

我不确定是否完全理解该问题。您提供的代码按照您的预期执行。它填充两个不同的数组,一个是小图像,另一个是大图像。这不是你想要的吗?请同时发布didSelect方法。是的,它会填充,但数组中图像的顺序不同。在didSelect方法中,我只是通过index@Tandermay从数组中选择图像,是否还有另一种方法可以达到我的目的?用一种可能的解决方案更新了我的答案,该解决方案允许异步执行回迁。