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从数组中选择图像,是否还有另一种方法可以达到我的目的?用一种可能的解决方案更新了我的答案,该解决方案允许异步执行回迁。