3

CoreData 저장소에서 데이터를 가져 오는 NSFetchedResultsController이 있습니다. frc가 초기화되면 performFetch을 호출하고 가져온 객체의 수를 frc.fetchedObjects으로 확인하면 결과는 0입니다. 코드에서 다른 장소에서 NSManagedObject의 refreshObject에 의해 트리거되는 NSFetchedResultsController. 왜?

내가 전화 :

[obj.managedObjectContext refreshObject:obj mergeChanges:NO] 

나는 어떤 처음 가져되지 않은 객체와 shouldn를 가져 오기 위해 FRC 원인의 부작용이 필요 모르겠어요하지만 어쨌든 사용 된 쿼리를 고려하여 가져올 수 없습니다. 이 객체들은 정확히 refreshObject:mergeChanges:과 동일한 객체입니다.

왜 이런 일이 발생합니까?

편집 :

그것은이 쿼리에 대해 발생하지 않습니다

: 모든

query.predicate = [NSPredicate predicateWithFormat:@"(cartEntry != NULL) AND (urlWeb = NULL)", version, dateUrlExpire]; 

frc = [[NSFetchedResultsController alloc] initWithFetchRequest:query managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 
frc.delegate = self; 
[frc performFetch:&error]; 

하지만이 버전으로 쿼리를 변경할 때 다음이 발생 (urlWebVersionurlWebDate된다 NULL 기록) :

query.predicate = [NSPredicate predicateWithFormat:@"(cartEntry != NULL) AND ((urlWeb = NULL) OR (urlWebVersion != %@) OR (urlWebDate > %@))", version, dateUrlExpire]; 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    NSError *error; 

    // Create an empty entity with the optional fields attr1 (string) and attr2 (date) 
    Entity *e = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:[self managedObjectContext]]; 

    // Save entity 
    [_managedObjectContext save:&error]; 

    // Setup fetched results controller 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(attr1 != %@) AND (attr2 != %@)", @"", [NSDate new], nil]; 

    NSFetchRequest *query = [[NSFetchRequest alloc] initWithEntityName:@"Entity"]; 
    query.predicate = pred; 
    query.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"attr1" ascending:NO]]; 

    frc = [[NSFetchedResultsController alloc] initWithFetchRequest:query managedObjectContext:_managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 

    frc.delegate = self; 

    // Load data 
    [frc performFetch:&error]; 

    // Output #1 
    NSLog(@"%ld", frc.fetchedObjects.count); 

    [_managedObjectContext refreshObject:e mergeChanges:NO];   

    return YES; 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    NSLog(@"%ld", controller.fetchedObjects.count); 
} 

출력 :

2015-01-22 22:53:44.293 CoreDataBug[10740:1445186] 0 
2015-01-22 22:53:44.317 CoreDataBug[10740:1445186] 1 
+0

수행중인 가져 오기를 포함 할 수 있습니까? NSFRC (NSFetchedResultsController)에 대의원이 설정되어 있습니까? 델리게이트가 설정되고 적어도 하나의 메소드가 구현 된 경우 NSFRC는 새 데이터를 사용할 수있게되면 자동으로 페치를 다시 수행합니다. "대리인을 지정하지 않으면 컨트롤러는 관리 대상 개체 컨텍스트와 연결된 관리 대상 개체의 변경 내용을 추적하지 않습니다." https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSFetchedResultsController_Class/ –

+1

'(urlWebVersion! = % @)'이 유력한 범죄자처럼 보입니다. 'urlWebVersion'이'NULL'이라면, 그것은 진술을 true로 만들고 따라서 엔트리를 반환하는'version1'과 확실히 같지 않을 것입니다. –

+0

아, 네 말이 맞을거야. 하지만 초기 결과 집합 크기가 0 인 이유는 무엇입니까? 'performFetch' 바로 다음에 – Xyand

답변

2

귀하의 문제가 있다는 것입니다 여기 *

* 편집 # 2는 이상한 행동 (실행 중에 에러 없음)를 보여줍니다 최소한의 코드 샘플입니다 NSPredicate는 !=을 nil 값과 일치시키는 데 어려움이 있습니다. 예를 들어, 편집 2 라인에서 알 수 있듯이 :

[NSPredicate predicateWithFormat:@"(attr1 != %@) AND (attr2 != %@)", 
@"", [NSDate new], nil]; 

아시다시피 인출 요청 후에는 0을 반환합니다. (여분의 nil이 있지만 아무 것도 영향을주지 않습니다.) 그러나이를 다음과 같이 변경하십시오. 논리적으로는 동일하더라도 엔티티를 반환하는 경우 :

이것은 직관적이지 않은 것을 따르기는 어렵지만 문서화 된 동작입니다. Predicate Programming Guide의 "Null 값 사용"하위 섹션을 참조하십시오.

왜 개체를 새로 고침하면 조건자가 갑자기 일치하는지 명확하지 않습니다. 이것은 버그 일 수 있습니다. 그러나 위의 문서에서 을 페어링하지 않고 != nil을 검사하지 않는 한 0이 될 수있는 값에는 !=을 사용하지 않아야합니다. 좀 짜증나고 카운터가 직관적 인 것 이상.