2016-01-22 132 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