iOS開發(fā) NSFetchedResultsController管理UITableView數(shù)據(jù)

本文介紹通過CoreData實現(xiàn)表視圖界面數(shù)據(jù)的存儲和通過NSFetchedResultsController更新表視圖的數(shù)據(jù)矩动,例子為一個表視圖界面的照片管理器勺三,界面如下隧膘。


demo.jpg

完整代碼見文章末尾囤采。

要向項目中引入Core Data述呐,先添加一個新的Data Model文件,如下蕉毯,我給它命名為DataModel乓搬。


CoreData1.png

向新建的DataModel添加一個entity思犁,我給它命名為Item,并向其添加兩個屬性photoDescription和photoID缤谎,分別設置類型如圖抒倚。


CoreData2.png

因為每個表格條目的圖片可有也可無,photoID設置為可選類型坷澡,勾選其Attribute->Properties->Optional托呕。


CoreData3.png

點擊剛剛創(chuàng)建的實體Item,可以看到频敛,這個實體為NSManagedObject類项郊,也就是說,每當你從Core Data中取出一個Item斟赚,它返回給你的是NSManagedObject類型的對象着降。


CoreData3-1.png

現(xiàn)在我們給Item實體創(chuàng)建屬于它自己的類,點擊菜單欄->Editor->Create NSManagedObject Subclass拗军。選中先前創(chuàng)建的DataModel任洞。


CoreData4.png

選中Item實體。


CoreData5.png

下一步发侵,勾選Use scalar properties for primitive data types選項交掏。


CoreData6.png

創(chuàng)建完成后,項目中會增加兩個文件刃鳄。


CoreData6-1.png

其中Item類繼承了NSManagedObject類盅弛,而Location+CoreDataProperties.swift文件中的Item前有個extension關鍵詞。有了這個extension叔锐,我們就可以在已存在的Item類中添加額外的代碼挪鹏。


CoreData6-2.png

加載我們的表視圖數(shù)據(jù)并將其連接到SQLite數(shù)據(jù)存儲區(qū),需要用到NSManagedObjectContext愉烙。打開AppDelegate讨盒,添加以下代碼:


CoreData8.png

1處 我們先前建立的Core Data Model存放在了我們的app Bundle里,現(xiàn)在我們建立一個modelURL常量來存放它的url地址步责。
2處 用上面找到的url地址創(chuàng)建一個NSManagedObjectModel返顺,它相當于我們的數(shù)據(jù)模型。
3處 由于應用的數(shù)據(jù)是存放在應用文件夾里的SQLite數(shù)據(jù)庫中的勺择,這里我們首先建立常量urls找到應用的文件目錄,再建立一個指向數(shù)據(jù)庫文件的storeURL常量伦忠。
4處 創(chuàng)建NSPersistentStoreCoordinator對象省核,該對象用來管理SQLite數(shù)據(jù)庫。
5處 將SQLite數(shù)據(jù)庫連接所創(chuàng)建的NSPersistentStoreCoordinator對象昆码,使得該對象可以設置數(shù)據(jù)存儲的名字气忠,位置等等邻储。
6處 創(chuàng)建并返回NSManagedObjectContext對象。

通常我們通過修改NSManagedObjectContext對象來改變Core Data里存放的數(shù)據(jù)旧噪。由于例子中兩個視圖控制器(分別為MainViewController和ItemDetailViewController)都涉及到數(shù)據(jù)的變更吨娜,為此兩個視圖控制器中都要定義NSManagedObjectContext對象并且從AppDelegate傳遞過去。


CoreData9.png

CoreData10.png

上面我們已經(jīng)在兩個視圖控制器中定義了managedObjectContext淘钟,接下來就要實現(xiàn)三個文件(MainTableViewController.swift,ItemDetailViewController.swift,AppDelegate.swift) 中managedObjectConext的關聯(lián)了宦赠。

  1. 首先將AppDelegate中的managedObjectConext傳遞給MainTableViewController,我們在應用啟動時執(zhí)行的方法中實現(xiàn)米母,代碼如下勾扭。


    CoreData12.png
  2. 然后將MainTableViewController獲取到的managedObjectConext傳遞給ItemDetailViewController,由于后者是通過segue觸發(fā)的铁瞒,所以我們在前者的prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)方法中實現(xiàn)妙色,代碼如下:


    CoreData11.png

