記 Swift 使用 CoreData 時(shí)的一些坑

最近在做一個(gè) App 練手,其中用到了 CoreData 來(lái)存儲(chǔ)用戶的播放列表,由于 CoreData 這部分的文章還是比較少的,所以遇到了不少坑,所以寫篇隨筆記錄一下。

題外話:可以給大家看看這個(gè) App 的界面,我覺(jué)得還是挺清新的??

Preview

P.S. 作為背景的氛圍圖片用的是 CoreImage 生成的

切入正題。

#0 何時(shí)執(zhí)行保存

起初我認(rèn)為不用顯式執(zhí)行 Xcode 給我們?cè)?AppDelegate 中生成的 saveContext 函數(shù),因?yàn)槟J(rèn)情況下 applicationWillTerminate 會(huì)執(zhí)行 saveContext,但是我發(fā)現(xiàn)這個(gè)生命周期函數(shù)壓根不靠譜,當(dāng)用戶直接從多任務(wù)視圖將 App 結(jié)束掉時(shí)這個(gè)函數(shù)根本來(lái)不及執(zhí)行完畢,導(dǎo)致我們的數(shù)據(jù)不能及時(shí)寫入本地?cái)?shù)據(jù)庫(kù)中。所以合理的調(diào)用時(shí)機(jī)我認(rèn)為還是應(yīng)該在完成一批操作以后就直接執(zhí)行一次 saveContext

下面簡(jiǎn)單貼一下我的部分代碼吧:


Code Paste 1
Code Paste 2

#1 Relationships 到底什么鬼

另外一個(gè)讓我很頭疼的就是 Relationships,寫這塊的那天可能有點(diǎn)情緒原因,看蘋果官方的 Guideline 看不進(jìn)去,而且 Google 關(guān)于 Relationships 相關(guān)的文章也十分少,索性自己悶頭研究了。

先說(shuō)說(shuō)我遇到了什么問(wèn)題,我想將屬于一個(gè)歌單的所有 Song 實(shí)體添加到 Playlist 實(shí)體的 songs 這個(gè) Relationships 中去,但是發(fā)現(xiàn)怎么加都加不進(jìn)去。我已開始的做法是先用 valueForKey 拿到 songs 屬性所代表的 NSManagedObject,然后強(qiáng)制轉(zhuǎn)換到 NSMutableSet 然后執(zhí)行添加操作,發(fā)現(xiàn)人家壓根不鳥我這個(gè)操作,雖然沒(méi)有拋異常,也沒(méi)有任何 log 打出,但是 “It does NOT work!!!”。

經(jīng)過(guò)一番研究,我發(fā)現(xiàn)了 NSManagedObject 有個(gè) mutableSetValueForKey,才發(fā)現(xiàn)當(dāng)初我真是傻了逼了....

于是用 mutableSetValueForKey 拿到這個(gè) NSMutableSet 順利執(zhí)行添加操作并保存,成功了。

#2 Type Conversion From Objective-C to Swift

這塊主要是談?wù)勔恍╆P(guān)于類型的一些事。我們知道 Swift 引入了一系列新的數(shù)據(jù)類型,比如 String、Int、Dictionary、Array,還有一個(gè)神奇的 AnyObjectOptional<T> 值。

這里我就直接說(shuō)了
Swift 中的 String 可以直接作為 NSString 使用,它們之間可以 Toll-Free 轉(zhuǎn)換
Int、FloatDouble 仍然不是一個(gè)標(biāo)準(zhǔn)的 NSObject 對(duì)象,所以 KVC 就沒(méi)有它們什么事,所以我們?nèi)匀恍枰?NSNumber 包裝一下送入 NSManagedObject,同時(shí)拿出來(lái)的時(shí)候用 xxxValue 取出。

還有,Relationships 一定是 NSSet 類型,不是 NSArray 類型,數(shù)據(jù)庫(kù)的關(guān)系都是無(wú)序的,如果需要有序可以添加一個(gè)字段然后查詢時(shí)用 SortDescription 來(lái)排序。

最后,"!"是邪惡符號(hào),慎用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,304評(píng)論 4 61
  • 那些無(wú)所謂的等待,使你在小巷的盡頭等我回家,我在何時(shí)遇見(jiàn)了你,我們相戀吧… 那些昏黃破舊的信紙,滿是老掉牙的情話,...
    丿啷個(gè)哩個(gè)啷閱讀 576評(píng)論 0 0
  • 1.對(duì)于工作要耳熟能詳。“希望接受這位上司的指導(dǎo),想要跟隨他,聽從他的話絕對(duì)不會(huì)錯(cuò)……”,若屬下對(duì)你有如此印象,你...
    就業(yè)創(chuàng)業(yè)聯(lián)盟閱讀 2,168評(píng)論 0 1
  • 兩天的北京學(xué)習(xí)結(jié)束;今天周日,上午用多睡了一個(gè)小時(shí)來(lái)補(bǔ)償北京的勞累生活;然后就是整理材料、手機(jī)工作、準(zhǔn)備我孩子的...
    Key的2017閱讀 482評(píng)論 0 0
  • 小住老屋(八) 母親正在洗衣服,見(jiàn)我褲腳上被露水打濕,也沾了一些塵土,叫我換下來(lái)洗掉。父親見(jiàn)我未帶衣服,連忙到屋內(nèi)...
    春之原野閱讀 423評(píng)論 2 6

友情鏈接更多精彩內(nèi)容