【问题标题】:NSFetchedResultsControllerDelegate methods don't get calledNSFetchedResultsControllerDelegate 方法不会被调用
【发布时间】:2016-06-02 13:50:33
【问题描述】:

我的 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);
    }];
}

【问题讨论】:

  • 这里的“RPCoreData”类是什么?这是 Coredata 的任何第三方库吗?如果可以,请分享我在哪里可以获得“RPCoreData”库的链接
  • 最近我收到了一个 2012 年开发的代码,它有 RPCoreData 和 RPCoreDataHelper 类文件相关的代码,但是在 xcode 中错过了这些文件,我们试图联系开发它的人,但是找不到他...如果您分享链接或 RPCoreData 文件将非常有帮助
  • RP 是一个核心数据辅助方法,是项目名称的缩写。这对您没有用处,因为它包含项目特定的逻辑,并且不打算在项目之外重用以及包含项目的机密信息。我们将其命名为与您要查找的文件相同的名称只是一个巧合。
  • 该文件是为“Real Page” pvt ltd 开发的吗?

标签: ios objective-c core-data


【解决方案1】:

您不需要将 NSFetchedResultsController 的创建包裹在来自 MagicalRecordsaveWithBlock: 周围,因为您实际上只是获取对象,而不是更改它们。

我明白你为什么这样做(为了得到一个本地的NSManagedObjectContext

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

+ (NSFetchedResultsController *) MR_fetchAllGroupedBy:(NSString *)group withPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortTerm ascending:(BOOL)ascending;

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

这样您的方法应该能够立即返回NSFetchedResultsController,而无需使用块。

此外,您似乎设置了两次delegate,一次在块内,一次作为参数传递给MR_fetchAllGroupedBy:..

最后,确保您新创建的NSFetchedResultsController 不是nil,并在与viewWillAppear: 相同的类中实现delegate 方法之一,然后使用断点/日志记录查看它们是否被调用:

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

【讨论】:

    【解决方案2】:

    在 ViewDidLoad 中添加以下行

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多