Day#28 上传照片(2)+Debug

前言

接着呢,我们继续把上传照片的功能做出来。首先是希望能在注册的时候,能够取得相簿的照片,然後把他上传到我们昨天连线的storage,最後再将url回传,将图片显示於UI上。

DatabaseManager

我们进到RegisterViewController看,当按下注册的按钮的时候,若这个使用者帐号没有被使用过,就会进行建立帐号,也就是此时对资料库做更动。

insertUser

Trace到insertUser这个方法,发现刚好这就是先前一直没有解到的bug。其实也不难,但我对closure还没完全解锁,所以也不知道该怎麽补上完整的程序。
因为现在的方法已经变成这样

public func insertUser(with user: ChatAppUser, completion: @escaping(Bool) -> Void)

因此在其他地方呼叫时也要一并加上先前没有写进去的参数。此时就会想,以前开发c#的时候都可以用resharper哪,回不去了手动加参数的岁月了
快捷键cmd+sft+F,可以搜寻整个专案中的被使用到方法的地方。

接着就能找到先前出现bug的地方!好感动!!!

RegisterViewController

我们将原本此处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)")
            }
        })
    }
})

UserModel

第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,`你`都不要

[C 语言笔记--Day12] system call 的执行步骤

为什麽需要 system call 因为有些行为是很危险的, 所以 C 以提供 C library ...

[Day 17]从零开始学习 JS 的连续-30 Days---AJAX--方法介绍

AJAX--方法介绍 JavaScript 原生写法 XMLHttpRequest : 物件的方式来...

【day10】狗一下居酒食堂

今天来介绍很难预约的狗一下居酒食堂 这是去年12月底去吃的 并提前一个月预定 当天的方案是88道菜吃...

Day 20 「就是真诚」TDD 的实弹演习:Magneto Effect

打球像做人 上图是笔者几年前拿网路上的图来东凑西凑,拼出来的桌面,本只是拿来练 Photo Imp...

AutoCAD ActiveX #3 Draw

AddLine Creates a line passing through two points....