簡體   English   中英

實體上次修改日期

[英]Entity last modification date

獲得整個Enity的最后修改日期是否有任何解決方案? 由於應用程序與Web服務同步(其中一些將在具有較舊日期的數據庫中),因此每個NSManagedObject時間戳將不是一個好的解決方案。

每次用戶決定更新列表時,我都需要為整個實體創建一個時間戳,這樣我就可以在SSPullToRefresh顯示這個日期。

我腦子里只有一個解決方案: NSUserDefaults但它是保持實體上次修改日期的好地方嗎?

實現此目的的一種方法是創建一個實體,其唯一目的是跟蹤實體的修改。 它可能看起來像:

LastModified:
    date (NSDate*)
    key (NSString*)

您可以將key屬性視為實體名稱

您可以在啟動時填充這些實體(如果需要)。
您還可以創建一個全局字典,在啟動時將其key映射到其objectID

您使用此對象的方式是:
當您開始同步操作時,您將獲取應更新的實體並將其設置為當前日期,如果您知道哪些實體將更新(更好地反映現實)。

如果沒有,則在保存之前查看上下文的所有更新,插入,刪除的集合,並創建一組已更改的實體類型,並更新與這些鍵(實體名稱)對應的LastModified對象。

這種方法的好處是:

  1. 如果您實際設法提交/保存同步操作更改,則只更新“上次修改”日期
  2. 您可以使用KVO觀察這些對象的更改以更新UI。
  3. 您不必像其他方法那樣經常查詢商店

壞處:

  1. 如果您的CoreData實體彼此繼承或者您有多個影響同一key實體(並且您不知道在同步中將更新哪些密鑰),則維護起來會更復雜(您可能希望使用實體userInfo字典存儲key以便不同的實體可以更新相同的修改日期)

我過去使用的策略是查找實體類型最近修改的記錄。

因此,假設您有一個聯系實體,並且您希望同步上次執行同步時的任何更改。 查詢所有本地聯系人記錄,並按lastModifiedDate按降序對其進行排序。 返回的第一個結果是您在查詢Web服務時要使用的時間戳。

在編寫本教程“ 如何使用Web服務同步核心數據”時,我使用了此策略

我發現的最大優勢是您無需擔心確保服務器時間與設備的本地時間同步。 如果它們在幾分鍾后關閉,你就不會“錯過”任何東西。

您可以保持簡單並使用NSUserDefaults 您可以向NSManagedObjectContextWillSave通知添加觀察者。 然后,使用ClassNSString名稱創建/更新NSDate對象。 我在我的AppDelegate有這個:

在應用程序中:didFinishLaunchingWithOptions:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(mocWillSave:)
                                             name:NSManagedObjectContextWillSaveNotification
                                           object:self.managedObjectContext];

選擇

- (void)mocWillSave:(NSNotification*)note {
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    // Get array of classes that have been updated.
    // This way, we don't loop through every updated Object...just the 
    // unique classes in the updatedObjects set.
    NSArray *updatedObjectClasses = [self.managedObjectContext.updatedObjects valueForKeyPath:@"class"];

    for (id obj in updatedObjectClasses) {
        [userDefaults setObject:[NSDate date] forKey:obj];
    }

    [userDefaults synchronize];
}

注意:這當然只涉及到updatedObjects 你當然可以對insertedObjects做同樣的事情。

我傾向於避免NSUserDefaults總是感覺像混合蘋果和橘子。

當我需要存儲這樣的信息時,我喜歡把它放在NSPersistentStore本身的元數據中。 這樣它就附加到我正在與Web服務同步的文件中。

NSPersistentStoreCoordinator上有一些方法允許您訪問元數據並對其進行更改。 然后,如果文件被移植到另一個設備(比如在恢復或其他設備中),元數據就會隨之移動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM