优化UIImages数组

时间:2013-08-20 03:30:49

标签: ios objective-c data-structures uiimage alassetslibrary

所以我正在构建一个用户自己拍照的应用程序,它将它们保存到相机胶卷,我将保存对资产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");
        }

    }];

}

1 个答案:

答案 0 :(得分:2)

我认为有两种方法可以优化这个问题。

  1. U应该只保存图像名称字符串而不是保存UIImage对象,然后当需要显示图像时,使用分页根据保存的图像名称字符串显示图像。

  2. 你应该使用多线程来处理这个长时间的任务,建议你使用gcd来加载图像名称字符串。