由于“内存压力”导致iOS UIImagePNGRepresentation崩溃

时间:2014-09-04 07:49:52

标签: ios

我的视图控制器中有UIImagePicker和UICollectionView。我拍摄的照片和第四张照片(它也是收集视图中的新行)应用程序因“内存压力”而崩溃。 UIImagePicker委托:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // Do picture get here
    NSError *error;
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    NSData *imageData = UIImagePNGRepresentation(image);
    NSNumber *imageNumber = [NSNumber numberWithInteger:[databaseManagementService selectTaskPictures].count];
    NSString *imageName = [[imageNameDefault stringByAppendingString:[NSString stringWithFormat:objectFormat, imageNumber]] stringByAppendingString:extensionPNG];

    // Do picture save to documents directory here
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:imageName];
    [imageData writeToFile:savedImagePath atomically:NO];

    // Do UIImagePicker dismiss here
    [picker dismissViewControllerAnimated:YES completion:nil];

    // Do picture details save to database here
    TaskManagerTaskPicture *taskPicture = [[TaskManagerTaskPicture alloc] init];

    taskPicture.filename = imageName;
    taskPicture.id = imageNumber;
    taskPicture.title = imageName;

    taskPicture.pictureID = self.taskObject.id;
    taskPicture.taskID = self.taskObject.id;
    taskPicture.locationID = self.taskObject.location.id;

    [databaseManagementService insertTaskPictureObject:taskPicture andError:&error];

    // Do task picture update here
    // Do task object SELECT here
    self.taskObject = [databaseManagementService selectTaskWithID:self.taskObject.id];

    // Do task picture objects retreive from task object here
    self.taskPictureObjects = [self.taskObject.taskPicture allObjects];

    // Do collection data reload here
    [self.taskPicturesCollectionView reloadData];
}

到目前为止,我一直在首次亮相,并意识到麻烦正在逐行:

NSData *imageData = UIImagePNGRepresentation(image);

有没有人知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

你能更好地解释你的应用流程吗?

但是请尝试实现此代码:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // Do picture get here

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSError *error;
        UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
        NSData *imageData = UIImagePNGRepresentation(image);

        NSNumber *imageNumber = [NSNumber numberWithInteger:[databaseManagementService selectTaskPictures].count];
        NSString *imageName = [[imageNameDefault stringByAppendingString:[NSString stringWithFormat:objectFormat, imageNumber]] stringByAppendingString:extensionPNG];

        // Do picture save to documents directory here
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:imageName];
        [imageData writeToFile:savedImagePath atomically:YES];
        dispatch_async(dispatch_get_main_queue(), ^{
            // Do UIImagePicker dismiss here
            [picker dismissViewControllerAnimated:YES completion:nil];

            // Do picture details save to database here
            TaskManagerTaskPicture *taskPicture = [[TaskManagerTaskPicture alloc] init];

            taskPicture.filename = imageName;
            taskPicture.id = imageNumber;
            taskPicture.title = imageName;

            taskPicture.pictureID = self.taskObject.id;
            taskPicture.taskID = self.taskObject.id;
            taskPicture.locationID = self.taskObject.location.id;

            [databaseManagementService insertTaskPictureObject:taskPicture andError:&error];

            // Do task picture update here
            // Do task object SELECT here
            self.taskObject = [databaseManagementService selectTaskWithID:self.taskObject.id];

            // Do task picture objects retreive from task object here
            self.taskPictureObjects = [self.taskObject.taskPicture allObjects];

            // Do collection data reload here
            [self.taskPicturesCollectionView reloadData];
        });
    });

}