【问题标题】:Displaying a lot of objects by means of Magical Record用Magical Record展示大量物品
【发布时间】:2015-02-15 17:05:26
【问题描述】:

目标是在应用程序加载时加载约 20k 实体(在后台线程中)。然后在加载后我想在UITableView 中显示它们。为此,我将使用fetchedResultController 将批处理设置为 100 等大量对象?

这是我试图实现它的方式:

UIApplication *application = [UIApplication sharedApplication];

__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
}];

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
    for(int i = 0; i <20000; i++){
        Object *object = [Object MR_createInContext:localContext];
        object.number = i;
    }
} completion:^(BOOL success, NSError *error) {
    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
    [self finishedSaving];
}];

然后在finishedSaving

- (void)finishedSaving
{
    NSManagedObjectContext *context = [NSManagedObjectContext MR_contextForCurrentThread];
    self.fetchResultController = [Object MR_fetchAllGroupedBy:nil withPredicate:nil sortedBy:@"name" ascending:YES inContext:context];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView reloadData];
    }
}

我正在冻结该方法的 UI。有什么改进或修复的想法吗?

【问题讨论】:

    标签: objective-c core-data magicalrecord


    【解决方案1】:

    默认情况下,Magical Record 的批量大小为 20(请参阅源代码中的 kMagicalRecordDefaultBatchSize)。

    因此,使用以下尺寸,即使有很多对象要抓取,UI 也不应该冻结。 NSFetchedResultsController 使用延迟加载机制为您完成了正确的工作。它抓取前 20 个。如果您滚动,它会抓取其他 20 个,依此类推。

    我的猜测(我不知道 Magical Record 做了什么)是您的保存代码(第一个 sn-p)没有在后台线程中运行,或者没有正确运行。你能提供它的完整源代码吗?

    关于第一个sn-p,当app进入前台后,是否需要在后台运行你的任务?可以肯定的是,使用begin...end... 并不意味着在后台运行任务,而只是告诉系统您正在做某事(对您很重要),并希望在其中完成如果可以的话,背景。

    更新 1

    我对 MR 源代码进行了一些调查,这里是结果。

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        // This block runs in background thread
    } completion:^(BOOL success, NSError *error) {
        // This block runs in main thread
    }];
    

    那么,您的Object 是否只包含number 属性?

    【讨论】:

    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多