2014-04-02 17 views
0

使用RestKit 0.20.3。在抓取的結果控制器的didChangeObject:(id) … forChangeType方法中放置post/put/delete(創建/更新/刪除)調用沒有解決。RestKit 0.20.x如何從表格視圖發佈/放置/刪除(創建/更新/刪除)

從數據庫獲取最新條目時,獲取結果控制器(FRC)獲取新插入的檢索記錄的插入通知。這會導致重複該對象的POST。該帖子本身導致兩個POSTS和五個PUTS。第一個POST是RestKit(RK)檢索和ID。第二個是導致POST的POST。 PUTS來自兩個帖子的更新,每個帖子都會在FRC中生成更改通知。這樣做的主要後果是每次刷新都會增加2次冪的記錄重複。

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { switch (type) { case NSFetchedResultsChangeInsert: [self.timeEntryTableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; // call to RK enqueue a POST with the object via RKObjectManager break; case NSFetchedResultsChangeDelete: [self.timeEntryTableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];//// // call to RK enqueue a DELETE with the object via RKObjectManager break; case NSFetchedResultsChangeUpdate: [self.timeEntryTableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; // call to RK enqueue a PUT with the object via RKObjectManager break; … } }

的問題是,什麼是正確的方法是什麼?我相信答案涉及核心數據關係和節約。我正在努力。不知道這會導致什麼。指針歡迎。

當前回答RestKit - Send added/edited/deleted objects after offline storage會幫助我。

+0

你怎麼定義'不必要'? FRC將收到有關更改的通知,但不一定會進行綜合更改。這也取決於你如何保存MOC關於如何發佈通知... – Wain

+0

你的評論讓我質疑,這種方法可能實際上是正確的,我可能已經犯了一些其他錯誤。我創建了一個較小的測試應用程序來驗證不良行爲,並驗證了我的懷疑,認爲這不是正確的方法。你會發現修改後的問題可以更清楚地描述不良行爲。是的,我認爲正確的做法可能與保存託管對象上下文有關。 –

回答

1

我假設服務器爲新對象分配唯一標識符,因此當您在本地創建對象時,它沒有一個開始。

FRC旨在更新表格視圖。所以,當你進行一次抓取時,你會得到一些不屬於FRC數據集但是現在已經存在的對象的插入。當你的代碼真的不是(大部分時間)時,你的代碼就會誤解爲新對象。

您應該檢查是否設置了唯一標識符,並且僅在不是時發佈新對象。從技術上講,如果您將唯一ID發送到服務器,則無論如何您都不應該得到重複,因爲它可以識別這個重複。

對於更新,您應該考慮爲您的實體添加一個changed標誌,該標誌在上傳成功後需要上傳的任何屬性被修改並重置時設置。用它來過濾PUT。

+0

我已經投了答案,因爲它的工作原理,並添加插入案例POST的示例代碼。您可以在[RKJets](https://github.com/telegraphy-interactive/RKJets)上找到完整的示例應用程序。答案和應用程序對我來說並不完全令人滿意,因爲我期望RestKit爲我做這種簿記,根據觀察對象的變化提出請求,並以一種或多或少的自以爲是的方式進行RESTful調用。如果是這樣,那麼這個答案和參考樣本是錯誤的。因此,我沒有將答案標記爲已接受。謝謝! –

+0

RestKit沒有這種自動功能(目前)。在0.1x版本中有一個分支,有人正在爲它工作,但它從來沒有達到0.2x。一般來說解決這個問題並不是一個小問題,但是您可能希望在RestKit的google小組上討論它,或者引發一個github問題。 – Wain

+0

根據您的說法,我已將此答案標記爲已接受的答案。感謝您的答覆。 –