Функция не ждет загрузки изображения с Alamofire в Swift - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь загрузить картинку с помощью Alamofire, и это изображение необходимо добавить в пользовательский класс.Но я этого не делал.Изображение загружается с помощью async, и я не решил эту проблему.Где моя ошибка?

Изображение всегда возвращает nil

// MARK: ПОЛЬЗОВАТЕЛЬСКАЯ ФУНКЦИЯ

import UIKit
import Alamofire
import AlamofireImage

class DownloadPhotoWAlamofire {

func download(imageUid:String , completion : @escaping (UIImage) -> ()  )  {
    let url = "\(Config.fileService)file?uid=\(String(describing: imageUid))"
    print("URL \(url)")

    Alamofire.request(url, method: .get ).responseImage { response in
        print("Image Response \(response)")

        let image = response.result.value
        completion(image!)

        }
    }
}

// MARK: IN VICCONTROL

guard let objectElement = o as? [String:Any] else {return}
let managerName = objectElement["managerName"] as? String
let managerAvatarUid = objectElement["managerProfilePictureFileUid"] as? String
let assistantsOfDiariesUid = objectElement["assistantsOfDiariesUid"] as? String

var image:UIImage? = nil

if managerAvatarUid != nil {
    DownloadPhotoWAlamofire().download(imageUid: managerAvatarUid!, completion: { (imageD) in
                    image = imageD
                })
     }

 let e = AssistantInviteElement(managerName: managerName!, managerAvatarUid: managerAvatarUid, assistantsOfDiariesUid: assistantsOfDiariesUid!,avatarImage:image)
 self.managerList.append(e)

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вы устанавливаете изображение непосредственно после начала асинхронной загрузки, когда оно, конечно, все еще равно nil.Смысл использования обратного вызова, как вы делаете в своем коде, заключается в том, что вы можете использовать запрошенный ресурс только после вызова обратного вызова;поэтому вы должны переместить код, который использует изображение, в блок обратного вызова.

0 голосов
/ 18 мая 2018

Измените его на:

if managerAvatarUid != nil {
    DownloadPhotoWAlamofire().download(imageUid: managerAvatarUid!, completion: { (imageD) in
        let image = imageD
        let e = AssistantInviteElement(managerName: managerName!, managerAvatarUid: managerAvatarUid, assistantsOfDiariesUid: assistantsOfDiariesUid!,avatarImage:image)
        self.managerList.append(e)
    })
}

Поскольку загрузка выполняется асинхронным вызовом, и вы выполняете эту строку перед загрузкой изображения:

let e = AssistantInviteElement(managerName: managerName!, managerAvatarUid: managerAvatarUid, assistantsOfDiariesUid: assistantsOfDiariesUid!,avatarImage:image)

в это время изображение равно нулю.Так что называйте его только тогда, когда у вас есть загруженное изображение, и оно должно работать.

Также не распаковывайте опцию с "!", Сделайте, если let / guard let.Поэтому измените код Almofire на:

Alamofire.request(url, method: .get ).responseImage { response in
    print("Image Response \(response)")
    if let image = response.result.value {
        print("image downloaded: \(image)")
        completion(image)
    } else {
        print("Image is nil")
    }
}
...