2016-01-22 134 views
1

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

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找到比赛结束后,但它仍然执行else块,在年底返回notFoundError。这是print声明的输出。

组名称:最近导入

找到了!去年进口

发生错误获取专辑:找不到相册

如何阻止这种情况的发生?

回答

1

docs for enumerationBlock状态

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

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

这将设置stop为true enumerationBlock后,意味着被调用一次,这一次group是零,因此导致要输入的completion(album: nil, error: notFoundError)分枝。

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

尝试插入几个print-语句来查看何时输入哪个分支以及输入是什么。特别是否stop已被设置为true

+0

哦,废话。我不知道。如果检查'if stop.memory.boolValue!= true {}',我将填充处理程序填入else块中。现在都好。谢谢。 – Isuru

+0

@Isuru不客气! – luk2302