2014-09-04 72 views
1

我在我的视图控制器中有UIImagePicker和UICollectionView。由于“内存压力”,我正在拍照并在第4张照片(这也是收集视图中的新行)应用程序崩溃。 UIImagePicker代表:由于“内存压力”导致的iOS UIImagePNGRepresentation崩溃

- (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

检查你的形象,你是选择大小.. – Leena 2014-09-04 07:54:44

+1

3264×2448大小重要吗? – 2014-09-04 08:03:27

+3

显然大小很重要,这就是你的崩溃的原因。调整图像大小或将拾取器质量设置为低质量以避免崩溃。 – Leena 2014-09-04 08:04:55

回答

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

} 
+0

嗨!对不起,您的解决方案不起作用。这个应用程序只捕获图片并将其保存到文档目录中,并将图片类型的元数据保存到数据库。 – 2014-09-04 20:04:54