2017-06-02 5 views
0

Ich möchte PHImagemanager verwenden, um alle Fotos auf dem Gerät zu erhalten. Wenn ich die Zielgröße zu hoch setze, stürzt die App aufgrund von Speicherwarnungen ab. Also habe ich die Anfrage ohne Verwendung der zurückgegebenen Bilder getestet und jedes Bild auf null gesetzt, aber immer noch stürzt die App ab. Ich weiß nicht, was ich falsch mache. Kann mir bitte jemand helfen?PHImagemanager requestImageForAsset Speicherproblem

Einstellung der Größe auf 640x480 Absturz nach etwa 200 Bildern, 320x240 nach etwa 800 Bildern. Da ein 640x480-Bild viermal so viel Speicherplatz benötigt wie ein 320x240-Bild, scheint die App nach der gleichen Menge an Speicher abgestürzt zu sein, die zugewiesen wurde. Also für mich bedeutet das, dass ich auf dem Testgerät nicht mehr Bilder als 200 imags mit 640x480 anzeigen kann, da ich den zugewiesenen Speicher nicht freigeben kann.

Antwort

-1

Verwenden Sie bitte @autoreleasepool innerhalb der for-Schleife.

for (int i = 0; i <= totalImages - 1; i++) { 
    @autoreleasepool { 

     //Your code 

    } 
} 
0

Um Ihre @autoreleasepool Arbeit, die Sie requestOptions.synchronous-YES, und verwenden Sie Ihre eigenen Asynchron-Warteschlange einstellen müssen, wenn Sie asynchron die Anforderungsoperation machen wollen.

0

Wenn Sie alle Fotos laden möchten, die Sie in Photos.app haben und Sie wollten nicht iCloud. Sie können Folgendes tun:

Dieses Beispiel funktioniert mit einer Sammlungsansicht.

@interface GalleryViewModel() 

@property (strong, nonatomic) NSMutableArray<PHAsset *> *assets; 
@property (strong, nonatomic) PHImageManager *imageManager; 
@property (strong, nonatomic) PHImageRequestOptions *requestOptions; 

@property (strong, nonatomic) NSMutableArray<UIImage *> *imagesList; 

@end 

@implementation GalleryViewModel 

- (instancetype) initWithContext:(ITXAppContext *)context { 
    self = [super initWithContext:context]; 
    if (self) { 
     _assets = [[NSMutableArray alloc] init]; 
     _imageManager = [PHImageManager defaultManager]; 
     _requestOptions = [[PHImageRequestOptions alloc] init]; 
     _imagesList = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

#pragma mark - Public methods 

// ================================================================================== 
// Public methods 

- (void) viewModelDidLoad { 
    [self obtainAllPhotos]; 
} 

#pragma mark - Private methods 

// ================================================================================== 
// Private methods 

- (void) obtainAllPhotos { 

    self.requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact; 
    self.requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; 
    self.requestOptions.synchronous = YES; 
    self.requestOptions.networkAccessAllowed = NO; 

    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; 
    fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; 
    PHFetchResult<PHAsset *> *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions]; 

    __weak GalleryViewModel *weakSelf = self; 
    [result enumerateObjectsUsingBlock:^(PHAsset * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
     [weakSelf.assets addObject:obj]; 
     if (idx >= ([result count] - 1)) { 
      [weakSelf.viewDelegate setupView]; 
     } 
    }]; 
} 

#pragma mark - Get data from object 

// ================================================================================== 
// Get data from object 

- (NSInteger) sizeGallery { 

    if (self.assets) { 
     return [self.assets count]; 
    } 
    return 0; 
} 

- (UIImage *) imagesFromList:(NSInteger) index { 

    __block UIImage *imageBlock; 

    [self.imageManager requestImageForAsset:[self.assets objectAtIndex:index] targetSize:CGSizeMake(200, 200) contentMode:PHImageContentModeAspectFit options:self.requestOptions resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { 
     if (result) { 
      imageBlock = result; 
     } 
    }]; 

    return imageBlock; 
} 

@end