Это в основном быстрый вопрос, а не проблема DJI SDK и больше относится к проверке кода. Но это просто
func getNewImages() {
for file in self.mediaList where file != nil {
self.getImages(with: file!) { image, error in //not ideal to force unwarp but i don't know if the where clause supports if let binding, or if file is really nil, you'll have to check yourself in code
guard let newImage = image else { return }
self.cachedImages.append(newImage)
}
}
self.setImage(at: 0)
}
func getImages(with file: DJIMediaFile, completion: (UIImage?, Error?)->()) {
file.fetchPreview { (error) in // is this async? If its' async you may want to use dispatch groups in the for in loop to run the setImage at the correct time
if let newError = error {
print(String(describing: newError.localizedDescription))
completion(nil, error)
return
}
guard let image = file.preview else {
print("No preview")
completion(nil, nil)
return
}
completion(image, nil)
}
}
func setImage(at row: Int) {
guard row < self.cachedImages.count - 1 else { return }
self.imageView.image = self.cachedImages[row]
}
Ваша рекурсия может привести к ошибкам, которые вам не нужны. Это то, что вы хотите сделать, но это должно быть просто изменить в зависимости от того, что я вижу здесь.
Редактировать: Возможно, вы также намереваетесь заменить файл, так как люди загружают свои изображения из самого беспилотника, и в этом случае код выглядит примерно так:
func getNewImages() {
for file in self.mediaList where file != nil {
self.getImages(with: file!) { image, error in //not ideal to force unwarp but I don't know if the where clause supports if let binding, or if file is really nil, you'll have to check yourself in code
guard let newImage = image else { return }
self.imageView.image = newImage
}
}
}
func getImages(with file: DJIMediaFile, completion: (UIImage?, Error?)->()) {
file.fetchPreview { (error) in
if let newError = error {
print(String(describing: newError.localizedDescription))
completion(nil, error)
return
}
guard let image = file.preview else {
print("No preview")
completion(nil, nil)
return
}
completion(image, nil)
}
}
edit2: Также обратите внимание, что это не обязательно лучший способ сделать это, но ранее это было то, как вы делаете это в цикле for. Я думаю, что лучшим способом было бы использовать map или forEach для самого массива mediaList, вот так. (тот же метод getImages, ничего не меняется). Это можно было бы дополнительно уточнить между протоколами, расширениями и тому, что нет, но не зная вашей программы, трудно сделать лучшие рекомендации.
func getNewImages() {
self.mediaList.forEach { file in
guard let newFile = file else { return }
self.getImages(with: newFile) { image, error in
guard let newImage = image else { return }
self.imageView.image = newImage
}
}
}