2012-08-04 151 views
5

我正在使用一個核心數據NSFetchedResultsController UITableView,具有瞬態NSDate屬性。我將它作爲一個瞬態屬性的主要原因是我的UITableView條目基於NSDate放入部分,但可以在日期更改時在部分之間移動。iOS - 如何刷新/更新核心數據瞬態屬性?

到目前爲止,它似乎工作得很好,但它只更新/刷新(我真的很新,所以我不知道我是否使用了正確的術語,對不起!)當我關閉應用程序並將其從多任務中刪除,或通過Xcode重新運行。如果我不這樣做,這些項目不會改變,也不會放入正確的部分。有沒有辦法手動讓它刷新,所以用戶不需要這樣做,讓它運行正確?

謝謝!

+0

如何傳播更新? NSFetchedResultsController委託? – Mundi 2012-08-04 21:07:01

+0

是的,我認爲是。 – mhbdr 2012-08-04 21:27:28

+1

對於SQlite商店,您可能不適用於排序描述符的瞬態屬性。 – 2012-08-05 06:55:14

回答

3

當您向對象發送refreshObject:mergeChanges:時,瞬態屬性會刷新。

Mundi提供的應用關鍵值觀察機制的解決方案也可以起作用,如果確實如此,它肯定比明確刷新更方便。

+0

嘿斯維納,謝謝你的回覆。我會在哪裏放置refreshObject:mergeChanges?它會在行動中嗎?謝謝! – mhbdr 2012-08-06 07:08:37

+0

您可以在知道日期更改的點上刷新對象。不過,我鼓勵你採取蒙迪推薦的方法。它更方便。知道你總是可以明確地刷新一個瞬態屬性並且你應該選擇,這是很好的。 – svena 2012-08-06 20:35:21

+0

似乎沒有刷新瞬態屬性:「如果標誌爲YES,則此方法不會影響任何瞬態屬性」 https://developer.apple.com/reference/coredata/nsmanagedobjectcontext/1506224-refreshobject – 2017-03-22 18:53:13

7

第一個,請確保您創建您的抓取結果控制器時,瞬態屬性僅用於sectionNameKeyPath。最好命名爲sectionIdentifier(正如Apple在其示例代碼中所做的那樣)。實際日期應該是您實體的單獨屬性。 (我將其稱之爲dateAttribute

,請確保您在Entity.m文件中指定的關鍵路徑依賴:

+ (NSSet *)keyPathsForValuesAffectingSectionIdentifier { 
    // If the value of dateAttribute changes, the section identifier may change as well. 
    return [NSSet setWithObject:@"dateAttribute"]; 
} 

,確保在你的控制器,你作出適當的反應在管理對象方面的變化通過

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    if (!self.tableView.editing) [self.tableView reloadData]; 
    // the quick and dirty method without animations; 
    // see referenced code for a more pleasant approach 
} 

如果有不清楚的地方,看看蘋果的例子DateSectionTitles

+0

你是否100%肯定keyPathsForValuesAffecting ...在它是一個瞬態屬性時強制刷新?我之前已經注意到,僅當refreshObject:mergeChanges:被髮送到對象時,瞬態屬性纔會刷新。 – svena 2012-08-06 06:30:43

+0

是的,當然。這是來自現場應用程序的工作代碼。 – Mundi 2012-08-06 07:11:49

+0

所以我建立了幾乎完全像蘋果的例子,但它似乎沒有刷新時,有一個變化。每個項目的部分標識符都是由nsdate差異的大計算創建的,但是當我啓動應用程序時,它似乎並沒有像我從多任務處理應用程序並重新打開應用程序那樣再次計算它們。 – mhbdr 2012-08-07 18:52:04