2015-05-07 12 views
9

Tôi đang sử dụng requestImageDataForAsset của PHImageManager để tính kích thước bộ nhớ của các ảnh cụ thể trong cuộn camera. Nó hoạt động tốt trong thiết bị của tôi nhưng một số người dùng nhận được sự cố đáng kể sau khi tính toán kích thước bộ nhớ (được tìm thấy bởi phân tích và báo cáo sự cố).Phương thức của PHImageManager "requestImageDataForAsset" đưa ra sự cố trong Swift

code and crash report

Xin vui lòng trợ giúp.

+0

@Vizllx cảm ơn bạn đã trả lời bất kỳ ý tưởng nào về báo cáo sự cố ?. Nó đã xảy ra tất cả các phiên bản iOS. – Madhubalan

Trả lời

2

On mà iOS phiên bản nó được đâm, có vẻ tốt đẹp cho tôi làm việc trong iOS 8.3, nếu bạn đang chính xác bằng cách sử dụng quá trình tương tự để lấy hình ảnh dữ liệu meta hoặc kích thước bộ nhớ: -

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

tôi sau này liên kết cho hoạt động bộ ảnh của tôi: - phimagemanagerios-8-photokit

+0

OP đang sử dụng Swift; có thể tạo nên sự khác biệt ở đây. – DarkDust

+0

Tôi biết nó nhanh chóng, nhưng trong liên kết này 'https://github.com/vandadnp/iOS-8-Swift-Programming-Cookbook/blob/master/chapter-camera/Searching%20for%20and%20Retrieving%20Images% 20% 20Video/Tìm kiếm% 20 cho% 20 và% 20Retrieving% 20Images% 20and% 20Videos/ViewController.swift ', họ đang sử dụng cùng một tập lệnh và nó hoạt động. – Vizllx

+0

Liên kết đã chết ... – DarkDust

1

Tôi gặp sự cố tương tự khi người dùng lưu ảnh của họ vào iCloud bằng thư viện ảnh iCloud. Tôi đã có thể khắc phục sự cố bằng cách thực hiện cuộc gọi không đồng bộ. Có vẻ như đây là

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

Đây là toàn bộ chức năng.

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

Nếu bạn muốn tải tất cả ảnh bạn có trong Photos.app và bạn không muốn iCloud. Bạn có thể làm:

Ví dụ đó hoạt động với chế độ xem bộ sưu tập.

@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 
Các vấn đề liên quan