喵神問答記錄~Swift開發者大會&Workshop
2018年9月15日第三屆Swift開發者大會在北京召開。眾大咖雲集,喵神、巧哥、戴銘等在iOS和swift方面有豐富經驗的大神係數登場,為大家做分享。我則同時報名了第一天的大會和第二天的workshop。
workshop時,我有幸坐在喵神旁邊(其實是我去晚了,前面好位置都沒有了,正好看到喵神在最後一排旁邊又沒有人,就厚著臉皮坐下了。也算是因禍得福吧。)。跟喵神聊聊天,感覺喵神也挺好玩兒的。當然,我也抓住機會問了喵神幾個技術問題,喵神也都耐心回答了。現在分享給大家,一起進步。
1. cell重用時圖片錯亂。
我:“ UITableViewCell
的重用機制有時會把快取池中的那個cell的圖片放到新出現的cell上,導致圖片錯亂。我們的解決辦法時,把cell的 identifier
不寫死,而是每一個cell擁有一個單獨的 identifier
,像這樣: let cellID = "GirlCell\(indexPath.row)"
。雖然可以解決重用錯亂的問題,但也有隱患,如果一個tableView中有1000個cell,使用者一直翻頁滾動到最後,那麼在快取池中就會有將近1000個cell。這會極大的消耗記憶體和效能。您是怎麼解決這種問題的?”
喵神:“ UITableViewCell
有一個方法 prepareForReuse
,你只需要重寫這個方法,然後在這個方法內部把imageView置為空就可以。”
一邊說著,喵神一邊打開了他電腦上的專案 KingfisherDemo
,然後找到了一個自定義的cell,給我看了這個方法,裡面正好有一句 imageView.image = nil
。
我回家後,自己在先寫了一個圖片錯亂的demo,然後使用喵神說的方法,重寫了 prepareForReuse
方法,成功解決了這個問題。真是綠色無公害的解決辦法啊!
程式碼示例:
override func prepareForReuse() { avatarView.image = nil }
2. Kingfisher用作key儲存的url所對應的圖片在伺服器端被換掉。
這是我那天問的第一個技術問題,是寫在紙上問的,畢竟當時有個老外在演講,我們在臺下不好說話,跟喵神也還不熟。我寫完後給喵神,喵神看到後笑了下,然後給我做了個手勢,意思是他等下要提問,等他提問完。後來喵神用英語提問完了,開始回答我的問題。還在我的紙上寫寫畫畫,幫助理解吧。
問題描述: Kingfisher
也是用url做key來快取圖片的吧?那麼如果url對應的圖片換了,怎麼能讓客戶端知道,並及時重新請求呢?
喵神: Kingfisher
是用url做key來快取圖片的。但在伺服器端儲存檔名時,最好要在圖片名的後面加上圖片的版本號,比如“ ofollow,noindex">https://sample.com/icon.png?v=1 ”,這樣,如果圖片更新了,圖片的url會變成" https://sample.com/icon.png?v=2 "。因為url不一樣了,所以 Kingfisher
肯定會去下載這張新的圖片,並顯示。然後對於舊版本的圖片,Kingfisher有一個預設清理的時間,如果7天沒有用到過,則會進行清除。所以不用擔心快取一些無用圖片的問題。
除了在圖片url後面加版本號之外,也可以在url後面加上當前的時間戳,也可以解決這個問題。
3. 用純Swift寫的app能被破解嗎?
我:我之前破解過用OC寫的app,可以把app裡的.h檔案都dump出來,swift裡沒有.h檔案了,還能被破解嗎?
喵神:是可以的。只是破解OC寫的app,dump出的.h檔案裡的類名、方法名、屬性名是我們人看得懂的。Swift的話,dump出來的類名什麼的是我們看不懂的,像這樣 __TFCCC4test1a1b1c1dfS2_FTS0_1xS1_1vFT1xSi_Si_OVS_1e1f
,需要工具轉一下才能看明白。
4. 你們會做程式碼混淆嗎?
喵神:不會。
5. 給button新增事件時,用block還是addTarget?
喵神:其實都可以。我們現在都是swift開發,所以用closure多一些。
下圖就是當時的座位情況,右邊開著電腦的是喵神,我坐喵神左邊。

另附上喵神幫我回答時的寫寫畫畫,哈哈。


最後,如果大家參加大會時,也問大神們問題了,希望可以把問題及大神的回答放在留言回覆裡,我會整理到文章中,大家一起進步,幫助更多swift開發者,先謝謝了。
分享使人進步!
Have fun.