【问题标题】:Function doesnt wait download Picture with Alamofire in Swift功能不等待在 Swift 中使用 Alamofire 下载图片
【发布时间】:2018-10-28 19:58:08
【问题描述】:

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

图像总是返回 nil

// 标记:自定义函数

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!)

        }
    }
}

// 标记:在视图控制中

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)

【问题讨论】:

  • let e = & append(e) 你在哪里image = imageD
  • 当我把这行放在你说的地方时,不属于 managerList
  • 是的,但它是异步的,所以它只会在下载图像时发生。你不能像同步一样管理异步。在self.manager.append(e) 之后创建一个函数,并在您执行self.manager.append(e) 新位置之后调用它,而不是您当前的代码。
  • 是的,你是对的。它工作正常。非常感谢

标签: ios swift alamofire alamofireimage


【解决方案1】:

改成:

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)

当时图像为零。因此,只有在您下载了图像并且它应该可以工作时才调用它。

也不要用“!”解开可选,做一个 if 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")
    }
}

【讨论】:

  • @AliIhsanURAL 太好了!确保你不要强制解开可选的,你可以节省很多崩溃。
【解决方案2】:

启动异步下载后直接设置图片,当然还是nil。像在代码中那样使用回调的要点是,只有在回调被调用后才能使用请求的资源;所以你应该将使用图像的代码移动到回调块中。

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2018-05-12
    • 2016-12-25
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多