2016-11-18 57 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