首页 \ 问答 \ FetchAssetsWithLocalIdentifiers返回空数组(FetchAssetsWithLocalIdentifiers returns empty array)

FetchAssetsWithLocalIdentifiers返回空数组(FetchAssetsWithLocalIdentifiers returns empty array)

我正在使用Photos.Framework将从相机拍摄的照片保存到我的图库中并检索它们。

这是我用来存储照片的代码:

    __block PHAssetCollection *album = [self getMyAlbumWithName:@"MyAlbumName"];
    if(album == nil)
    {
        [self makeAlbumWithTitle:@"MyAlbumName" onSuccess:^(NSString *AlbumId) {

             album = [self getMyAlbumWithName:@"MyAlbumName"];
            [self addNewAssetWithImage:_imageToStore toAlbum:album onSuccess:^(NSString *ImageId) 
            {
                  _imageLocalIdentifier = imageId;
            } onError:^(NSError *error) {
                // No need to do anything
            }];
        } onError:^(NSError *error) {
            // No need to do anything
        }];
    }
    else
    {
        [self addNewAssetWithImage:_imageToStore toAlbum:album onSuccess:^(NSString *ImageId) 
        {
          _imageLocalIdentifier = imageId;
        } onError:^(NSError *error) {
            // No need to do anything
        }];
     }

-(PHAssetCollection *)getMyAlbumWithName:(NSString*)AlbumName
{
    PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
                                                                               subtype:PHAssetCollectionSubtypeAlbumRegular
                                                                           options:nil];
    NSLog(@"assetCollections.count = %lu", assetCollections.count);
    if (assetCollections.count == 0) return nil;

    __block PHAssetCollection * myAlbum;
    [assetCollections enumerateObjectsUsingBlock:^(PHAssetCollection *album, NSUInteger idx, BOOL *stop) {
    NSLog(@"album:%@", album);
    NSLog(@"album.localizedTitle:%@", album.localizedTitle);
    if ([album.localizedTitle isEqualToString:AlbumName]) {
        myAlbum = album;
        *stop = YES;
        }
    }];

    if (!myAlbum) return nil;
    return myAlbum;
}

-(void)makeAlbumWithTitle:(NSString *)title onSuccess:(void(^)(NSString *AlbumId))onSuccess onError: (void(^)(NSError * error)) onError
{
    //Check weather the album already exist or not
    if (![self getMyAlbumWithName:title])
    {
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            // Request editing the album.
            PHAssetCollectionChangeRequest *createAlbumRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];
            // Get a placeholder for the new asset and add it to the album editing request.
            PHObjectPlaceholder * placeHolder = [createAlbumRequest placeholderForCreatedAssetCollection];
            if (placeHolder)
            {
                onSuccess(placeHolder.localIdentifier);
            }
        } completionHandler:^(BOOL success, NSError *error) {
            NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
            if (error)
            {
                onError(error);
            }
        }];
    }
}

-(void)addNewAssetWithImage:(UIImage *)image
                    toAlbum:(PHAssetCollection *)album
                  onSuccess:(void(^)(NSString *ImageId))onSuccess
                    onError: (void(^)(NSError * error)) onError
{
     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        // Request creating an asset from the image.
        PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
        // Request editing the album.
        PHAssetCollectionChangeRequest *albumChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:album];
        // Get a placeholder for the new asset and add it to the album editing request.
        PHObjectPlaceholder * placeHolder = [createAssetRequest placeholderForCreatedAsset];
        [albumChangeRequest addAssets:@[ placeHolder ]];
        NSLog(@"%@",placeHolder.localIdentifier);
        if (placeHolder) {
            onSuccess(placeHolder.localIdentifier);
        }
    } completionHandler:^(BOOL success, NSError *error) {
        NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
        if (error) {
            onError(error);
        }
    }];
}

这是我用来检索这张照片的代码:

    PHImageManager *imgManager = [[PHImageManager alloc] init];
    PHFetchResult* fetchResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[_imageLocalIdentifier] options:nil];
    if([fetchResult count] > 0)
    {
        PHAsset *asset = [fetchResult objectAtIndex:0];
        PHImageRequestOptions *option = [PHImageRequestOptions new];
        option.synchronous = NO;
        option.version = PHImageRequestOptionsVersionCurrent;
        option.networkAccessAllowed = YES;
        option.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
        option.resizeMode = PHImageRequestOptionsResizeModeFast;
        [imgManager requestImageForAsset:asset
                              targetSize:CGSizeMake(CAMERA_GALLERY_SIZE, CAMERA_GALLERY_SIZE)
                             contentMode:PHImageContentModeDefault
                                 options:option
                           resultHandler:^(UIImage *result, NSDictionary *info) {
                               [cell.photoIV setImage:result];
                           }];
    }

