【问题标题】:Multithreading behavior using a NSFetchedResultsController使用 NSFetchedResultsController 的多线程行为
【发布时间】:2014-05-11 12:11:43
【问题描述】:

如何更改我的代码,使其可以在不同的队列上运行,然后在主队列上运行:

- (NSFetchedResultsController *)fetchResultController{

    if (_fetchResultController != nil) {            
        return _fetchResultController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSManagedObjectContext *context = [self managedObjectContext];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Recipes"
    inManagedObjectContext:context];

    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"headline"
    ascending:YES];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(category = %@)",_categoryToShown];

    [fetchRequest setPredicate: predicate];

    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    _fetchResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

    _fetchResultController.delegate = self;

    return _fetchResultController;    
}

【问题讨论】:

  • 你的目标是什么?此外,不要将代码作为图像提供,而是作为纯文本和相应的格式提供。谢谢。
  • 当我在我的 UI 中单击一个按钮时,它会转到根据此获取请求填充数据的表视图。我希望​​当我单击该按钮时它会自动转到表视图,所以我需要用多线程编写这段代码。

标签: ios objective-c multithreading core-data nsfetchedresultscontroller


【解决方案1】:

NSFetchedResultsControllerUITableViews 或 UICollectionViews 一起使用。这些是 UIKit 的一部分,因此只能在主队列中使用它们。

此外,NSFetchedResultsController 已被开发用于通过延迟加载功能(数据批处理)获取数据,以减少内存占用。

那么,你的目标是什么?为什么需要更改正在运行的队列?

编辑 1

当我在我的 UI 中单击一个按钮时,它会转到填充表格视图的表格视图 根据此获取请求的数据。我希望当我单击 按钮它会自动转到表格视图,所以我需要写 这段代码多线程

如果你想实现你在评论中写的内容,你应该创建一个获取请求并在后台线程中执行它。这样,当你登陆时,segue 结果将在持久化的内部缓存中可用店铺协调员。这种技术被 Marcus Zarra (CoreData weird behavior when data are loaded on background thread) 称为“预热缓存”。通过以下方法,NSFetchedResultsController 的使用没有用。所以,在采取这种方法之前,你为什么不尝试一下

[fetchRequest setFetchBatchSize:20];

如果表格(或集合)将显示 10 个元素,批量大小为 20 就可以了。无论如何,Instruments 是你的朋友。

另外,我真的建议去Core Data performance is a balance看看。

【讨论】:

  • 当我在我的 UI 中单击一个按钮时,它会根据此获取请求填充数据的表视图。我希望​​当我单击该按钮时它会自动转到表视图而不是等到这段代码完成然后继续,所以我需要用多线程编写这段代码
猜你喜欢
  • 2012-05-31
  • 1970-01-01
  • 2015-11-05
  • 2012-02-29
  • 2023-03-12
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多