ios - Core Data 在 iPhone4 等旧设备上速度很慢

标签 ios objective-c iphone core-data

在我的应用中,我使用了简单的核心数据结构。 我调用我的服务器 api,然后将每个请求的 30 个对象存储到 NSManagedObject 中。这样每个周期有 30 个托管对象,然后我的 tableView 重新加载。

我的代码是这样的

//we have 30 entities here in "post_items"
for(NSDictionary *post in [d objectForKeyNotNull:@"post_items"])
    {
        NSNumber *itemId= [post objectForKeyNotNull:@"id"];
    if(itemId){


        Item *i = [[ChannelStore sharedStore] fetchItem:itemId];

        if(!i) i = [[ChannelStore sharedStore] createItem];

        [i readFromJSONDictionary:post];

        [_items addObject:i];


    }


}

-(Item*)createItem
{
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];

Item *item = [[Item alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];

return item;

}


   -(Item*)fetchItem:(NSNumber *)itemId;
{



NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Item"];

// Create Predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"itemID", itemId];
[fetchRequest setPredicate:predicate];

[fetchRequest setFetchBatchSize:1];

// Execute Fetch Request
NSError *fetchError = nil;


NSArray *result = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
Item* item = nil;

if (!fetchError) {
    item = [result firstObject];

} else {
    NSLog(@"Error fetching data.");
    NSLog(@"%@, %@", fetchError, fetchError.localizedDescription);
}


return item;
}

进程变慢的原因是我必须获取,因此首先检查现有项目,如果没有则创建新项目。 我知道我在这里只使用一个 MOC。这会导致 UI 阻塞。但是如果我们在这里关注速度。我怀疑实现亲子 MOC 是否有帮助。因为在亲子中。我只会让另一个 MOC 在后台运行,但它是一个用于 30 个对象的 MOC,它或多或少应该花费相同的时间。

如有任何帮助,我们将不胜感激。我试着到处搜索,但找不到合适的解决方案。或者,我根本不应该将 Core Data 用于“Items”对象?

附言。我在较新的设备上没有性能问题,但只有旧设备使我的应用程序看起来非常滞后和缓慢

最佳答案

这里速度慢的主要原因是您正在执行的提取次数。每个提取请求都会强制核心数据堆栈往返磁盘,因为您是为要导入的每个 项目执行此操作,这会导致导入实现出现瓶颈。这个瓶颈会导致 UI 变慢,因为它发生在主队列上下文中。

解决方案是执行一次提取,以查看您在本地已有哪些传入对象以及哪些是新对象。

一旦您在内存中有了本地对象,检查该数组比每次都使用 NSFetchRequest 要快得多。

这是解决您确切问题的 WWDC 视频:https://developer.apple.com/videos/play/wwdc2013-211/

具体来说,他们谈到在视频中大约 14m 处实现“更新或插入”。

关于ios - Core Data 在 iPhone4 等旧设备上速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35086858/

相关文章:

ios - 将 View Controller 添加到选项卡栏 Controller 后发送到实例的无法识别的选择器

iphone - 通用应用程序与单独目标的最佳实践是什么?

iphone - 从 Controller 调用 Controller

html - 在 iOS 中输入日期占位符值

ios - 解释特征属性(iOS 和 BLE)

ios - UISearchController - Objective C 到 Swift 问题

iPhone : Unable to copy from MainBundle to NSDocumentDirectory

ios - 如何在 ios 中的 settings.bundle 中添加按钮

ios - 在文件系统中创建一个随机文件夹并保存下载的文件iOS

ios - 当我滚动 tableview 时,UITableViewCell 会更改数据和设计