enumerateGroupsWithTypes循环没有停止

时间:2016-01-22 08:26:46

标签: ios swift loops alassetslibrary

我正在使用以下代码来遍历eh专辑,如果找到我需要的专辑,它应该停止进一步循环。

public func importPhotosFromGallery(albumName: String = "Last Imported") {
    fetchAlbum(albumName) { album, error in
        if let error = error {
            print("Error occurred fetching album: \(error.localizedDescription)")
        } else {
            if let album = album {
                print("found it! \(album.name)")
            }
        }
    }
}

private func fetchAlbum(albumName: String, completion: (album: ALAssetsGroup?, error: NSError?) -> ()) {
    assetsLibrary.enumerateGroupsWithTypes(ALAssetsGroupAlbum, usingBlock: { group, stop in
        if group != nil {
            group.setAssetsFilter(ALAssetsFilter.allPhotos())
            print("group name: \(group.name)")
            if group.name == albumName {
                stop.initialize(true)
                completion(album: group, error: nil)
            }
        } else {
            let notFoundError = NSError.createError("Album Not Found")
            completion(album: nil, error: notFoundError)
        }
    }) { error in
        completion(album: nil, error: error)
    }
}

我在找到匹配后将stop变量的值更改为true,但它仍然执行最后返回notFoundError的else块。这是print语句的输出。

  

群组名称:上次导入

     发现它了!最后导入的

     

获取相册时出错:相册未找到

如何阻止这种情况发生?

1 个答案:

答案 0 :(得分:1)

docs for enumerationBlock

  

依次使用每个资产组调用的块。

     

枚举完成后,调用enumerationBlock,并将group设置为nil。

这意味着在将stop设置为true后,再次调用enumerationBlock,这次group为nil,从而导致completion(album: nil, error: notFoundError) - 分支被输入

这会导致您的完成块被调用两次,一次使用正确找到的专辑,再次在枚举结束时。

尝试插入一些print - 语句,以查看何时输入了哪个分支以及输入的内容。特别是,stop已设置为true