功能不等待下载图片与Alamofire在Swift

时间:2018-05-18 11:23:57

标签: ios swift alamofire alamofireimage

我尝试使用Alamofire下载图片,此图片必须附加到自定义类。但我没有这样做。图像是用async下载的,我没有解决这个问题。我的错误在哪里?

图片始终返回

// MARK:CUSTOM FUNCTION

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 VIEWCONTROL

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 :(得分:5)

将其更改为:

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

答案 1 :(得分:0)

在开始异步下载后,您可以直接设置图像,当然它仍然是nil。像在代码中一样使用回调的一点是,只有在调用回调后才能使用请求的资源;所以你应该将使用图像的代码移动到回调块中。