2016-07-04 96 views
2

我在FIRStorageReference上寫了一個Swift擴展來檢測文件是否存在。我打電話給metadataWithCompletion()。如果完成塊的可選NSError沒有設置,我認爲假定文件存在是安全的。如何檢測Firebase存儲文件是否存在?

如果NSError設置,無論是出事了,或者文件不存在。 storage documentation on handling errors in iOS指出FIRStorageErrorCodeObjectNotFound是我應該檢查的錯誤類型,但是不能解析(可能Swiftified爲更短的.Name樣式的常量?),我不確定我應該檢查它。

我想completion(nil, false)如果FIRStorageErrorCodeObjectNotFound設置的地方被調用。

這是我的代碼到目前爲止。

extension FIRStorageReference { 
    func exists(completion: (NSError?, Bool?) ->()) { 
     metadataWithCompletion() { metadata, error in 
      if let error = error { 
       print("Error: \(error.localizedDescription)") 
       print("Error.code: \(error.code)") 

       // This is where I'd expect to be checking something. 

       completion(error, nil) 
       return 
      } else { 
       completion(nil, true) 
      } 
     } 
    } 
} 

非常感謝提前。

+0

我們故意沒有建立一個「對象存在性檢查」,因爲我們的身影檢查錯誤對象get或元數據獲取的'FIRStorageErrorCodeObjectNotFound'的代碼已經足夠好了。你可以給我一個背後的理由,說明爲什麼你需要這個功能,而不是僅僅做對象/元數據獲取,如果沒有找到想要的對象,處理錯誤? –

+0

獲取元數據是一種很好的方法,我現在不確定的是我是如何確定發生了哪種錯誤的。在我的代碼中,我將如何處理這個NSError對象,如果沒有錯誤對象,是否可以安全地假定文件存在?謝謝。 –

回答

2

您可以檢查錯誤代碼如下所示:

// Check error code after completion 
storageRef.metadataWithCompletion() { metadata, error in 
    guard let storageError = error else { return } 
    guard let errorCode = FIRStorageErrorCode(rawValue: storageError.code) else { return } 
    switch errorCode { 
    case .ObjectNotFound: 
     // File doesn't exist 

    case .Unauthorized: 
     // User doesn't have permission to access file 

    case .Cancelled: 
     // User canceled the upload 

    ... 

    case .Unknown: 
    // Unknown error occurred, inspect the server response 
    } 
} 
0

那是我用來檢查用戶是否已獲得通過hasChild(「」)方法的用戶的照片一個簡單的代碼,並且參考這裏:
https://firebase.google.com/docs/reference/ios/firebasedatabase/interface_f_i_r_data_snapshot.html

希望這可以幫助

let userID = FIRAuth.auth()?.currentUser?.uid 

     self.databaseRef.child("users").child(userID!).observeEventType(.Value, withBlock: { (snapshot) in 
      // Get user value 
      dispatch_async(dispatch_get_main_queue()){ 
       let username = snapshot.value!["username"] as! String 
       self.userNameLabel.text = username 
       // check if user has photo 
       if snapshot.hasChild("userPhoto"){ 
        // set image locatin 
        let filePath = "\(userID!)/\("userPhoto")" 
        // Assuming a < 10MB file, though you can change that 
        self.storageRef.child(filePath).dataWithMaxSize(10*1024*1024, completion: { (data, error) in 
         let userPhoto = UIImage(data: data!) 
         self.userPhoto.image = userPhoto 
        }) 
       } 
+1

謝謝,但'hasChild()'和你提到的文檔都提到了Firebase的* Database *。我試圖在Firebase的存儲中檢測文件的存在。我認爲這些是相當獨立的。 –

+0

對不起,沒有更具體的,當你存儲文件到FIRsotrage然後它會產生一個URL,我使用FIRdatabase來存儲這個URL作爲參考,所以我可以檢查這個URL是否存在,我可以知道該文件是也存在。 –

+0

謝謝,但這似乎是一種解決方法,而不是這樣做的正確方法。我希望有一些方法可以在'metadataWithCompletion()'中以編程方式解釋錯誤的原因,但是如何做到這一點並不明顯。 –