我想检索存储在用户存储中的图像,并将其放在自定义UITableViewCell的名称旁边。现在的问题是当图像未完成下载(我认为?)时会加载tableview,导致应用程序崩溃,因为图像数组为零。那么加载tableview的正确方法是什么?我认为,对于用户体验,即使图像没有完成下载,也应该显示tableviewcell图像,并向它们显示保存在助手中的默认图像。我想过制作一个带有UIImages的数组,它链接到加载图像的默认资产,并在下载完成后将图像更改为个人资料图片。但我真的不知道该怎么做。这是我到目前为止关于下载图像的内容:
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
GTracker = Gai.SharedInstance.GetTracker(StringConstants.TRACKING_ID);
Gai.SharedInstance.OptOut = false;
// change for app release
Gai.SharedInstance.Logger.SetLogLevel(LogLevel.Verbose);
Gai.SharedInstance.DispatchInterval = Convert.ToUInt16(StringConstants.GOOGLE_DISPATCH_INTERVAL);
// Send uncaught exceptions (Crashes) to Google Analytics.
Gai.SharedInstance.TrackUncaughtExceptions = true;
return true;
}
这是在cellForRow
中let storage = FIRStorage.storage()
let storageRef = storage.reference(forURL: "link.appspot.com")
channelRef?.observeSingleEvent(of: .value, with: { (snapshot) in
if let snapDict = snapshot.value as? [String:AnyObject]{
for each in snapDict{
let UIDs = each.value["userID"] as? String
if let allUIDS = UIDs{
let profilePicRef = storageRef.child((allUIDS)+"/profile_picture.png")
profilePicRef.data(withMaxSize: 1 * 500 * 500) { data, error in
if let error = error {
}
if (data != nil)
{
self.playerImages.append(UIImage (data: data!)!)
}
}
}
let userNames = each.value["username"] as? String
if let users = userNames{
self.players.append(users)
}
}
}
self.tableView.reloadData()
})
我的规则,并未将其从默认规则中更改:
cell.playersImage.image = playerImages[indexPath.row] as UIImage
谢谢。
答案 0 :(得分:0)
下载完图片后,您应该致电tableView.reloadData()
。一件重要的事情是,将您的playerImages初始化为playerImages = [UIImage]()
而不是playerImages: [UIImage]!
。如果它是空的,它将不会显示你的数组是零。
更新:
if let players = playerImages {
//code
}
答案 1 :(得分:0)
关于用户体验,您是对的。从URL加载图像时,有一些默认图像是标准的。一个很棒的库用于图像缓存并在其“{3}}
中使用默认资源Vandan Patel的回答是正确的,说你需要确保在加载tableview时你的数组不是nil。您将获得一个完成块,以使用AlamofireImage库处理您想要对图像执行的任何额外工作。
这是假设您为Firebase用户获取正确的图片网址。