使用这段代码,在存储的12张照片的样本中(他们在我的专辑中可以正常)4或5个本地标识符返回空的获取结果。 这是在iOS 8,iOS 9和iOS 10中测试的(iOS 10确实更糟糕,因为几乎所有的获取结果都是空的)。

我已经读到类似于此的东西是以前版本的iOS中的一个错误,但我想这不是现在的原因。

我尝试过这种方法来检索照片:

- (PHAsset *)getAssetFromGallery:(NSString *)identifier
{
    PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[identifier] options:nil].lastObject;
    if(asset != nil)
        return asset;

    __block PHAsset *result;
    PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];

    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
    [fetchOptions setPredicate:[NSPredicate predicateWithFormat:@"localIdentifier == %@", identifier]];

    [userAlbums enumerateObjectsUsingBlock:^(id  _Nonnull objectCollection, NSUInteger idx, BOOL * _Nonnull stopCollectionEnumeration) {

        PHAssetCollection *collection = nil;
        if(![objectCollection isKindOfClass:[PHAssetCollection class]])
            return;
        collection = (PHAssetCollection *)objectCollection;

        PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions];
        [assetsFetchResult enumerateObjectsUsingBlock:^(id  _Nonnull objectAsset, NSUInteger idx, BOOL * _Nonnull stopAssetEnumeration) {
            PHAsset *asset = nil;
            if(![objectAsset isKindOfClass:[PHAsset class]])
                return;
            result = asset;
            *stopAssetEnumeration = YES;
            *stopCollectionEnumeration = YES;
        }];

    }];

    return asset;
}

我已尝试使用PHAssetCollectionSubtypeAlbumMyPhotoStream而不是PHAssetCollectionSubtypeAny 。 我尝试使用@"localIdentifier ==[cd] %@"而不是@"localIdentifier == %@". 并且总是相同的结果,很多时候获取结果都是空的。 知道它发生了什么?


I'm using Photos.Framework to save photos taken from the camera into my gallery and to retrieve them.

This is the code I'm using to store the photos:

    __block PHAssetCollection *album = [self getMyAlbumWithName:@"MyAlbumName"];
    if(album == nil)
    {
        [self makeAlbumWithTitle:@"MyAlbumName" onSuccess:^(NSString *AlbumId) {

             album = [self getMyAlbumWithName:@"MyAlbumName"];
            [self addNewAssetWithImage:_imageToStore toAlbum:album onSuccess:^(NSString *ImageId) 
            {
                  _imageLocalIdentifier = imageId;
            } onError:^(NSError *error) {
                // No need to do anything
            }];
        } onError:^(NSError *error) {
            // No need to do anything
        }];
    }
    else
    {
        [self addNewAssetWithImage:_imageToStore toAlbum:album onSuccess:^(NSString *ImageId) 
        {
          _imageLocalIdentifier = imageId;
        } onError:^(NSError *error) {
            // No need to do anything
        }];
     }

-(PHAssetCollection *)getMyAlbumWithName:(NSString*)AlbumName
{
    PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
                                                                               subtype:PHAssetCollectionSubtypeAlbumRegular
                                                                           options:nil];
    NSLog(@"assetCollections.count = %lu", assetCollections.count);
    if (assetCollections.count == 0) return nil;

    __block PHAssetCollection * myAlbum;
    [assetCollections enumerateObjectsUsingBlock:^(PHAssetCollection *album, NSUInteger idx, BOOL *stop) {
    NSLog(@"album:%@", album);
    NSLog(@"album.localizedTitle:%@", album.localizedTitle);
    if ([album.localizedTitle isEqualToString:AlbumName]) {
        myAlbum = album;
        *stop = YES;
        }
    }];

    if (!myAlbum) return nil;
    return myAlbum;
}

-(void)makeAlbumWithTitle:(NSString *)title onSuccess:(void(^)(NSString *AlbumId))onSuccess onError: (void(^)(NSError * error)) onError
{
    //Check weather the album already exist or not
    if (![self getMyAlbumWithName:title])
    {
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            // Request editing the album.
            PHAssetCollectionChangeRequest *createAlbumRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];
            // Get a placeholder for the new asset and add it to the album editing request.
            PHObjectPlaceholder * placeHolder = [createAlbumRequest placeholderForCreatedAssetCollection];
            if (placeHolder)
            {
                onSuccess(placeHolder.localIdentifier);
            }
        } completionHandler:^(BOOL success, NSError *error) {
            NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
            if (error)
            {
                onError(error);
            }
        }];
    }
}

