Objekt X muss ein Image herunterladen. Es hat URL des Bildes (könnte Datei des Netzes sein). Ich habe eine gemeinsame imageHandler-Klasse, die eine URL aufnehmen und die imageData abrufen kann. Ich möchte, dass diese Methode in der Lage ist, einen Abschlussblock zu nehmen, um anzupassen, was mit dem heruntergeladenen Bild zu tun ist.Objective-C: Wie gebe ich einer Methode einen Completion-Block, der ein Ergebnis der Methodenausführung verwendet
Ich bin vertraut mit, wie es zu tun ist mit Delegate-Muster. ZB
Also im Grunde objectX Klasse getImageFromURL: Delegate-Methode mit Delegate als selbst. Es entspricht dem ImageRequestor-Protokoll.
Das ImageHandler-Objekt speichert die URL, um die Zuordnung in einer Hash-Tabelle zu delegieren. Nachdem es fertig ist, ruft Bild: RetrievedForURL: withError: auf dem Delegaten auf. Und bei dieser Methode handle ich auf das Bild und den Fehler.
Wie erreiche ich den gleichen Effekt mit Completion-Blöcke, wo ich weitergeben, was ich mit dem abgerufenen Bild als ein Stück Code tun möchte.
Ein Ansatz, den ich sehe, ist wie folgt. Aber es sieht so aus, als ob die Implementierung der ImageHandler-Methode den Abschluss mit bestimmten Argumenten aufrufen muss. Ist dies der akzeptierte Weg, dies zu implementieren (d. H. Der Vervollständigungshandler verlässt sich auf die Methode, die ihn empfängt, um ihn mit korrekten Argumenten aufzurufen)?
@protocol ImageHandler: NSObject
-(void) getImageFromURL:(NSURL *)url withCompletionHandler:(void (^)(UIImage *image, NSError * err))completionBlock;
@end
Die Implementierung von getImageFromURL:(NSURL *)url withCompletionHandler:(void (^)(UIImage *image, NSError * err))completionBlock
sieht aus wie
getImageFromURL:(NSURL *)url withCompletionHandler:(void (^)(UIImage *image, NSError * err))completionBlock
{
//Get UIImage from URL, store it UIIMage ObjectX
//if error happens, store it in NSError objectY, else it is nil
//call completion handler
completionBlock(<UIIMage objectX>,<NSError objectY>);
}