Swift使用CoreData時遇到的一些填坑記錄
前言
最近在做一個 App 練手,其中用到了 CoreData 來存儲用戶的播放列表,由于 CoreData 這部分的文章還是比較少的,所以遇到了不少坑,所以寫篇隨筆記錄一下。
題外話:可以給大家看看這個 App 的界面,我覺得還是挺清新的😄
P.S. 作為背景的氛圍圖片用的是 CoreImage 生成的
切入正題。
#0 何時執(zhí)行保存
起初我認為不用顯式執(zhí)行 Xcode 給我們在 AppDelegate 中生成的 saveContext 函數(shù),因為默認情況下 applicationWillTerminate 會執(zhí)行 saveContext,但是我發(fā)現(xiàn)這個生命周期函數(shù)壓根不靠譜,當用戶直接從多任務視圖將 App 結束掉時這個函數(shù)根本來不及執(zhí)行完畢,導致我們的數(shù)據(jù)不能及時寫入本地數(shù)據(jù)庫中。所以合理的調用時機我認為還是應該在完成一批操作以后就直接執(zhí)行一次 saveContext
下面簡單貼一下我的部分代碼吧:
#1 Relationships 到底什么鬼
另外一個讓我很頭疼的就是 Relationships,寫這塊的那天可能有點情緒原因,看蘋果官方的 Guideline 看不進去,而且 Google 關于 Relationships 相關的文章也十分少,索性自己悶頭研究了。
先說說我遇到了什么問題,我想將屬于一個歌單的所有 Song 實體添加到 Playlist 實體的 songs 這個 Relationships 中去,但是發(fā)現(xiàn)怎么加都加不進去。我已開始的做法是先用 valueForKey 拿到 songs 屬性所代表的 NSManagedObject,然后強制轉換到 NSMutableSet 然后執(zhí)行添加操作,發(fā)現(xiàn)人家壓根不鳥我這個操作,雖然沒有拋異常,也沒有任何 log 打出,但是 “It does NOT work!!!”。
經(jīng)過一番研究,我發(fā)現(xiàn)了 NSManagedObject 有個 mutableSetValueForKey,才發(fā)現(xiàn)當初我真是傻了逼了....
于是用 mutableSetValueForKey 拿到這個 NSMutableSet 順利執(zhí)行添加操作并保存,成功了。
#2 Type Conversion From Objective-C to Swift
這塊主要是談談一些關于類型的一些事。我們知道 Swift 引入了一系列新的數(shù)據(jù)類型,比如 String、Int、Dictionary、Array,還有一個神奇的 AnyObject 和 Optional<T> 值。
這里我就直接說了
Swift 中的 String 可以直接作為 NSString 使用,它們之間可以 Toll-Free 轉換
Int、Float、Double 仍然不是一個標準的 NSObject 對象,所以 KVC 就沒有它們什么事,所以我們仍然需要用 NSNumber 包裝一下送入 NSManagedObject,同時拿出來的時候用 xxxValue 取出。
還有,Relationships 一定是 NSSet 類型,不是 NSArray 類型,數(shù)據(jù)庫的關系都是無序的,如果需要有序可以添加一個字段然后查詢時用 SortDescription 來排序。
最后,"!"是邪惡符號,慎用。
CoreData在Swift 3.0中的一點改變
在Swift 2.0中我們需要從core data中query結果的時候使用的是如下方式:
func findAnimals() { let request = NSFetchRequest(entityName:”Animal") do { guard let searchResults = try context.executeFetchRequest(request) as? [Animal] else { print("Results were not of the expected structure") } ... use(searchResults) ... } catch { print("Error ocurred during execution: \(error)") } }
注意:以上代碼試圖將executeFetchRequest返回的結果轉換為實際數(shù)據(jù)類型的數(shù)組。同時我們看到,在建立request的時候直接使用的是NSFetchRequest的純構造器方式。
但是在Swift 3.0中首先我們在創(chuàng)建request的時候必須用范型來指定實際數(shù)據(jù)類型,你可以用如下任何一句來完成:
let fetch0 = NSFetchRequest<Commit>(entityName: "Commit") let fetch1:NSFetchRequest<Commit> = Commit.fetchRequest()
接下來在處理fetch結果的時候我們不可以將NSFetchRequestResult直接轉換為[Commit],因為這樣非相關性的轉換總是失?。∽鳛榇嫖覀兪褂胏ontext的另一個方法來完成:
do{ let commits = try managedObjectContext.fetch(fetch) print("***** \(commits.count) commits *****") objects = commits tableView.reloadData() }catch let error{ print("Fetch failed : \(error.localizedDescription)") }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Swift算法實現(xiàn)字符串轉數(shù)字的方法示例
最近學完了swift想著實踐下,就通過一些簡單的算法進行學習研究,下面這篇文章主要介紹了Swift算法實現(xiàn)字符串轉數(shù)字的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03iOS中Swift指觸即開集成Touch ID指紋識別功能的方法
隨著移動支付時代的到來,Touch ID 指紋驗證迅速被支付寶,微信錢包普及,相信各位朋友使用后也大呼方便。下面給大家分享iOS中Swift指觸即開集成Touch ID指紋識別功能的方法,一起看看吧2017-03-03Swift如何調用Objective-C的可變參數(shù)函數(shù)詳解
這篇文章主要給大家介紹了關于Swift如何調用Objective-C的可變參數(shù)函數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用swift具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-03-03