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];
하지만이 버전으로 쿼리를 변경할 때 다음이 발생 (urlWebVersion
및 urlWebDate
된다 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
수행중인 가져 오기를 포함 할 수 있습니까? NSFRC (NSFetchedResultsController)에 대의원이 설정되어 있습니까? 델리게이트가 설정되고 적어도 하나의 메소드가 구현 된 경우 NSFRC는 새 데이터를 사용할 수있게되면 자동으로 페치를 다시 수행합니다. "대리인을 지정하지 않으면 컨트롤러는 관리 대상 개체 컨텍스트와 연결된 관리 대상 개체의 변경 내용을 추적하지 않습니다." https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSFetchedResultsController_Class/ –
'(urlWebVersion! = % @)'이 유력한 범죄자처럼 보입니다. 'urlWebVersion'이'NULL'이라면, 그것은 진술을 true로 만들고 따라서 엔트리를 반환하는'version1'과 확실히 같지 않을 것입니다. –
아, 네 말이 맞을거야. 하지만 초기 결과 집합 크기가 0 인 이유는 무엇입니까? 'performFetch' 바로 다음에 – Xyand