2013年11月16日 星期六

[iOS] Core Data 的 思

我的Core Data 的思維模式大致上是從

https://github.com/robbiehanson/XMPPFramework

XMPPFramework / Extensions / CoreDataStorage

中得到想法或靈感

其中比較重要的是
他利用多執行續去執行 core data  (在 apple 的guide line 中其實不建議用多執行續去做)

我將這個方法套用在我現在的專案上

1. model control 動作後,會呼叫 sub thread 上的 NSManagedObjectContent (moc) 做動作

2. VC 上,用的是 Main thread moc 產生的 NSFetchedResultsController 來操縱 View


一開始看起來都還ok

不過最近卻發現一些問題





1. UI 層究竟是要用 Main thread 還是 sub thread ?

NSFetchedResultsController 可以藉由 Main thread 或 sub thread 上的moc 產生

當呼叫delegate 時,所出發位於的thread 也顯而易見的是 該thread

因此 如果用的是 sub thread 產生的NSFetchedResultsController,發到delegate時是sub thread,如果動作到ui 也就需要 在包上一層 dispatch_asyn ....

不確定哪種會比較好...


2. sub thread 上的moc 產生的 object 不可以直接給 main thread 上的moc用

這件事情也困擾了我一陣子

通常我會用一個singleton的物件當做global model 去抓取使用者選取等等的動作物件,借此在不同VC之間溝通,

但是因為如果sub thread or main thread 的問題,即使抓住了也無法直接丟給另一條的moc使用,另外..

如果strong 該物件也有可能會造成 fault 等的問題,

最後的作法還是,用擷取物件的identify (自定), global 物件是 copy 該id

然後每當要對物件動作時,則是用fetch 在去查該物件出來使用,(不過這樣的問題,效能會比較慢...)


3. 交握行為導致"CoreData could not fulfill a fault"

發生情況:
View 上面用的是 Main Thread 產生的 NSFetchedResultsController

當幾乎是同時對model controller,依序觸發下面兩個動作時,
1.加入新的物件到db中
2.刪除該db中所有的物件,且新增其他的物件

因為第一個動作執行完後 觸發了 save,當完成就會觸動 core date通知 NSFetchedResultsController 該更新畫面,但是還沒更新完成 (也就是 Main thread 上的moc 正在向 db拿資料),第二個動作也同時觸發了,因此main thread 拿到一半 該物件就被刪除,就發生了 exception

這個我還想不到方法解決,當然如果把view 上面的 NSFetchedResultsController 改用 sub thread產生,就不會發生這個問題了,

但是.... 總覺得 sub thread 物件給 main thread 呼叫很怪


4. 某些狀況,sub thread save 後,沒有即時的更新到 main thread

可能是 time issue

我最直接的解法是  在處理 物件的 function 最後就手動做 save (一般是交由 dataManager 做)就能強迫即時產生變化,不過 這樣好像也失去了原來這個 dataManager的用意


-------------------
final

經過了自己的使用,可能會在思考一下

如果在一般簡單的案子下使用Core Data

且還能維持現在的形式

或許會保持接孔,把內裝都改一下吧!

沒有留言:

張貼留言