我正在使用以下代码来遍历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
语句的输出。
群组名称:上次导入
发现它了!最后导入的获取相册时出错:相册未找到
如何阻止这种情况发生?
答案 0 :(得分:1)
依次使用每个资产组调用的块。
枚举完成后,调用enumerationBlock,并将group设置为nil。
这意味着在将stop
设置为true后,再次调用enumerationBlock
,这次group
为nil,从而导致completion(album: nil, error: notFoundError)
- 分支被输入
这会导致您的完成块被调用两次,一次使用正确找到的专辑,再次在枚举结束时。
尝试插入一些print
- 语句,以查看何时输入了哪个分支以及输入的内容。特别是,stop
已设置为true
。