我如何知道资产库中存在 ALAsset 的 NSURL?

Posted

技术标签:

【中文标题】我如何知道资产库中存在 ALAsset 的 NSURL?【英文标题】:How do I know an NSURL of ALAsset in assets library exists? 【发布时间】:2013-09-11 09:35:41 【问题描述】:

如果我在我的数据库中的照片库 (ALAsset) 中保留了一个照片图像的 url 几天,我如何通过它的 NSURL 知道这张照片仍然存在于照片库中?

我试过了,但没用:

// Have already obtained the asset object from ALAssetsLibrary
NSURL *assetURL = [[(ALAsset*)asset defaultRepresentation] url];
BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath: [assetURL absoluteString]];
NSLog(@"exists: %d (%@)", exists, [assetURL absoluteString]);

>> exists: 0 (assets-library://asset/asset.PNG?id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&ext=PNG)

【问题讨论】:

NSURL *myURL = [NSURL URLWithString:@"url 在这里"] NSString *path = [myURL absoluteString]; 【参考方案1】:

根据您的要求试试这个。检查一下

dispatch_group_t group = dispatch_group_create();
    dispatch_group_enter(group);
    __block BOOL flag=YES;
    ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
    [assetslibrary assetForURL:path resultBlock:^(ALAsset *asset) 
        if (asset==nil)
        
            flag=NO;
        
        else
        
            flag=YES;
        
            dispatch_group_leave(group);
         failureBlock:^(NSError *error)
                NSLog(@"operation was not successfull!");
                dispatch_group_leave(group);
    ];
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    dispatch_release(group);

【讨论】:

我做了这个实现,但是卡在dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 这一行。当 ALAssetsLibrary 的另一个对象忙时,可能会调用此方法。我认为它可能需要另一个线程或调度队列来处理它。对吗? 我找到了an answer using GCD semaphore,它解决了我的问题。 很好的问题和努力。

以上是关于我如何知道资产库中存在 ALAsset 的 NSURL?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ALAsset 获取 exif 信息?

如何获取共享照片流 ALAsset 的 ALAssetRepresentation?

如何使用 ALAsset 获得图像的裁剪版本?

使用 ALAssetPropertyAssetURL 获取 ALAsset 的 UID URL

imageWithContentsOfFile 内存问题

无法使用保管箱 API 将文件(使用 ALAsset 库)上传到保管箱