接着呢,我们继续把上传照片的功能做出来。首先是希望能在注册的时候,能够取得相簿的照片,然後把他上传到我们昨天连线的storage,最後再将url回传,将图片显示於UI上。
我们进到RegisterViewController
看,当按下注册的按钮的时候,若这个使用者帐号没有被使用过,就会进行建立帐号,也就是此时对资料库做更动。
Trace到insertUser
这个方法,发现刚好这就是先前一直没有解到的bug。其实也不难,但我对closure还没完全解锁,所以也不知道该怎麽补上完整的程序。
因为现在的方法已经变成这样
public func insertUser(with user: ChatAppUser, completion: @escaping(Bool) -> Void)
因此在其他地方呼叫时也要一并加上先前没有写进去的参数。此时就会想,以前开发c#的时候都可以用resharper哪,回不去了手动加参数的岁月了
快捷键cmd+sft+F,可以搜寻整个专案中的被使用到方法的地方。
接着就能找到先前出现bug的地方!好感动!!!
我们将原本此处insertUser
的参数with
抽出来,即chatUser
。
let chatUser = ChatAppUser (firstName: firstname,
lastName: lastname,
emailAddress: email)
接着加上缺少的completion
,当完成的时候,我们就将图片使用昨天写的方法uploadProfilePicture
上传,上传也成功後就根据回传的url将图片存在快取里。
DatabaseManager.shared.insertUser(with: chatUser, completion: { success in
if success {
// upload image
guard let image = strongSelf.imageView.image, let data = image.pngData() else {
return
}
let fileName = chatUser.profilePictureFileName
StorageManager.shared.uploadProfilePicture(with: data, fileName: fileName, completion: { result in
switch result {
case .success(let downloadUrl):
// set in cache
UserDefaults.standard.set(downloadUrl, forKey: "profile_picture_url")
print(downloadUrl)
case .failure(let error):
print("Storage manager error: \(error)")
}
})
}
})
第211行的fileName,是这次新增的model property。
举例来说,若我们希望档名存成a8udej-gmail-com_profile_picture.jpg
,即使用资料库的key值safeEmail
来作为档名。
var profilePictureFileName: String {
return "\(safeEmail)_profile_picture.png"
}
可以执行了!!!!
此时再开模拟器,就可以跑了~可喜可贺呀
虽然这个功能尚未完善,不过目前可以回到对话继续开发,在来日不多的时日中,希望可以把对话功能先开发完XDDD
若上述内容有误或可以改进的部分,欢迎留言以及提出任何指教~
谢谢 ヘ| ´ω` |ノ
<<: [2021铁人赛 Day28] Binary Exploitation (Pwn) 介绍工具
>>: 追求JS小姊姊系列 Day28 -- 工具人给不完的Promise,`你`都不要
为什麽需要 system call 因为有些行为是很危险的, 所以 C 以提供 C library ...
AJAX--方法介绍 JavaScript 原生写法 XMLHttpRequest : 物件的方式来...
今天来介绍很难预约的狗一下居酒食堂 这是去年12月底去吃的 并提前一个月预定 当天的方案是88道菜吃...
打球像做人 上图是笔者几年前拿网路上的图来东凑西凑,拼出来的桌面,本只是拿来练 Photo Imp...
AddLine Creates a line passing through two points....