2016-11-18 103 views
-1

我正在寫一個API,它從網絡中加載時間間隔(startDate,endDate)的數據並返回一個圖像。功能回調/最佳做法

如果有任何我的函數(loadData)返回而沒有執行成功或失敗回調的發生?

在我的情況下,loadData只是返回,如果我已經加載數據的時間間隔。

我認爲這不是一個好方法。 另外我在這種情況下要求自己泄漏。

編輯:這裏是我的代碼:

func loadImageFromWebService(startDateISO8601: String, endDateISO8601: String, startCallback: (() -> Void)?, successCallback: ((UIImage?) -> Void)?, failureCallback: ((Error) -> Void)?) { 

     let operationKey = makeOperationKey(forTimeIntervals: startDateISO8601, endDateISO8601) 

     guard isOperationAlreadyLaunched(operationKey) == false else { return } 

     startCallback?() 

     let networkTask = WEB_SERVICE_MANAGER.getData(startDateISO8601: startDateISO8601, endDateISO8601: endDateISO8601, successCallback: { [ weak self ] data in 

      let image = self?.makeImageWithData(data) 
      successCallback?(image) 

      }, // Success Callback 
      failureCallback: { [ weak self ] error in 
       self?.setNetworkTask(nil, forOperationKey: operationKey) 
       failureCallback?(error) 
      } // Failure Callback 
     ) 

     self.setNetworkTask(networkTask, forOperationKey: operationKey) 
    } 

你有什麼建議嗎?

謝謝

+1

不要談論你的代碼。 _顯示你的代碼。 – matt

+0

這是我的代碼。 – thierryb

回答

0

由於「操作已經啓動」而返回的是調用者需要知道的信息。簡單地返回沒有,也沒有調用任何回調是一個糟糕的設計。來電者不知道爲什麼發生。

你有三個選擇(任選其一):

  1. 調用成功回調,因爲真的沒有失敗。
  2. 使用「錯誤」調用故障回調,指示故障是由於「已啓動」狀態引起的。
  3. 更改loadImageFromWebService...方法的簽名以返回布爾值。返回false表示您無法繼續操作,因爲該操作已在進行中。否則返回true。這意味着如果您返回false,則兩個回調都不會被調用。如果您返回true,那麼最終會調用兩個回調中的一個。
+0

感謝rmaddy的建議。 – thierryb