我知道我錯過了一些簡單的事情,但我花了數小時試圖弄清楚。我的所有代碼都能正常工作,並且運行正常,但沒有圖像。它是空白的。爲什麼?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'方法中的完成處理程序有關。不知何故,它不會被調用,直到它太晚...因爲如果我允許它完成加載,它會快速循環所有的圖像,然後降落在一個隨機的... –