2012-09-13 79 views
0

我正在使用RestKit將數據導入到Core Data存儲中,並且需要檢查重複項。如果商品已在商店中,我想用最新的屬性進行更新。如果它是一個新項目,我想創建它。導入到CoreData時檢查重複

進口很慢,所以我用儀器,發現進口的最長的部分是檢查,看看該項目的已存在的(與讀取請求)

所以我想知道,如果檢查,看看如果該項目已經在店裏,是它能更快:

  • 使用countForFetchRequest看,如果該項目已存在,則executeFetchRequest返回更新的項目或
  • 只是executeFetchRequest拿到項目更新
  • 還是有更好的方法來做到這一點?

我認爲countForFetchRequest會更快,因爲整個NSManagedObject不會返回並且只有在我知道會有NSManagedObject時才執行獲取請求。

感謝

- (Product *)productWithId:(int)productID {

NSManagedObjectContext *context = [Model sharedInstance].managedObjectContext; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"product_id == %d", productID]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    request.entity = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:context]; 
    request.predicate = predicate; 
    request.fetchLimit = 1; 

    NSError *error = nil; 

    NSUInteger count = [context countForFetchRequest:request error:&error]; 

    if (!error && count == 1) { 
     NSArray *results = [context executeFetchRequest:request error:&error]; 
     if (!error && [results count]) { 
      return [results objectAtIndex:0]; 
     } 
     return nil; 
    } 

    return nil; 

}

+0

我沒有做過多的性能檢查,但我使用'[fetchRequest setFetchLimit:1];''和'countForFetchRequest',我沒有真正注意到任何性能問題。有多少個對象正在更新?你只發送需要更新的對象嗎? (來自Web服務) – mkral

+0

還要確保您沒有在主線程上進行同步 – mkral

+0

多個項目一次從API進來,並且都需要檢查重複項目。它不是一次一個。 –

回答

3

據我所知,最好的方式找到和/或核心數據中的進口對象Implementing Find-or-Create Efficiently描述。

該文檔描述了一個查找或創建模式,它基於排序數據:您從服務中下載的數據以及您從商店中獲取的數據。

我真的建議你閱讀我提供的鏈接。你會看到你的表演速度加快。

顯然,您應該在後臺執行此操作,防止主線程凍結,使用線程限制或新的iOS Core Data隊列API。

希望有所幫助。

+0

頁面。 :( – Shrawan