Swift中的完成處理器是什麼?


在Swift中,完成處理器是一段用於執行和處理任務完成狀態的程式碼塊。例如,完成處理器非常常用於使用URLSession類的網路請求。基本上,完成處理器作為函式引數傳遞,並在任務完成後呼叫。它不會影響任務是否成功完成。

您可以使用完成處理器在您的iOS應用程式中執行不同的操作。有一些常見的實踐來實現完成處理器,例如在FileManager操作中清理未使用的資源後返回狀態,在一個語句塊內更新多個使用者介面,以及完成之後返回等等。

在這篇文章中,您將看到以下示例,以瞭解如何有效地使用完成處理器:

  • 使用URLSession類獲取資料,並在從URL獲取響應後返回完成處理器。

  • 過濾陣列,並在成功過濾陣列後返回完成處理器。

  • 執行網路請求以使用電子郵件和密碼進行使用者身份驗證。從伺服器獲取響應後,返回完成處理器。

讓我們看看Swift中完成處理器的不同示例:

使用URLSession()類獲取資料

這是一個將完成處理器作為引數的函式示例:

示例

func fetchData(_ completion: @escaping (_ success: Bool, _ data: Data?) -> Void) {
    
   // Build an URL
   let url = URL(string: "sample_url")!
    
   // Perform the network request
   let task = URLSession.shared.dataTask(with: url) { data, response, error in
      if let data = data {
         // Success, call the completion handler with the data
         completion(true, data)
      } else {
         // Failure, call the completion handler with nil data
         completion(false, nil)
      }
   }
   task.resume()
}

這是一個關於如何使用上述函式的示例:

self.fetchData { success, data in
   if success {        
      guard let dataObject = data else { return }
        
      // Parse the data and update the UI
      let json = try? JSONSerialization.jsonObject(with: dataObject)
      print(json!)        
   } else {
      // Show an error message
      print("Network request failed")
   }
}

此示例中的fetchData()函式接受一個完成處理器作為引數。網路呼叫傳遞的成功布爾值和資料是傳送到完成處理器的兩個引數。此函式發出網路請求;成功或失敗時,它都會呼叫完成處理器並向其傳遞相關的成功和資料值。

過濾陣列

另一個示例是針對需要時間的操作,例如過濾陣列

示例

func filterArray(_ array: [Int], completion: @escaping (_ filteredArray: [Int]) -> Void) {
   DispatchQueue.global().async {
      let filteredArray = array.filter { $0 > 5 }
      DispatchQueue.main.async {
         completion(filteredArray)
      }
   }
}

這是一個關於如何使用上述函式的示例:

let originalArray: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filterArray(originalArray) { filteredArray in
   print("Original array: \(originalArray)")
   print("Filtered array: \(filteredArray)")
}

輸出

Original array: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Filtered array: [6, 7, 8, 9, 10]

使用者身份驗證過程

這是一個使用完成處理器處理使用者身份驗證過程結果的函式示例

示例

func login(username: String, password: String, completion: @escaping (_ success: Bool, _ error: Error?) -> Void) {
   // Perform the login process
   Auth.auth().signIn(withEmail: username, password: password) { authResult, error in
      if let error = error {
         // Login failed, call the completion handler with the error
         completion(false, error)
      } else {
         // Login succeeded, call the completion handler with success
         completion(true, nil)
      }
   }
}

這是一個關於如何使用此函式的示例

login(username: "user@example.com", password: "password") { success, error in
   if success {
      // Show the home screen
   } else {
      // Show an error message
      print(error)
   }
}

此函式執行使用給定的電子郵件和密碼登入使用者的任務。完成處理器將使用登入過程的結果被呼叫。如果登入過程成功,它將使用success呼叫完成處理器,否則,它將傳遞錯誤訊息。

在程式碼中使用完成處理器時,您應該記住以下幾點:

  • 有時,在巢狀完成處理器的案例中,完成處理器會使您的程式碼難以閱讀和理解。

  • 對於非同步操作,完成處理器可能難以管理。

  • 在巢狀完成處理器的案例中,回撥可能難以維護。

  • 不正確地使用完成處理器可能會建立保留迴圈,從而導致記憶體洩漏。

結論

在每個示例中,函式執行特定任務,然後呼叫完成處理器來處理結果。使用完成處理器使函式能夠非同步完成任務並立即返回,而不會延遲程式其餘部分的執行。

完成處理器可用於更新使用者介面或執行任務結果的任何必要的清理或處理。因此,函式可以立即返回,而無需等待工作完成,並且開發人員可以處理結果而不會阻塞。Swift程式設計師經常使用完成處理器,這是一種用於管理非同步過程和提高程式碼響應能力的有用技術。

更新於:2023年2月28日

14K+ 次檢視

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.