我一直在使用苹果的iPhone CoreDateRecipes示例代码,以了解有关表视图和核心数据的更多信息。我已经根据这个样本编写了我自己的测试应用程序,除了一件事之外,它工作得很好。当我为“食谱”选择一张照片时,无论它是来自相机还是库,当我点击“完成”退出编辑模式时,大约需要15秒才能将控制权返回给用户。在设备模拟器上测试时会发生这种情况,仍然会有延迟,但只有2-4秒。
我测试了“编辑/完成”按钮,没有选择照片和编辑其他数据,它会立即保存,所以我非常确定图像是罪魁祸首。下面是它离开编辑模式的代码,以及图像处理代码-我可以添加/更改/删除什么来加快速度?我知道这些示例代码片段只是概念的证明,但我不敢相信他们发布了一个用户体验如此糟糕的示例!
一如既往地感谢您,如果您有任何其他需要查看的代码,或者是you can see the whole sample project here,请随时为我提供帮助
- (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];
}发布于 2010-06-24 01:28:15
首先,正如Gilbert所指出的,示例代码不是用于生产的,并且会很慢。
其次,您不应该将图像存储在Core Data中。这个例子可能说明了如何做到这一点,但这通常是一个非常糟糕的想法。*您应该将图像存储在磁盘上,然后在核心数据中保留指向图像的指针(文件路径)。*这条规则有一些例外(非常小的图像),但你应该重新考虑你的设计。
最后,您看到的许多缓慢可能与核心数据无关。*图像拾取器代码本身就非常慢。我建议将代码更改为只写入磁盘,看看这与写入核心数据相比有多慢。如果它快得多,我会很惊讶。
更新
你可以在核心数据和我从其他帖子中得到的建议中存储小图像,比iOS更适合桌面。*原因是缓存。在iOS上,核心数据使用的缓存非常小。*如果你在数据库中存储的图像太大,你可以很容易地炸掉缓存,并导致将来应该在缓存中的调用命中磁盘。这不是“不要存储二进制数据”的硬性规则,而是更多的是观察你的性能的规则,如果你超过了你应该访问磁盘的次数,二进制数据很容易就是原因。
联系人
关于联系人,你可能会比较慢,因为他们做的事情与你不同,而且他们很容易使用私有API访问摄像头。因为它是苹果,所以他们不一定和我们遵循同样的规则。
发布于 2010-06-23 23:02:49
我不是iPhone开发人员,但通常情况下,示例代码不会考虑用户体验。示例代码显示了示例。
通常,您需要在额外的线程中执行昂贵的(长时间运行的)操作。
也许这篇博文会有所帮助:Respect the Main Thread
发布于 2010-06-24 03:17:42
我下载了这个项目,构建了它并在模拟器中运行它。我无法重现你的问题。我发现保存图像所用的时间在视觉上是瞬时的,也就是说不会比视图转换的时间长。
如果您在原始的、未修改的项目中看到相同的问题,则说明发生了其他问题。确保你有项目的最新版本,这应该是你的链接上的版本。我知道至少有一个非常老的漂浮在周围,因为我最近碰到了它。
https://stackoverflow.com/questions/3101989
复制相似问题