NSFetchedResultsControllerDelegate方法不会被调用

时间:2016-06-02 13:50:33

标签: ios objective-c core-data

我在viewWillAppear方法中有这个

[RPCoreData
 getFetchedControllerForCategoryDiscoverDelegate:self completion:^(NSFetchedResultsController *controller) {
     self.fetchedResultController = controller;
     self.fetchedResultController.delegate = self;
 }];

这在我的CoreData.m

+ (void)
getFetchedControllerForCategoryDiscoverDelegate:(id<NSFetchedResultsControllerDelegate>)delegate
                                     completion:(void (^)(NSFetchedResultsController *controller))
                                                    completion {
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
      NSFetchedResultsController *controller = [ItemData MR_fetchAllGroupedBy:@"category.id"
                                                                withPredicate:nil
                                                                     sortedBy:@"category.id"
                                                                    ascending:NO
                                                                     delegate:delegate
                                                                    inContext:localContext];
      completion(controller);
    }];
}

2 个答案:

答案 0 :(得分:2)

您不需要在NSFetchedResultsController的{​​{1}}周围创建saveWithBlock:,因为您实际上只是抓取对象而不是更改它们。

我明白为什么你这样做(为了获得本地MagicalRecord

NSManagedObjectContext有一种方便的方法,不需要你传递MagicalRecord

NSManagedObjectContext

这将使用您在执行期间所处当前线程的上下文,因此如果您没有做任何过于复杂的事情,例如在线程之间切换和管理不同的上下文,那么您应该没问题。

这样,您的方法应该能够立即返回+ (NSFetchedResultsController *) MR_fetchAllGroupedBy:(NSString *)group withPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortTerm ascending:(BOOL)ascending; ,而不使用块。

此外,您似乎要设置NSFetchedResultsController两次,一次在块内,一次作为参数传递给delegate

最后,确保新创建的MR_fetchAllGroupedBy:..不是NSFetchedResultsController,并在与nil相同的类中实施delegate个方法之一,然后使用断点/日志记录看看他们是否被召唤:

viewWillAppear:

答案 1 :(得分:0)

在ViewDidLoad中添加以下行

id delegate = [[UIApplication sharedApplication] delegate];
    self.managedObjectContext = [delegate managedObjectContext];