Почему сохранение этих изображений в основных данных занимает более 17 секунд на iPhone? - PullRequest
1 голос
/ 23 июня 2010

Я работал с образцом кода Apple CoreDateRecipes для iPhone, чтобы узнать больше о табличных представлениях и основных данных. Я создал собственное тестовое приложение на основе этого образца, и оно работает хорошо, за исключением одной вещи. Когда я выбираю фотографию для «рецепта», независимо от того, была ли она с камеры или из библиотеки, когда я нажимаю «Готово», чтобы выйти из режима редактирования, требуется около 15 секунд, прежде чем вернуть управление пользователю. Это происходит при тестировании на устройстве - в симуляторе все еще есть задержка, но она составляет всего 2-4 секунды.

Я тестировал кнопку «редактировать / готово», не выбирая фотографию и не редактируя другие данные, и она мгновенно сохраняется, поэтому я почти уверен, что виновато изображение. Ниже приведен код, где он покидает режим редактирования, и код обработки изображения - что я могу добавить / изменить / удалить, чтобы ускорить это? Я знаю, что эти примеры кода являются лишь доказательством концепции, но я не могу поверить, что они опубликовали пример с таким дурацким пользовательским опытом!

Спасибо, как всегда, за любые рекомендации ... дайте мне знать, если есть какой-либо другой код, который вам нужно увидеть, или вы можете увидеть весь пример проекта здесь

- (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];
}

Ответы [ 3 ]

3 голосов
/ 23 июня 2010

Во-первых, как указал Гилберт, пример кода не предназначен для производственного использования и будет медленным.

Во-вторых, вам не следует хранить изображения в Core Data.Пример может показать, как это сделать, но обычно это очень плохая идея .Вы должны хранить изображения на диске, а затем сохранять указатель (путь к файлу) на изображение в Core Data.Есть некоторые исключения из этого правила (очень маленькие изображения), но вы должны переосмыслить свой дизайн.

Наконец, большая часть медлительности, которую вы видите, может быть не связана с Базовыми данными.Код выбора изображений сам по себе очень медленный.Я бы порекомендовал изменить код так, чтобы он просто записывал на диск и видел, насколько это медленно по сравнению с записью в Core Data.Я был бы удивлен, если бы это было намного быстрее.

Обновление

Вы можете хранить небольшие изображения внутри Core Data, и мои советы с других постов, больше для рабочего стола, чем iOS.Причиной этого является кеш.На iOS кеш, который использует Core Data, очень маленький.Если вы храните изображения в большой базе данных, вы можете легко удалить этот кеш и заставить будущие вызовы, которые должны быть в кеше, попасть на диск.Это не жесткое и быстрое правило «не хранить двоичные данные», а скорее правило отслеживания вашей производительности, и если вы бьете по диску больше, чем должны, причиной могут быть двоичные данные.

Контакты

Что касается контактов, вы можете быть медленнее, потому что они делают вещи не так, как вы, и они могут легко использовать частные API для доступа к камере.Поскольку это Apple, они не обязательно играют по тем же правилам, что и мы.

0 голосов
/ 23 июня 2010

Я скачал проект, собрал его и запустил в симуляторе.Я не мог воспроизвести вашу проблему.Я обнаружил, что время, необходимое для сохранения изображения, было визуально мгновенным, то есть не дольше, чем переход просмотра.

Если вы видите ту же проблему в исходном неизмененном проекте, значит, у вас что-то еще происходит.Убедитесь, что у вас есть последняя версия проекта, которая должна быть по вашей ссылке.Я знаю, что есть по крайней мере один действительно старый, плавающий вокруг, потому что я ударил это недавно.

0 голосов
/ 23 июня 2010

Я не разработчик для iPhone, но, как правило, пример кода не учитывает пользовательский опыт. Пример кода показывает примеры.

Как правило, вам необходимо выполнять дорогостоящие (длительные) операции в дополнительных потоках.

Возможно, эта запись блога поможет: Уважайте основную тему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...