Оптимизация массива UIImages

Итак, я создаю приложение, в котором пользователь фотографирует себя, оно сохраняет их в фотопленку, и я сохраняю ссылки на URL-адреса активов, чтобы отображать их в приложении. Сначала казалось, что эта модель работает нормально, но по мере того, как я делал все больше и больше снимков, она начала получать предупреждения о памяти и, в конце концов, дала сбой. Есть ли лучший способ подойти к этому?

Вот как я загружаю сохраненные фотографии при запуске приложения (что останавливает приложение на срок до 10 секунд в зависимости от того, сколько загружается):

- (void) loadPhotosArray
{
    _photos = [[NSMutableArray alloc] init];

    NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey: @"savedImages"];
    if (data)
    {
        NSArray* storedUrls = [[NSArray alloc] initWithArray: [NSKeyedUnarchiver unarchiveObjectWithData: data]];

        // reverse array
        NSArray* urls = [[storedUrls reverseObjectEnumerator] allObjects];

        for (NSURL* assetUrl in urls)
        {
            // Block to handle image handling success
            ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
            {
                ALAssetRepresentation *rep = [myasset defaultRepresentation];
                CGImageRef iref = [rep fullResolutionImage];
                if (iref) {
                    UIImage* tempImage = [UIImage imageWithCGImage:iref];
                    UIImage* image = [[UIImage alloc] initWithCGImage: tempImage.CGImage scale: 1.0 orientation: UIImageOrientationRight];

                    // Set image in imageView
                    [_photos addObject: image];
                    [[NSNotificationCenter defaultCenter] postNotificationName: @"PhotosChanged" object: self];
                }
            };

            // Handles failure of getting image
            ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
            {
                NSLog(@"Can't get image - %@",[myerror localizedDescription]);
            };

            // Load image then call appropriate block
            ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
            [assetslibrary assetForURL: assetUrl
                           resultBlock: resultblock
                          failureBlock: failureblock];
        }
    }
    else
    {
        NSLog(@"Photo storage is empty");
    }
}

И сохранение фотографий:

- (void) addImageToPhotos: (UIImage*)image
{
    // Store image at front of array
    NSMutableArray* temp = [[NSMutableArray alloc] initWithObjects: image, nil];

    // load rest of images onto temp array
    for (UIImage* image in _photos)
    {
        [temp addObject: image];
    }

    _photos = nil;
    _photos = [[NSMutableArray alloc] initWithArray: temp];

//    [self.photos addObject: image];
    [[NSNotificationCenter defaultCenter] postNotificationName: @"PhotosChanged" object: self.photos];

    // save to cache
    ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
    [library saveImage: image toAlbum: @kAlbumeName withCompletionBlock:^(NSError *error) {
        if (error)
        {
            NSLog(@"Error saving");
        }

    }];

}

person Chris    schedule 20.08.2013    source источник
comment
включен ли ваш проект ARC? ..bcz я не вижу пула ручного/автоматического выпуска в вашем коде...   -  person Master Stroke    schedule 20.08.2013
comment
взгляните на это. «Как правильно импортировать сохраненные фотографии из альбома iphone»> stackoverflow.com/questions/9973259/   -  person Master Stroke    schedule 20.08.2013


Ответы (1)


Я думаю, есть 2 метода оптимизации этой проблемы.

  1. Вы должны просто сохранить строку имени изображения вместо сохранения объекта UIImage, а затем, когда нужно отобразить изображение, используйте разбиение на страницы для отображения изображения в соответствии с сохраненной строкой имени изображения.

  2. Вы должны использовать многопоточность для решения этой долговременной задачи, рекомендуем вам использовать gcd для загрузки строки имени изображения.

person timothy lau    schedule 20.08.2013
comment
Ну конечно! Хорошая идея, я собираюсь реализовать это решение. Спасибо :) - person Chris; 20.08.2013