2012-07-05 44 views
0

我正在開發一個iPhone應用程序,用於收集來自3個獨立提要的數據。在applicationDidFinishLaunchingapplicationWillEnterForeground並執行以下操作:來自遠程數據源的核心數據存儲

[self emptySchedule]; 
[self populateSchedule]; 
[self emptyPlayers]; 
[self populatePlayers]; 
[self emptyNews]; 
[self populateNews]; 

空的方法簡單地從核心數據中刪除信息,並填入方法調用各種Web JSON/XML提要添加信息返回到核心數據。它似乎這樣做非常快;但想知道這是否是保持信息在應用程序中最新的首選方法。

編輯:

只給一些背景,下面是用於空了幾個方法/填充:

因爲這主要是異步不會影響應用程序的啓動時間?

- (void) emptySchedule 
{ 
    NSFetchRequest * allEvents = [[NSFetchRequest alloc] init]; 
    [allEvents setEntity:[NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext]]; 
    [allEvents setIncludesPropertyValues:NO]; //only fetch the managedObjectID 

    NSError * error = nil; 
    NSArray * events = [self.managedObjectContext executeFetchRequest:allEvents error:&error]; 
    //error handling goes here 
    for (NSManagedObject * event in events) { 
     [self.managedObjectContext deleteObject:event]; 
    } 
    NSError *saveError = nil; 
    [self.managedObjectContext save:&saveError]; 
} 

-(void)populateSchedule 
{ 
    NSURL *url = [NSURL URLWithString:SCHEDULE_FEED_URL]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id schedule) 
             { 
              for (NSDictionary *campEvent in schedule) 
              { 
               Event *event = nil; 

               event = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:self.managedObjectContext]; 
               event.eventName = [campEvent valueForKeyPath:@"eventName"]; 
               event.ticketsRequired = [campEvent valueForKeyPath:@"ticketsRequired"]; 
               event.location = [campEvent valueForKeyPath:@"location"]; 
               event.practiceStart = [NSDate dateWithTimeIntervalSince1970:[[campEvent valueForKeyPath:@"practiceStart"] doubleValue]]; 
               event.practiceEnd = [NSDate dateWithTimeIntervalSince1970:[[campEvent valueForKeyPath:@"practiceEnd"] doubleValue]]; 
              } 
              NSError *saveError = nil; 
              //Save inserts 
              [self.managedObjectContext save:&saveError]; 

               //Notify other objects of this 
              [[NSNotificationCenter defaultCenter] postNotificationName:@"populateSchedule" object:nil]; 

             } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
              UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error" message:@"Error Retrieving Data. Please try again later." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
              [alert show]; 
             }]; 
    [operation start]; 
} 
+0

對於*保持信息在應用程序中的最新狀態,您有什麼意義*?謝謝。 – 2012-07-05 17:22:52

+0

這些提要從各種來源提取信息。我將這些信息存儲在覈心數據中,當應用程序啓動或進入前臺時,我再次獲取數據。 – 2012-07-05 17:26:58

回答

1

我會盡量根據我的個人經驗來回答。也許別人會對此有不同的看法。

在您的情況下,同步僅在應用程序生命週期的各個階段執行。

所以,我會添加第三個。當用戶提問時。但它嚴格取決於您的應用程序的性質。另一種方法是設置一個定期喚醒的後臺線程,並要求服務器發送新數據。這可能比手動同步更復雜。

關於這兩種方式,我將在特定後臺線程中執行導入操作。你可以設置你自己的操作(NSOperation類也存在這種類型的任務)並在那裏做東西或使用新的iOS 5隊列核心數據API。

如果你還沒有做過(後臺導入),也爲你的實際方法(我認爲在這種情況下,你可以統一對empty/populate)。這種機制可以讓你提升應用程序的啓動速度,並告訴用戶發生了什麼,而不會凍結用戶界面:「你好,我從服務器獲取數據!請稍候」

編輯

關於你的代碼添加它確定爲我。只有兩點考慮。

首先,如果在主線程中執行刪除操作,如果您有大量要刪除的條目,則可能會阻塞主線程。在這種情況下,用戶界面可能無法響應。無論如何,你已經做好了將setIncludesPropertyValues設置爲NO的工作。

關於其他片段,我猜測只有數據下載是以異步方式進行的。完成處理程序在主線程中執行(例如,您可以檢查BOOL isMainThread = [NSThread isMainThread]),核心數據對象的創建及其相對保存。同樣在這種情況下,如果您有大量數據,主線程可能被阻止。

無論如何,如果您已經完成了一些測試並且該應用程序不需要太長的啓動時間,則可以保留在您的代碼中。如果你開始看到某種延遲,也許你可以在背景中進行核心數據操作。

由於沒有iOS 5 API,save調用可能(我說因爲您可以保存大塊數據而不是整個)需要時間來執行(特別是當您有很多對象存儲在內核中時數據文件)。從iOS 5開始,您可以利用新類型的NSManagedObjectContextqueue concurrency type)和父子上下文。此外,您可以避免編寫整個Core Data堆棧並使用UIManagedDocument類。通過save可以在併發隊列中執行而不會阻塞主線程。

希望有所幫助。

+0

我也有手動刷新,我只是沒有這樣做。我發佈了一些示例代碼。請讓我知道這是否會影響發佈時間。它似乎不是。 – 2012-07-05 18:13:41

+0

@ChrisMuench我添加了一個編輯。希望有所幫助。乾杯。 – 2012-07-05 20:24:22