2016-06-07 5 views
0

Ich benutze diesen Code, um Fotos aus dem Album mit Fotorahmen, abrufen Ich habe erfolgreich die PHAssets abgerufen und in Array, aber ich bin nicht in der Lage, es in Bilder zu konvertieren, Es stürzt während des Prozesses ab. Anfordern von Bild von PHAssets Array Ursachen in Speicher Ausnahme

Hier ist mein Code,

-(void)retrieveAllPhotoSetWithCompletionCallback:(void(^ __nonnull)(NSMutableArray * __nullable asset ,NSMutableArray * __nullable imageArray , BOOL complete))completionCallback{ 

    self.requestOptions = [[PHImageRequestOptions alloc] init]; 
    self.requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact; 
    self.requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; 
    self.requestOptions.synchronous = YES; 

    NSMutableArray *assetsArray = [NSMutableArray new]; 
    PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil]; 
    [fetchResult enumerateObjectsUsingBlock:^(PHAsset *_Nonnull asset, NSUInteger idx, BOOL * _Nonnull stop) { 

     [assetsArray addObject:asset]; 
    }]; 

    PHImageManager *manager = [PHImageManager defaultManager]; 
    NSMutableArray *images = [NSMutableArray arrayWithCapacity:[assetsArray count]]; 

    // assets contains PHAsset objects. 
// __block UIImage *ima; 
    int i = 0; 

    for(PHAsset *asset in assetsArray) { 
     // This autorelease pool seems good (a1) 
     @autoreleasepool { 

      [manager requestImageForAsset:asset 
           targetSize:PHImageManagerMaximumSize 
           contentMode:PHImageContentModeDefault 
            options:self.requestOptions 
          resultHandler:^(UIImage *image, NSDictionary *info) { 

           dispatch_async(dispatch_get_main_queue(), ^{ 

         //you can add autorelease pool here as well (a2) 
        @autoreleasepool { 

         //assetCount++; 
         NSLog(@"started requesting image %i", i); 

         NSError *error = [info objectForKey:PHImageErrorKey]; 

         if (error) 
          NSLog(@"Image request error: %@",error); 
         else { 
          NSString *imagePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%i.png",i]]; 
          NSData *imageData = UIImagePNGRepresentation(image); 
          if(imageData) { 
           [imageData writeToFile:imagePath atomically:YES]; 
           [images addObject:imagePath]; 
          } 
          else { 
           NSLog(@"Couldn't write image data to file."); 
          } 
          NSLog(@"finished requesting image %i", i); 
         } 
        } //a2 ends here 
       }); 
      }]; 
      i++; 
     } // a1 ends here 
    } 
    completionCallback(assetsArray,images,YES); 
} 

Antwort

0

Ich denke Problem mit den requestImageForAsset:asset targetSize:PHImageManagerMaximumSize ist hier die maximale Größe nimmt mit dem im Programm zur Verfügung steht. Dies führt dazu, dass das Bild mit maximaler Größe im RAM gespeichert wird. Durch das Speichern von mehreren wird es mehr Speicher im RAM auffressen und es wird abstürzen. Ich änderte die targetSize und die Speicherauslastung war weniger als zuvor.

Verwandte Themen