首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在iPhone上将这些图像保存到核心数据需要17秒以上?

为什么在iPhone上将这些图像保存到核心数据需要17秒以上?
EN

Stack Overflow用户
提问于 2010-06-23 21:23:47
回答 3查看 1.1K关注 0票数 1

我一直在使用苹果的iPhone CoreDateRecipes示例代码,以了解有关表视图和核心数据的更多信息。我已经根据这个样本编写了我自己的测试应用程序,除了一件事之外,它工作得很好。当我为“食谱”选择一张照片时,无论它是来自相机还是库,当我点击“完成”退出编辑模式时,大约需要15秒才能将控制权返回给用户。在设备模拟器上测试时会发生这种情况,仍然会有延迟,但只有2-4秒。

我测试了“编辑/完成”按钮,没有选择照片和编辑其他数据,它会立即保存,所以我非常确定图像是罪魁祸首。下面是它离开编辑模式的代码,以及图像处理代码-我可以添加/更改/删除什么来加快速度?我知道这些示例代码片段只是概念的证明,但我不敢相信他们发布了一个用户体验如此糟糕的示例!

一如既往地感谢您,如果您有任何其他需要查看的代码,或者是you can see the whole sample project here,请随时为我提供帮助

代码语言:javascript
复制
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [self updatePhotoButton];

    nameTextField.enabled = editing;
    overviewTextField.enabled = editing;

    [self.navigationItem setHidesBackButton:editing animated:YES];


    if (!editing) {
        NSManagedObjectContext *context = recipe.managedObjectContext;
        NSError *error = nil;
        if (![context save:&error]) {
            NSLog(@"Error in RecipeDetailViewController:setEditing -- %@, %@",error, [error userInfo]);
            abort();
        }
    }
}


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)selectedImage editingInfo:(NSDictionary *)editingInfo {

    NSManagedObject *oldImage = recipe.image;
    if (oldImage != nil) {
        [recipe.managedObjectContext deleteObject:oldImage];
    }

    NSManagedObject *image = [NSEntityDescription insertNewObjectForEntityForName:@"Image" inManagedObjectContext:recipe.managedObjectContext];
    recipe.image = image;

    [image setValue:selectedImage forKey:@"image"];
    CGSize size = selectedImage.size;
    CGFloat ratio = 0;
    if (size.width > size.height) {
        ratio = 70.0 / size.width;
    } else {
        ratio = 70.0 / size.height;
    }

    CGRect rect = CGRectMake(0.0, 0.0, ratio * size.width, ratio * size.height);

    UIGraphicsBeginImageContext(rect.size);
    [selectedImage drawInRect:rect];
    recipe.thumbnailImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self dismissModalViewControllerAnimated:YES];
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-24 01:28:15

首先,正如Gilbert所指出的,示例代码不是用于生产的,并且会很慢。

其次,您不应该将图像存储在Core Data中。这个例子可能说明了如何做到这一点,但这通常是一个非常糟糕的想法。*您应该将图像存储在磁盘上,然后在核心数据中保留指向图像的指针(文件路径)。*这条规则有一些例外(非常小的图像),但你应该重新考虑你的设计。

最后,您看到的许多缓慢可能与核心数据无关。*图像拾取器代码本身就非常慢。我建议将代码更改为只写入磁盘,看看这与写入核心数据相比有多慢。如果它快得多,我会很惊讶。

更新

你可以在核心数据和我从其他帖子中得到的建议中存储小图像,比iOS更适合桌面。*原因是缓存。在iOS上,核心数据使用的缓存非常小。*如果你在数据库中存储的图像太大,你可以很容易地炸掉缓存,并导致将来应该在缓存中的调用命中磁盘。这不是“不要存储二进制数据”的硬性规则,而是更多的是观察你的性能的规则,如果你超过了你应该访问磁盘的次数,二进制数据很容易就是原因。

联系人

关于联系人,你可能会比较慢,因为他们做的事情与你不同,而且他们很容易使用私有API访问摄像头。因为它是苹果,所以他们不一定和我们遵循同样的规则。

票数 3
EN

Stack Overflow用户

发布于 2010-06-23 23:02:49

我不是iPhone开发人员,但通常情况下,示例代码不会考虑用户体验。示例代码显示了示例。

通常,您需要在额外的线程中执行昂贵的(长时间运行的)操作。

也许这篇博文会有所帮助:Respect the Main Thread

票数 0
EN

Stack Overflow用户

发布于 2010-06-24 03:17:42

我下载了这个项目,构建了它并在模拟器中运行它。我无法重现你的问题。我发现保存图像所用的时间在视觉上是瞬时的,也就是说不会比视图转换的时间长。

如果您在原始的、未修改的项目中看到相同的问题,则说明发生了其他问题。确保你有项目的最新版本,这应该是你的链接上的版本。我知道至少有一个非常老的漂浮在周围,因为我最近碰到了它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3101989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档