Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios PHImageManager';“s方法”;requestImageDataForAsset“;以迅捷的速度撞车_Ios_Swift_Xcode6_Phasset - Fatal编程技术网

Ios PHImageManager';“s方法”;requestImageDataForAsset“;以迅捷的速度撞车

Ios PHImageManager';“s方法”;requestImageDataForAsset“;以迅捷的速度撞车,ios,swift,xcode6,phasset,Ios,Swift,Xcode6,Phasset,我正在使用PhimageManager的requestImageDataForAsset来计算相机卷中特定照片的内存大小。它在我的设备上运行良好,但一些用户在计算内存大小后(通过分析和崩溃报告发现)出现连续崩溃 请提供帮助。它正在哪个iOS版本上崩溃,在iOS 8.3中对我来说似乎运行良好,如果您使用相同的过程获取图像元数据或内存大小:- -------------------------------------------------------------- -- get the UIIm

我正在使用PhimageManager的requestImageDataForAsset来计算相机卷中特定照片的内存大小。它在我的设备上运行良好,但一些用户在计算内存大小后(通过分析和崩溃报告发现)出现连续崩溃


请提供帮助。

它正在哪个iOS版本上崩溃,在iOS 8.3中对我来说似乎运行良好,如果您使用相同的过程获取图像元数据或内存大小:-

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

我的照片套件操作如下链接:-和

当用户使用iCloud照片库将其照片存储在iCloud中时,我遇到了类似的问题。我可以通过使调用异步来解决这个问题。看起来像这样

let options = PHImageRequestOptions()
options.synchronous = false
options.networkAccessAllowed = true
下面是整个函数

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

如果您想加载photos.app中的所有照片,但不想使用iCloud。你可以做:

该示例适用于集合视图

@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
@interface GalleryViewModel()
@属性(强、非原子)NSMutableArray*资产;
@属性(强,非原子)PHImageManager*imageManager;
@属性(强,非原子)PHImageRequestOptions*requestOptions;
@属性(强,非原子)NSMutableArray*imagesList;
@结束
@GalleryViewModel的实现
-(instancetype)initWithContext:(ITXAppContext*)上下文{
self=[super initWithContext:context];
如果(自我){
_assets=[[NSMutableArray alloc]init];
_imageManager=[PHImageManager defaultManager];
_requestOptions=[[PHImageRequestOptions alloc]init];
_imagesList=[[NSMutableArray alloc]init];
}
回归自我;
}
#pragma标记-公共方法
// ==================================================================================
//公共方法
-(无效)viewModelDidLoad{
[自备照片];
}
#pragma标记-私有方法
// ==================================================================================
//私有方法
-(无效)获取所有照片{
self.requestOptions.resizeMode=phimagerequestoptions resizemodeexact;
self.requestOptions.deliveryMode=PhimageRequestOptions DeliveryModeHighQualityFormat;
self.requestOptions.synchronous=是;
self.requestOptions.networkAccessAllowed=否;
PHFetchOptions*fetchOptions=[[PHFetchOptions alloc]init];
fetchOptions.sortDescriptors=@[[NSSortDescriptor SortDescriptor WithKey:@“creationDate”升序:否]];
PHFetchResult*result=[PHAsset FETCHASSETSWITMEDIATYPE:PHASSETMEDIATYPE图像选项:FETCHTOPTIONS];
__弱GalleryViewModel*weakSelf=self;
[结果enumerateObjectsUsingBlock:^(相集*\u非空对象,整数idx,布尔*\u非空停止){
[weakSelf.assets addObject:obj];
如果(idx>=([结果计数]-1)){
[weakSelf.viewDelegate setupView];
}
}];
}
#pragma标记-从对象获取数据
// ==================================================================================
//从对象获取数据
-(NSInteger)sizeGallery{
if(自我资产){
返回[自我资产盘点];
}
返回0;
}
-(UIImage*)图像列表:(NSInteger)索引{
__块UIImage*图像块;
[self.imageManager requestImageForAsset:[self.assets objectAtIndex:index]targetSize:CGSizeMake(200200)contentMode:PHImageContentModeAspectFit选项:self.requestOptions结果文件夹:^(UIImage*\u可为空的结果,NSDictionary*\u可为空的信息){
如果(结果){
imageBlock=结果;
}
}];
返回图像块;
}
@结束

OP正在使用Swift;这在这里可能会有所不同。我知道它在swift中,但在这个链接“”中,它们使用相同的脚本,并且它可以工作。@Vizllx该链接不存在Fixed link:(上一个链接不起作用,只是因为'symbol at end')@Vizllx感谢您的回复,对崩溃报告有什么想法吗?。所有iOS版本都是这样。