截至目前,一切已經(jīng)準備就緒慧耍,接下來就是數(shù)據(jù)的裝載身辨。
為了讓數(shù)據(jù)顯示在表格視圖控制器中,我們定義一個NSFetchedResultsController用于從數(shù)據(jù)存儲區(qū)抓取數(shù)據(jù)并顯示在TableView中芍碧。


CoreData13.png

1處
2處
3處
4處

有了fetchedResultsController后煌珊,我們就可以讓它干活了,在viewDidLoad()中添加如下代碼:


CoreData14.png

這樣每次表格視圖控制器刷新师枣,fetchedResultsController都從數(shù)據(jù)存儲區(qū)中抓取數(shù)據(jù)怪瓶。

接下來完善MainTableViewController的數(shù)據(jù)源。


CoreData15.png

新建一個.swift文件践美,命名為MainTableViewController+NSFetchResult.swift洗贰。我們將會在這個文件中實現(xiàn)NSFetchedResultsController的委托方法。每當有數(shù)據(jù)插入陨倡,刪除敛滋,更新或者是移動了,NSFetchedResultsController都會觸發(fā)對應的方法讓TableView知道兴革,這樣以來TableView對應地插入绎晃,刪除或者更新行。


CoreData16.png

這里所有的代碼都可以直接放入MainTableViewController類中杂曲,另外建立一個文件只是為了讓代碼結(jié)構更清晰庶艾。

為了讓tableView能響應用戶的手勢刪除對應的行,我們在TableView的DataSource區(qū)域加入以下代碼:


CoreData17.png

到此為止擎勘,MainTableViewController的構建已經(jīng)完成了咱揍。最后我們來填充ItemDetailViewController。
由于我們要將添加的照片放入數(shù)據(jù)存儲區(qū)中棚饵,所以要先將選中的照片傳遞到done函數(shù)中煤裙。


CoreData19.png

點按該視圖控制器中的Done按鈕之后掩完,圖片和圖片描述將會被存儲。


CoreData18.png

完整代碼在此: https://github.com/vega627/HudViewDemo

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硼砰,一起剝皮案震驚了整個濱河市且蓬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌题翰,老刑警劉巖恶阴,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遍愿,居然都是意外死亡存淫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門沼填,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桅咆,“玉大人,你說我怎么就攤上這事坞笙⊙冶” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵薛夜,是天一觀的道長籍茧。 經(jīng)常有香客問我,道長梯澜,這世上最難降的妖魔是什么寞冯? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮晚伙,結(jié)果婚禮上吮龄,老公的妹妹穿的比我還像新娘。我一直安慰自己咆疗,他們只是感情好漓帚,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著午磁,像睡著了一般尝抖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迅皇,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天昧辽,我揣著相機與錄音,去河邊找鬼登颓。 笑死搅荞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播取具,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扁耐!你這毒婦竟也來了暇检?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤婉称,失蹤者是張志新(化名)和其女友劉穎块仆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體王暗,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡悔据,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俗壹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片科汗。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绷雏,靈堂內(nèi)的尸體忽然破棺而出头滔,到底是詐尸還是另有隱情,我是刑警寧澤涎显,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布坤检,位于F島的核電站,受9級特大地震影響期吓,放射性物質(zhì)發(fā)生泄漏早歇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一讨勤、第九天 我趴在偏房一處隱蔽的房頂上張望箭跳。 院中可真熱鬧,春花似錦悬襟、人聲如沸衅码。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逝段。三九已至,卻和暖如春割捅,著一層夾襖步出監(jiān)牢的瞬間奶躯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工亿驾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘹黔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像儡蔓,于是被迫代替她去往敵國和親郭蕉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這種時刻喂江,一瞥之下召锈,過去與未來轟轟然同時并至,我的意識成為長達半個世紀的灰燼获询,時間未至已成灰涨岁。一瞥間五十年諸般紛紜...
    神農(nóng)民閱讀 798評論 0 0
  • 小寧被一個網(wǎng)絡中相識了兩年多的女網(wǎng)友小芹表白了梢薪,因為小芹在姐姐家工作,所以并沒有機會相見尝哆。 后來小芹換...
    左言先生閱讀 440評論 0 0
  • 連續(xù)靈修86天經(jīng)文 【詩17:15】至于我秉撇,我必在義中見你的面;我醒了的時候秋泄,得見你的形像(“見”或作“著”)就心...
    報佳音閱讀 283評論 0 0
  • 過年啦畜疾,你的七大姑八大姨也來了,Are you ready印衔? 如何機智應對親戚詢問啡捶? Round One 躲 過年...
    掌中墨斗閱讀 280評論 0 0