我知道我错过了一些简单的事情,但我花了数小时试图弄清楚。我的所有代码都能正常工作,并且运行正常,但没有图像。它是空白的。为什么?Firebase存储图像回来空白
func loadMembers4(completion: @escaping ([User]) ->()) {
var usersArray = [User]()
ref.child("members").observeSingleEvent(of: .value, with: { (snapshot) in
for item in snapshot.children {
if let snap = item as? FIRDataSnapshot {
if let value = snap.value as? [String : Any] {
let birthday = value["birthday"] as! Int
let childParent = value["childParent"] as! String
let firstName = value["firstName"] as! String
let gender = value["gender"] as! String
let passcode = value["passcode"] as! Int
let profileImageUrl = value["profileImageUrl"] as! String
// get image
self.loadMemberProfilePict4(userProfileImageUrl: profileImageUrl, completion: { (userImage) in
let user = User(profilePhoto: userImage, userFirstName: firstName, userBirthday: birthday, userPasscode: passcode, userGender: gender, isUserChildOrParent: childParent)
usersArray.append(user)
usersArray.sort(by: {$0.birthday > $1.birthday})
})
}
}
}
completion(usersArray)
})
}
func loadMemberProfilePict4(userProfileImageUrl: String, completion: @escaping (UIImage) ->()) {
var userImage = UIImage()
let storageRef = FIRStorage.storage().reference(forURL: userProfileImageUrl)
print(userProfileImageUrl)
storageRef.data(withMaxSize: 1 * 1024 * 1024, completion: { (imageData, error) in
let profileImage = UIImage(data: imageData!)
userImage = profileImage!
})
completion(userImage)
}
而且ViewDidLoad
方法:
loadMembers4 { (usersArray) in
print(usersArray.count)
self.currentUserName = usersArray[1].firstName
self.instructionsLabel.text = "Choose daily and weekly job assignments for \(usersArray[1].firstName)."
self.userImage.image = usersArray[1].photo
}
我知道的影像从火力地堡越来越牵强,因为当我在loadMemberProfilePict4
功能打印userProfileImageUrl
,它打印出正确的火力地堡的存储位置。但是当我在ViewDidLoad
中调用它时,图像显示为空白。空空如也。
任何想法?再次,我确信这是一件简单的事,我可以忽略,只需要一双新的眼睛来指出它。谢谢!
编辑#1:
如果我打印出来这是怎么回事在loadMembersProfilePict4
方法,它显示以下内容:
func loadMemberProfilePict4(userProfileImageUrl: String, completion: @escaping (UIImage) ->()) {
var userImage = UIImage()
let storageRef = FIRStorage.storage().reference(forURL: userProfileImageUrl)
print("UserProfileURL: ",userProfileImageUrl) // returns 4 strings of https://firebasestorage.google... (all correct)
storageRef.data(withMaxSize: 1024 * 1024) { (imageData, error) in
print("ImageData: ",imageData ?? "no data found!") // returns 21061 bytes, 7668 bytes, 44887 bytes, 8995 bytes (is this right?)
let profileImage = UIImage(data: imageData!)
userImage = profileImage!
print("UserImage: ",userImage.images ?? "no images found!") // returns "no images found!"
}
completion(userImage)
}
所以它似乎是莫名其妙的形象是没有得到正确加载?我不明白。我在我的项目的另一部分使用完全相同的代码,并且它加载用户图像就好了。到底是怎么回事? AARGH!太令人沮丧了。
如果您在'userImage = profileImage!'之后移动此语句:'completion(userImage)',那么看看是什么行为,我认为这将解决问题 – 3stud1ant3
我已经试过这个代码。它给了我一个致命的错误:索引超出范围错误。 –
我认为它与'loadMemberProfilePict4'方法中的完成处理程序有关。不知何故,它不会被调用,直到它太晚...因为如果我允许它完成加载,它会快速循环所有的图像,然后降落在一个随机的... –