2012-07-05 4 views
0

3 개의 별도 피드에서 데이터를 수집하는 iPhone 앱을 개발 중입니다. applicationDidFinishLaunchingapplicationWillEnterForeground에서 다음을 수행하십시오코어 데이터 저장소 원격 데이터 소스

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

빈 방법은 간단하게 핵심 데이터에서 정보를 제거하고 채우기 방법은 다양한 웹 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

앱 *에서 정보를 최신으로 유지하기위한 의미는 무엇입니까? 감사. –

+0

피드는 다양한 소스에서 정보를 가져옵니다. 정보를 핵심 데이터에 저장하고 앱을 시작하거나 포 그라운드로 가져 오면 다시 데이터를 가져옵니다. –

답변

1

나는 개인적인 경험을 바탕으로 대답하려고 노력할 것입니다. 어쩌면 다른 누군가가 그것에 대해 다른 견해를 가질 수 있습니다.

경우에 따라 동기화는 응용 프로그램 수명주기 단계에서만 수행됩니다.

그래서 세 번째를 추가합니다. 사용자가 요청할 때. 그러나 이것은 응용 프로그램의 성격에 따라 다릅니다. 또 다른 방법은 주기적으로 깨어나서 새 데이터를 보내도록 서버에 요청하는 백그라운드 스레드를 설정하는 것입니다. 수동으로 동기화하는 것보다 더 복잡 할 수 있습니다.

이 두 가지 방법으로 특정 백그라운드 스레드에서 가져 오기 작업을 수행합니다. 자신 만의 작업 (NSOperation 클래스도이 유형의 작업을 수행 할 수 있음)을 설정하고 그 작업을 수행하거나 새로운 iOS 5 Queue Core Data API를 사용할 수 있습니다. 이미 (수입 배경을)하지 않은 경우

이 실제 방법에 대해서도 그것을 (난 당신이 바로 쌍/populateempty를 통합 할 수이 경우 생각한다). 이 메커니즘을 사용하면 응용 프로그램 시작을 향상시키고 UI가 정지하지 않고 계속 진행되는 내용을 사용자에게 알릴 수 있습니다. "안녕하세요, 서버에서 데이터를 가져옵니다!" 기다려주십시오. 코드에 대해

편집 당신은 나에게 괜찮했다. 단 두 가지 고려 사항.

먼저 삭제할 항목이 많은 경우 주 스레드에서 삭제를 수행하면 주 스레드가 차단 될 수 있습니다. 이 경우 UI가 응답하지 않을 수 있습니다. 어쨌든 setIncludesPropertyValues에서 NO으로 설정하는 것이 좋습니다.

다른 스 니펫에 관해서는 데이터 다운로드 만 비동기식으로 이루어집니다. 완료 핸들러는 주 스레드에서 수행되며 (예 : BOOL isMainThread = [NSThread isMainThread]으로 확인할 수 있음) 핵심 데이터 개체 생성과 상대 저장을 수행합니다. 또한이 경우 많은 양의 데이터가있는 경우 주 스레드가 차단 될 수 있습니다.

어쨌든 몇 가지 테스트를 수행하고 응용 프로그램을 시작하는 데 너무 오래 걸리지 않으면 코드 만 남을 수 있습니다. 어떤 종류의 대기 시간이 보이기 시작하면 배경에서 핵심 데이터 작업을 수행 할 수 있습니다.

iOS 5 API가없는 경우 save 호출은 수행 할 수있는 시간이 걸릴 수 있습니다 (특히 전체 데이터가 아닌 데이터의 덩어리를 저장할 수 있기 때문에 가능합니다). 특히 코어에 저장할 객체가 많은 경우 데이터 파일). 양식 iOS 5를 시작하면 새로운 유형의 NSManagedObjectContext (queue concurrency type)과 상위 - 하위 컨텍스트를 활용할 수 있습니다. 또한 전체 핵심 데이터 스택을 작성하고 UIManagedDocument 클래스를 사용하지 않아도됩니다. save을 사용하여 주 스레드를 차단하지 않고 동시 대기열에서 수행 할 수 있습니다.

희망이 있습니다.

+0

나는 또한 수동으로 새로 고침을 가지고, 난 그냥 넣어하지 않았다. 일부 예제 코드를 게시했습니다. 이것이 발사 시간에 영향을 주는지 알려 주시기 바랍니다. 그렇게 보이지 않습니다. –

+0

@ChrisMuench 편집을 추가했습니다. 희망이 도움이됩니다. 건배. –