如何在Swift中枚举ALAssetsGroup

3

我尽力了,但我在这里卡住了。我想从iPhone相机相册中导入所有照片。所以我想到了使用ALAssetsLibrary 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];
            }
        });
2个回答

8
你的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)")
    })

在这种情况下,第一版可能更容易理解。

谢谢!但是我不得不将UnsafePointer更改为UnsafeMutablePointer。 - garafajon
@garafajon:你说得完全正确,这在Swift版本之间发生了变化。我已经更新了答案。感谢您的反馈! - Martin R

0

请注意,自iOS 9.0起,该API已被弃用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接