enumerateGroupsWithTypes 循环没有停止

enumerateGroupsWithTypes loop isn't stopping

我正在使用以下代码遍历 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 但它仍然执行最后 returns 和 notFoundError 的 else 块。这是 print 语句的输出。

group name: Last Imported

found it! Last Imported

Error occurred fetching album: Album Not Found

如何阻止这种情况发生?

docs for enumerationBlock状态

The block to invoke using each asset group in turn.

When the enumeration is done, enumerationBlock is invoked with group set to nil.

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

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

尝试插入一些 print 语句以查看何时进入哪个分支以及输入的是什么。特别是 stop 是否已经设置为 true.