Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么将这些图像保存到核心数据需要17秒;在iPhone上?_Iphone_Core Data_Uiimage - Fatal编程技术网

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

为什么将这些图像保存到核心数据需要17秒;在iPhone上?,iphone,core-data,uiimage,Iphone,Core Data,Uiimage,我一直在使用苹果的iPhone CoreDateRecipes示例代码来了解更多关于表视图和核心数据的信息。我已经根据这个示例编写了自己的测试应用程序,除了一件事之外,它运行良好。当我为“菜谱”选择一张照片时,无论它是来自相机还是图书馆,当我点击“完成”以离开编辑模式时,大约需要15秒才能将控制权返回给用户。在设备上进行测试时会发生这种情况-在模拟器中,仍然有延迟,但仅为2-4秒 我在没有选择照片和编辑其他数据的情况下测试了“edit/done”(编辑/完成)按钮,它会立即保存,所以我很确定这是

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

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

一如既往地感谢您的指导…如果您需要查看其他代码,请告诉我,或者


我不是iPhone开发人员,但一般来说,示例代码不考虑用户体验。示例代码显示了示例

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


也许这篇博文会有所帮助:

首先,正如吉尔伯特指出的,示例代码不适合生产使用,而且速度会很慢

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

最后,您所看到的许多缓慢可能和核心数据无关。图像选择器代码本身非常慢。我建议将代码更改为只写入磁盘,并查看与写入核心数据相比有多慢。如果速度快得多,我会感到惊讶

更新 你可以在核心数据和我的建议中存储一些小图片,这些图片来自于其他的博文站,更多的是用于桌面,而不是iOS。原因是缓存。在iOS上,核心数据使用的缓存非常小。如果在数据库中存储较大的映像,则很容易破坏该缓存,并导致将来应该在缓存中的调用命中磁盘。这不是一条“不存储二进制数据”的硬性规则,而是一条观察性能的规则。如果您对磁盘的访问量超过了应该的范围,二进制数据很容易成为原因

联络
关于联系人,你可以慢一些,因为他们做的事情与你不同,他们可以很容易地使用私有API访问相机。因为是苹果公司,他们不一定按照我们的规则行事。

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


如果您在原始的、未修改的项目上看到相同的问题,那么您还有其他事情要做。确保您拥有项目的最新版本,该版本应位于链接处。我知道至少有一个非常旧的漂浮在周围,因为我最近撞到了它

原来的代码有那么慢,还是只是经过一些修改?你能给这个示例项目添加一个链接吗?Eiko-原来的代码太慢了-我没有修改就创建了这个示例项目,并且能够复制。抱歉,我以为我添加了一个链接-现在添加到上面是为了复制这个问题-在设备上构建CoreDataRecipes应用程序,然后启动它并进入其中一个配方。单击右上角的编辑按钮,然后单击顶部的配方图片。这允许您从库中选择新照片。一旦选择了新的pic(速度也不是那么快!),单击“完成”保存它-等等,等等,等等…在3G和3GS设备上都尝试过。第二,慢度注释。在iphone3g上拍照非常慢,开发者对此无能为力@马库斯,我觉得我以前问过你这个问题,但是你能让我回忆一下,为什么你不应该把图像存储在核心数据中呢?马库斯-谢谢你提供的信息。我将尝试保存到磁盘,看看速度是否加快。关于整体速度慢-联系人应用程序如何?它允许用户选择或拍摄与联系人相关的照片-我至少应该能够获得类似的速度吗?Marcus,“您不应该在核心数据中存储图像”是您在此处回复的更新:,还是您在该回复中的规则仍然适用?感谢您的更新和澄清。它直接影响到我正在做的事情。好吧,我可以说,将主映像保存到磁盘上是日日夜夜的事——我想知道苹果的代码是否还有其他问题导致它如此缓慢,因为现在(到磁盘)它是即时的。我仍在保存核心数据的缩略图,这很好,一点也不耽搁。谢谢你,马库斯!!谢谢你的链接,我并不真的需要在这个应用程序中线程(还),但很高兴知道我的选择是什么。技术-如前所述,延迟在模拟器上是不明显的。请在设备上试用并报告您的发现。谢谢你说你的模拟器有2-4秒的延迟。我经历了零延迟。这些观点转变得非常顺利。我会看看是否可以在设备上进行测试,但我不希望看到任何东西。您使用的SDK版本是什么?它是在3.1.3下构建的,这是它的设置目的。
- (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];
}