2016-11-18 4 views
-1

Ich schreibe eine API, die Daten für Zeitintervalle (startDate, endDate) aus dem Netzwerk lädt und ein Bild zurückgibt.Funktion Rückruf/Best Practices

Gibt es irgendeine Inzidenz, die meine Funktion (loadData) zurückgibt, ohne Erfolg oder Misserfolg Callback auszuführen?

In meinem Fall wird einfach loadData zurückgegeben, wenn ich bereits Daten für diese Zeitintervalle geladen habe.

Ich denke, dass es kein guter Weg ist. Auch ich frage mich in diesem Fall nach Leck.

EDIT: Hier ist mein Code:

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) 
    } 

Sie einen Rat haben Sie?

Dank

+1

Sprechen Sie nicht über Ihren Code. _Show_ Ihr Code. – matt

+0

Hier ist mein Code. – thierryb

Antwort

0

Rückkehr aufgrund der „Operation bereits ins Leben gerufen“ sind Informationen der Anrufer wissen muss. Einfach nichts zurückgeben und keinen Callback aufrufen ist ein schlechtes Design. Der Anrufer hat keine Ahnung, warum passiert ist.

Sie haben drei Möglichkeiten (pick one):

  1. Rufen Sie den Erfolg Rückruf, da es wirklich nicht ein Fehler war.
  2. Rufen Sie den Fehlerrückruf mit einem "Fehler" auf, der angibt, dass der Fehler auf einen Status "bereits gestartet" zurückzuführen ist.
  3. Ändern Sie die Signatur Ihrer loadImageFromWebService...-Methode, um einen booleschen Wert zurückzugeben. Geben Sie false zurück, um anzugeben, dass Sie nicht fortfahren konnten, da die Operation bereits ausgeführt wird. Geben Sie andernfalls true zurück. Das heißt, wenn Sie false zurückgeben, wird keiner der beiden Callbacks aufgerufen. Wenn Sie true zurückgeben, wird schließlich einer der beiden Callbacks aufgerufen.
+0

danke rmaddy für Ihren Rat. – thierryb