将图像从Firebase添加到UITableViewCell

时间:2017-02-21 20:56:25

标签: ios swift uitableview firebase firebase-storage

我想检索存储在用户存储中的图像,并将其放在自定义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

谢谢。

2 个答案:

答案 0 :(得分:0)

下载完图片后,您应该致电tableView.reloadData()。一件重要的事情是,将您的playerImages初始化为playerImages = [UIImage]()而不是playerImages: [UIImage]!。如果它是空的,它将不会显示你的数组是零。

更新:

if let players = playerImages {
   //code
}

答案 1 :(得分:0)

关于用户体验,您是对的。从URL加载图像时,有一些默认图像是标准的。一个很棒的库用于图像缓存并在其“{3}}

中使用默认资源

Vandan Patel的回答是正确的,说你需要确保在加载tableview时你的数组不是nil。您将获得一个完成块,以使用AlamofireImage库处理您想要对图像执行的任何额外工作。

这是假设您为Firebase用户获取正确的图片网址。