2015-05-07 16 views
9

Ich benutze PHImageManagers requestImageDataForAsset, um die Speichergröße bestimmter Fotos in der Kamera zu berechnen. Es funktioniert gut in meinem Gerät, aber einige Benutzer stürzen ab, nachdem die Speichergröße berechnet wurde (gefunden durch Analyse und Absturzbericht).PHImageManager Methode "requestImageDataForAsset" gibt Absturz in Swift

code and crash report

Bitte helfen.

+0

@Vizllx danke für die Antwort eine Idee über Absturzbericht ?. Es sind alle iOS-Versionen passiert. – Madhubalan

Antwort

2

auf dem iOS-Version es abstürzt, scheint in Ordnung für mich arbeiten in iOS 8.3, wenn Sie genau sind den gleichen Prozess unter Verwendung von Bild Metadaten oder Speichergröße zu holen: -

-------------------------------------------------------------- 
-- get the UIImage instance from a PHAsset 
-------------------------------------------------------------- 

- (UIImage*)grabImageFromAsset:(PHAsset *)asset 
{ 
    __block UIImage *returnImage; 
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; 
    options.synchronous = YES; 
    [[PHImageManager defaultManager] requestImageForAsset:asset 
               targetSize:CGSizeMake(200, 200) 
               contentMode:PHImageContentModeAspectFill 
                options:options 
              resultHandler: 
    ^(UIImage *result, NSDictionary *info) { 
     returnImage = result; 
    }]; 
    return returnImage; 
} 

-------------------------------------------------------------- 
-- get the metadata of the image from a PHAsset 
-------------------------------------------------------------- 

- (NSDictionary *)grabImageDataFromAsset:(PHAsset *)asset 
{ 
    __block NSMutableDictionary *imageAssetInfo = [NSMutableDictionary new]; 
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; 
    options.synchronous = YES; 
    [[PHImageManager defaultManager] requestImageDataForAsset:asset 
                 options:options 
               resultHandler: 
    ^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
     if ([info[@"PHImageResultIsInCloudKey"] isEqual:@YES]) { 
      // in the cloud 
      NSLog(@"in the cloud (sync grabImageDataFromAsset)"); 
     } 
     imageAssetInfo = [info mutableCopy]; 
     if (imageData) { 
      imageAssetInfo[@"IMAGE_NSDATA"] = imageData; 
     } 
    }]; 
    return imageAssetInfo; 
} 

Ich verfolge diese Links für meinen Foto-Kit-Betrieb: - phimagemanager und ios-8-photokit

+0

OP verwendet Swift; Das könnte hier einen Unterschied machen. – DarkDust

+0

Ich kenne es in swift, aber in diesem Link 'https://github.com/vandadnp/iOS-8-Swift-Programming-Cookbook/blob/master/chapter-camera/Searching%20for%20and%20Retrieving%20Images% 20und% 20Videos/Suche% 20für% 20und% 20Retrieve% 20Images% 20and% 20Videos/ViewController.swift ', sie verwenden dasselbe Skript, und es funktioniert. – Vizllx

+0

Link ist tot ... – DarkDust

1

Ich hatte ein ähnliches Problem, wenn Benutzer ihre Fotos in iCloud mit iCloud Foto-Bibliothek gespeichert hatten. Ich konnte das Problem beheben, indem ich den Anruf asynchron ausführte. Es sieht so aus

let options = PHImageRequestOptions() 
options.synchronous = false 
options.networkAccessAllowed = true 

Hier ist die ganze Funktion.

func getImageDataFromAsset(asset: PHAsset, completion: (data: NSData?) -> Void) { 
    let manager = PHImageManager.defaultManager() 
    let options = PHImageRequestOptions() 
    options.networkAccessAllowed = true 
    options.synchronous = false 
    manager.requestImageDataForAsset(asset, options: options) { (result, string, orientation, info) -> Void in 
     if let imageData = result { 
      completion(data: imageData) 
     } else { 
      completion(data: nil) 
     } 
    } 
} 
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