Вы должны изменить свою модель таким образом, чтобы не иметь значения, в каком порядке загружаются изображения. Например, у вас есть массив изображений URL строк:
var imageURLs: [String]
Итак, ваш NSData
должны храниться в словаре (или NSCache
) шпонкой по этой строке адреса:
var imageData = [String: NSData]()
Тогда при загрузке данные, вы можете обновить этот словарь:
self.imageData[imageURL] = dtA
Затем, когда вам нужно получить позже эти данные, вы можете использовать ImageUrl, например:
let data = imageData[imageURLs[index]]
Или вы можете определить его как [Int: NSData]
и использовать числовой указатель в качестве ключа. Но идея состоит в том, что вы можете использовать словарь, а затем порядок, в котором вы получаете ответы, не имеет значения, но вы по-прежнему пользуетесь преимуществами выполнения параллельных запросов.
То, что я хотел бы предложить, было бы что-то вроде:
var imageData = [String: NSData]()
@IBAction func didClickOnStart(sender: AnyObject) {
queue.cancelAllOperations()
let completionOperation = NSBlockOperation() {
print("all done")
}
for (index, imageURL) in imageURLs.enumerate() {
let operation = DataOperation(session: session, urlString: imageURL) { data, response, error in
guard let data = data where error == nil else { return }
guard let httpResponse = response as? NSHTTPURLResponse where httpResponse.statusCode == 200 else { return }
NSOperationQueue.mainQueue().addOperationWithBlock {
self.imageData[imageURL] = data
}
print("JPEG download\(index)")
}
completionOperation.addDependency(operation)
queue.addOperation(operation)
}
NSOperationQueue.mainQueue().addOperation(completionOperation)
}
и обращаться к нему так:
if let data = imageData[imageURLs[index]], let image = UIImage(data: data) {
// use `image` here
}
Или
var imageData = [Int: NSData]()
@IBAction func didClickOnStart(sender: AnyObject) {
queue.cancelAllOperations()
let completionOperation = NSBlockOperation() {
print("all done")
}
for (index, imageURL) in imageURLs.enumerate() {
let operation = DataOperation(session: session, urlString: imageURL) { data, response, error in
guard let data = data where error == nil else { return }
guard let httpResponse = response as? NSHTTPURLResponse where httpResponse.statusCode == 200 else { return }
NSOperationQueue.mainQueue().addOperationWithBlock {
self.imageData[index] = data
}
print("JPEG download\(index)")
}
completionOperation.addDependency(operation)
queue.addOperation(operation)
}
NSOperationQueue.mainQueue().addOperation(completionOperation)
}
И доступ к нему, как так:
if let data = imageData[index], let image = UIImage(data: data) {
// use `image` here
}
Примечание, ImageNetworkOperation
просто вызывает DataOperation
получить NSData
, а затем преобразовать его в UIImage
.Если вы действительно хотите оригинал NSData
, я бы предложил обходить ImageNetworkOperation
и просто позвонить DataOperation
напрямую, как показано выше.
Просьба пояснить, что вы подразумеваете под «в последовательности». – jsondwyer
Вы можете выбрать GCD, он очень прост в использовании и имеет функции, такие как последовательная очередь, параллельная очередь. вот учебник для этого же - https://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1. –
Я имею в виду, так как URL-адреса находятся в массиве. Например, 10 URL-адресов изображений находятся в массиве. Изображение нужно сохранить в том же номере индекса, что и его URL-адрес для сохранения по конкретному индексу. Но из-за асинхронных изображений загружаются в случайном порядке. Не в последовательности. Мне нужно сохранить все изображения в последовательности, потому что мне нужно использовать их со своими заголовками. Я загружаю эти изображения. 'http: //www.wcvb.com/9849860? format = rss_2.0 & view = feed' – ZAFAR007