如何在Swift中枚举一个ALAssetsGroup



我已经尽力了,但是我还是被困在这里了。我想导入iPhone相机相册中的所有照片。所以我想出了这个alassstlibrary API

 photoLibrary.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), usingBlock: { group  in
        if group != nil
        {
        }
        }, failureBlock: { error in println("(error)")})

如何添加这行代码

group enumerateAssetsUsingBlock:groupEnumerAtion

我试着添加这个,但它没有显示任何enumerateAssetsUsingBlock属性。

这是实际代码。!! 在objective - c

    dispatch_async(dispatch_get_main_queue(), ^
        {
            @autoreleasepool
            {
                ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
                    {
                        NSLog(@"error occour =%@", [myerror localizedDescription]);
                };
                ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop)
                    {
                        if (result!=NULL)
                        {
                            if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto])
                            {
                                [self.g_imageArray addObject:result];
                            }
                        }
                };
                ALAssetsLibraryGroupsEnumerationResultsBlock
                libraryGroupsEnumeration = ^(ALAssetsGroup* group, BOOL* stop)
                    {
                        if (group == nil)
                        {
                            return;
                        }
                        if (group!=nil) {
                            [group enumerateAssetsUsingBlock:groupEnumerAtion];
                        }
                        [self updatephotoList];
                };
                self.library = [[ALAssetsLibrary alloc] init];
                [self.library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                usingBlock:libraryGroupsEnumeration 
                failureBlock:failureblock];
            }
        });

您的enumerationBlockfailureBlock没有正确的类型。例如,枚举块定义为

typealias ALAssetsLibraryGroupsEnumerationResultsBlock = (ALAssetsGroup!, UnsafeMutablePointer<ObjCBool>) -> Void

表示参数是一个以(ALAssetsGroup!, UnsafeMutablePointer<ObjCBool>)为形参并返回Void的闭包:

{
     (group: ALAssetsGroup!, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
     // ...
}
所以你的代码应该是这样的:
photoLibrary.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos),
    usingBlock: {
        (group: ALAssetsGroup!, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
        if group != nil {
            group.enumerateAssetsUsingBlock({
                (asset: ALAsset!, index: Int, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
                    // ...
                })
        }
    },
    failureBlock: {
        (myerror: NSError!) -> Void in
        println("error occurred: (myerror.localizedDescription)")
    })

由于Swift的"自动类型推断"特性,你也可以这样写

photoLibrary.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos),
    usingBlock: {
        group, stop in
        if group != nil {
            group.enumerateAssetsUsingBlock({
                asset, index, stop in
                // ...
                })
        }
    },
    failureBlock: {
        myerror in
        println("error occurred: (myerror.localizedDescription)")
    })

但是在这种情况下,第一个版本可能更容易理解

注意,该API自iOS 9.0以来已弃用:

迅速5

    let library = ALAssetsLibrary()
    library.enumerateGroups(withTypes: ALAssetsGroupType(ALAssetsGroupSavedPhotos), using: { (group, stop) -> Void in
        if let group = group {
            group.enumerateAssets({
                (asset, index, stop) -> Void in
                // ...
            })
        }
    },
    failureBlock: { myerror in
        print("error occurred: (myerror)")
    })

最新更新