2016-08-01 2 views
0

안녕하세요, 객관적인 C에 대한 마법의 레코드 라이브러리를 사용하여 코어 데이터 IOS와 함께 일하고 있어요. 라이브러리는 많은 NSManageObjectContext 개시가 있습니다. 앱 성능과 사용자 만족도를 유지하기 위해 우리는 무엇을 사용해야합니까?Magical Record IOS 목적 C. 우리는 어떤 상황에서 만들어야합니까?

많은

+ [NSManagedObjectContext MR_newContext]: Sets the default context as it's parent context. Has a concurrency type of NSPrivateQueueConcurrencyType. 
+ [NSManagedObjectContext MR_newMainQueueContext]: Has a concurrency type of NSMainQueueConcurrencyType. 
+ [NSManagedObjectContext MR_newPrivateQueueContext]: Has a concurrency type of NSPrivateQueueConcurrencyType. 
+ [NSManagedObjectContext MR_newContextWithParent:…]: Allows you to specify the parent context that will be set. Has a concurrency type of NSPrivateQueueConcurrencyType. 
+ [NSManagedObjectContext MR_newContextWithStoreCoordinator:…]: Allows you to specify the persistent store coordinator for the new context. Has a concurrency type of NSPrivateQueueConcurrencyType. 

어떤 상황에 맞는 시작이 좋은 하나가 있습니까?

예를 들어

JSON 응답이 기능 거래를 성공적으로 요청을 가져

+ (NSArray *)yearsDropDownValues 
{ 
    NSManagedObjectContext *moc = [NSManagedObjectContext MR_rootSavingContext]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [Stamp entityInManagedObjectContext:moc]; 
    request.entity = entity; 
    request.propertiesToFetch = @[StampAttributes.year]; 
    request.returnsDistinctResults = YES; 
    request.resultType = NSDictionaryResultType; 
    request.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:StampAttributes.year ascending:NO]]; 

    NSArray *years = [moc executeFetchRequest:request error:nil]; 

    NSMutableArray *res = [NSMutableArray array]; 
    for (NSDictionary *year in years) { 
     [res addObject:@{@"code": [NSString stringWithFormat:@"%@ Collections", year[@"year"]], @"value": year[@"year"] }]; 
    } 

    return res; 
} 

어떤 도움이 많이 감사하다를 resonse

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context]; 


     [Stamp MR_truncateAllInContext:localContext]; 

       [responseJSON[@"root"] enumerateObjectsUsingBlock:^(id attributes, NSUInteger idx, BOOL *stop) { 
        Stamp *stamp = [Stamp MR_createEntityInContext:localContext]; 
        [stamp setOrderingValue:idx]; 
       [stamp updateWithApiRepresentation:attributes]; 
     }]; 

     [localContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) { 
      if (completionBlock) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        completionBlock(!error, error); 
       }); 
      } 
     }]; 

를받을 그리고이 기능을 수행 할 때마다 데이터베이스에 기록을 저장합니다. 당신은 설정에 CoreData 스택 MagicalRecord의 기본 방법을 사용할 때 감사

나는 시작하기 전에, 당신이 알고 이해해야 두 개 더 상황이 있다고 생각
+0

첫 번째 경우에는 수행중인 것과 같은 개인 대기열 컨텍스트를 사용하는 것이 좋습니다. 두 번째 경우, MR_defaultContext를 사용하는 것이 더 낫다. 왜냐하면 내가 가져 오는 값이 UI를위한 것이라고 생각하기 때문이다. –

+0

그래서 우리는 이것을 변경해야합니다. NSManagedObjectContext * moc = [NSManagedObjectContext MR_rootSavingContext]; to NSManagedObjectContext * moc = [NSManagedObjectContext MR_defaultContext]; 거의 모든 가져 오기 요청은 MR_defaultContext를 사용해야합니까? –

+0

가져 오기가 전부는 아니지만 가져 오는 데이터가 화면에 표시되는 것이면 'MR_defaultContext'에서 수행하고이 컨텍스트에서 가져 오기 (예 : 삽입, 업데이트 또는 삭제) 이외의 작업을 수행하지 마십시오. –

답변

1

, 그들은 자동으로 생성됩니다

  1. MR_rootSavingContext를, 그것은 개인이다 큐 컨텍스트가 코디네이터에 직접 연결됩니다. 일반적으로 루트 컨텍스트가됩니다.
  2. MR_defaultContext, 그것은 메인 큐 컨텍스트인데, 보통은 부모 컨텍스트가 될 MR_rootSavingContext입니다.이 컨텍스트는 UI 컨텍스트가 될 것이며,이를 사용하여 화면에 데이터를 표시하고 표시합니다.

는 이제 하나 그 다섯 개 상황을 설명합니다 :

  1. MR_newContext, 부모 컨텍스트로 MR_defaultContext을 가진 새 개인 큐 컨텍스트를. 그것은 [NSManagedObjectContext MR_newContextWithParent:[NSManagedObjectContext ME_defaultContext]]을 호출하는 것과 같습니다. 이러한 유형의 컨텍스트는 100 개의 객체를 삽입, 업데이트, 삭제하는 등의 대량 작업에 유용합니다. 모든 작업이 백그라운드 스레드에서 실행 중이므로 UI가 차단되지 않습니다. 그러나 단점은 특히 복잡한 컨텍스트가있을 때 더욱 복잡해 지므로 이러한 컨텍스트를 저장할 때 충돌이 발생할 가능성이 높습니다.
  2. MR_newMainQueueContext, 상위 컨텍스트가없는 새 기본 대기열 컨텍스트. 동일한 NSPersistentStoreCoordinator에 연결되어 있으므로 형제는 MR_rootSavingContext입니다. 이러한 유형의 컨텍스트에서 수행하는 모든 작업은 UI를 차단하므로이 컨텍스트에서 많은 작업을 수행하지 마십시오.
  3. MR_newPrivateQueueContext, MR_newContext과 유사하지만 상위 컨텍스트가 없습니다. 형제는 MR_rootSavingContext입니다.
  4. MR_newContextWithParent은 개인 대기열 컨텍스트를 만들고 부모 컨텍스트를 지정하는 편리한 방법입니다.
  5. MR_newContextWithStoreCoordinator, 지정된 NSPersistentStoreCoordinator을 사용하는 새로운 전용 대기열 컨텍스트. 내 관점에서 보면 다른 코디네이터와 컨텍스트를 올바르게 사용하는 방법을 알고있는 경우에만 사용하십시오.

한마디로 말하면이 컨텍스트 중에는 좋거나 나쁨이 없으므로 요구 사항에 따라 올바른 것을 선택해야합니다.

+0

세부 설명에 감사드립니다. 나는 이것에 대해 자세히 살펴볼 것이다. 위의 2 가지 방법에 관해서는 어떤 문맥을 사용해야하는지 당신의 제안은 무엇입니까? 구현이 적절하다고 생각합니까? –

+0

안녕하세요. 나는 Magical record에 대해 다른 질문을 가지고 있습니다. 보세요! 많은 감사 http://stackoverflow.com/questions/38725256/ios-magical-record-import-from-array/38727206?noredirect=1#comment64830614_38727206 –