-(void)addNewAssetWithImage:(UIImage *)image
                    toAlbum:(PHAssetCollection *)album
                  onSuccess:(void(^)(NSString *ImageId))onSuccess
                    onError: (void(^)(NSError * error)) onError
{
     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        // Request creating an asset from the image.
        PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
        // Request editing the album.
        PHAssetCollectionChangeRequest *albumChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:album];
        // Get a placeholder for the new asset and add it to the album editing request.
        PHObjectPlaceholder * placeHolder = [createAssetRequest placeholderForCreatedAsset];
        [albumChangeRequest addAssets:@[ placeHolder ]];
        NSLog(@"%@",placeHolder.localIdentifier);
        if (placeHolder) {
            onSuccess(placeHolder.localIdentifier);
        }
    } completionHandler:^(BOOL success, NSError *error) {
        NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
        if (error) {
            onError(error);
        }
    }];
}

And this is the code I'm using to retrieve this photo:

    PHImageManager *imgManager = [[PHImageManager alloc] init];
    PHFetchResult* fetchResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[_imageLocalIdentifier] options:nil];
    if([fetchResult count] > 0)
    {
        PHAsset *asset = [fetchResult objectAtIndex:0];
        PHImageRequestOptions *option = [PHImageRequestOptions new];
        option.synchronous = NO;
        option.version = PHImageRequestOptionsVersionCurrent;
        option.networkAccessAllowed = YES;
        option.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
        option.resizeMode = PHImageRequestOptionsResizeModeFast;
        [imgManager requestImageForAsset:asset
                              targetSize:CGSizeMake(CAMERA_GALLERY_SIZE, CAMERA_GALLERY_SIZE)
                             contentMode:PHImageContentModeDefault
                                 options:option
                           resultHandler:^(UIImage *result, NSDictionary *info) {
                               [cell.photoIV setImage:result];
                           }];
    }

With this piece of code, over a sample of 12 photos stored (they are ok in my album) 4 or 5 of their localidentifiers returns an empty fetch results. This is tested in iOS 8, iOS 9 and iOS 10 (with iOS 10 it's indeed worse because almost all of the fetch results are empty).

I've read that something similar to this was a bug in previous versions of iOS, but I guess this is not the reason now.

I've tried with this method to retrieve the photos:

- (PHAsset *)getAssetFromGallery:(NSString *)identifier
{
    PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[identifier] options:nil].lastObject;
    if(asset != nil)
        return asset;

    __block PHAsset *result;
    PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];

    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
    [fetchOptions setPredicate:[NSPredicate predicateWithFormat:@"localIdentifier == %@", identifier]];

    [userAlbums enumerateObjectsUsingBlock:^(id  _Nonnull objectCollection, NSUInteger idx, BOOL * _Nonnull stopCollectionEnumeration) {

        PHAssetCollection *collection = nil;
        if(![objectCollection isKindOfClass:[PHAssetCollection class]])
            return;
        collection = (PHAssetCollection *)objectCollection;

        PHFetchResult *assetsFetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:fetchOptions];
        [assetsFetchResult enumerateObjectsUsingBlock:^(id  _Nonnull objectAsset, NSUInteger idx, BOOL * _Nonnull stopAssetEnumeration) {
            PHAsset *asset = nil;
            if(![objectAsset isKindOfClass:[PHAsset class]])
                return;
            result = asset;
            *stopAssetEnumeration = YES;
            *stopCollectionEnumeration = YES;
        }];

    }];

    return asset;
}

I've tried with PHAssetCollectionSubtypeAlbumMyPhotoStream instead of PHAssetCollectionSubtypeAny. And I've tried with @"localIdentifier ==[cd] %@" instead of @"localIdentifier == %@". And always the same results, lots of times the fetch results is empty. Any idea of what is it happening?


原文:https://stackoverflow.com/questions/39549226
更新时间:2023-01-21 09:01

最满意答案

如果你想要不区分大小写的过滤(例如"Jones""jOnes"应匹配)

 List<User> FilteredUsers = AllUsers
   .Where(user => 
      user.Surname.IndexOf("jones", StringComparison.OrdinalIgnoreCase) >= 0))
   .ToList();

As haim770 stated it was a case sensitivity issue! Such a simple mistake! Thank you.

相关问答

更多