Iphone NSFetchedResultsController委托仅在谓词为nil时触发
我开发这个应用已经几个月了,我们决定在上面实现核心数据。 我正在使用魔幻唱片,但这个问题在魔幻唱片出现之前就已经存在了 当我们在后台线程中保存数据时,应用程序加载一个具有fetchedResultsController的视图 (不工作) (工作-通知谓词设置为nil) 如果您想知道我们在调用此方法的后台线程中插入数据:Iphone NSFetchedResultsController委托仅在谓词为nil时触发,iphone,ios,nsfetchedresultscontroller,Iphone,Ios,Nsfetchedresultscontroller,我开发这个应用已经几个月了,我们决定在上面实现核心数据。 我正在使用魔幻唱片,但这个问题在魔幻唱片出现之前就已经存在了 当我们在后台线程中保存数据时,应用程序加载一个具有fetchedResultsController的视图 (不工作) (工作-通知谓词设置为nil) 如果您想知道我们在调用此方法的后台线程中插入数据: -(void)callWithID:(NSDictionary*)newCall{ [MagicalRecord saveInBackgroundWithBlock:^(
-(void)callWithID:(NSDictionary*)newCall{
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){
ICCall *call = nil;
call = [ICCall MR_findFirstWithPredicate:
[NSPredicate predicateWithFormat:@"id_Chamada = %@",[newCall valueForKey:@"id_Chamada"] ]
inContext:localContext];
if(call)
{
// Call already Exists, update it?
}
else
{
call = [ICCall MR_createInContext:localContext ];
call.id_Chamada = [newCall valueForKey:@"id_Chamada"];
call.id_user = [newCall valueForKey:@"id_user"];
call.designacao = [newCall valueForKey:@"designacao"];
call.telefone = [newCall valueForKey:@"telefone"];
call.data = [newCall valueForKey:@"data"];
call.assunto = [newCall valueForKey:@"assunto"];
call.mensagem = [newCall valueForKey:@"mensagem"];
call.importancia = [newCall valueForKey:@"importancia"];
call.ligar_volta = [newCall valueForKey:@"ligar_volta"];
call.respondido = [newCall valueForKey:@"respondido"];
call.respondido_data = [newCall valueForKey:@"respondido_data"];
call.lido = [newCall valueForKey:@"lido"];
call.eliminadoFO = [newCall valueForKey:@"eliminadoFO"];
call.notas = [newCall valueForKey:@"notas"];
call.favorito = [newCall valueForKey:@"favorito"];
NSLog(@"--------------------------- CALL");
}
} completion:^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[NSManagedObjectContext MR_defaultContext] save];
}];
}];}
因此,如果在fetchedResultsController中设置谓词,则在后台插入信息时,fetchedResultsController委托不会触发,如果未设置谓词,则所有fetchedResultsController委托方法都会正确触发
这个问题一直存在,因为在MagicalRecord包装之前,我甚至尝试过其他包装,但都没有用。
从上周开始,我就一直在努力解决这个问题,没有选择了。。。
一位朋友建议我不要使用线程,但我真的不想这样做。
建议?您调试了存储对象的用户ID和prefs中的值?它们是完全匹配的吗?如果我离开主视图,或者干脆关闭应用程序并再次执行,新记录会显示。。。所以所有的值都是正确的…那么FRC上的委托设置在哪里?我在视图中设置它,并在初始化FRC的地方加载:NSError*error;如果(![[self-fetchedResultsController]performFetch:&error]){//更新以适当处理错误。NSLog(@“Unresolved error%@,%@”,error,[error userInfo]);退出(-1);//失败}fetchedResultsController.delegate=self;
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id_user = %@",[prefs valueForKey:@"userID"]];
fetchedResultsController = [ICCall MR_fetchAllGroupedBy:nil
withPredicate:nil
sortedBy:@"id_Chamada"
ascending:NO
inContext:[NSManagedObjectContext MR_defaultContext]];
return fetchedResultsController;}
-(void)callWithID:(NSDictionary*)newCall{
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){
ICCall *call = nil;
call = [ICCall MR_findFirstWithPredicate:
[NSPredicate predicateWithFormat:@"id_Chamada = %@",[newCall valueForKey:@"id_Chamada"] ]
inContext:localContext];
if(call)
{
// Call already Exists, update it?
}
else
{
call = [ICCall MR_createInContext:localContext ];
call.id_Chamada = [newCall valueForKey:@"id_Chamada"];
call.id_user = [newCall valueForKey:@"id_user"];
call.designacao = [newCall valueForKey:@"designacao"];
call.telefone = [newCall valueForKey:@"telefone"];
call.data = [newCall valueForKey:@"data"];
call.assunto = [newCall valueForKey:@"assunto"];
call.mensagem = [newCall valueForKey:@"mensagem"];
call.importancia = [newCall valueForKey:@"importancia"];
call.ligar_volta = [newCall valueForKey:@"ligar_volta"];
call.respondido = [newCall valueForKey:@"respondido"];
call.respondido_data = [newCall valueForKey:@"respondido_data"];
call.lido = [newCall valueForKey:@"lido"];
call.eliminadoFO = [newCall valueForKey:@"eliminadoFO"];
call.notas = [newCall valueForKey:@"notas"];
call.favorito = [newCall valueForKey:@"favorito"];
NSLog(@"--------------------------- CALL");
}
} completion:^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[[NSManagedObjectContext MR_defaultContext] save];
}];
}];}