2016-03-21 7 views
-2

Ich habe eine Methode, die einen lang laufenden Prozess aufruft. der langwierige Prozess und ich benutze AFNetworking, die selbst Blöcke verwendet und Erfolgsblock und Fehlerblock zurückgibt. Also versuche ich meine Methode zu testen und die Tests werden fehlschlagen, bevor der Erfolgsblock aufgerufen wird. Ich dachte, ich würde versuchen, meine Methode auch Blöcke zu verwenden. Ich habe eine andere Methode, die ich ändern konnte, um Blöcke zu verwenden, aber das verwendet nur bool isFinished und der Rückgabewert ist ungültig. Die Methode, die ich schwierig habe, muss NSDecimalNumber * zurückgeben und nimmt einen NSString.Objective-c-Methode zur Verwendung von Blöcken

Methodensignatur

  • (NSDecimalNumber *) getRate: (NSString *) rateCode;

Ich möchte in der Lage sein kann ein Beendigungsblock mit einer BOOL hinzuzufügen, die I gesetzt, wenn die AFNetworking Verfahren tritt in den Erfolg Block

Ich würde auch das Verfahren in der Lage sein möchten anrufen und innerhalb Es ist Completion Block Zugriff auf die NSDecimalNumber * -Wert zurückgegeben

Möglich? Wenn ja, bitte zeige mir wie

+0

Dies könnte Hilfe http://goshdarnblocksyntax.com – nielsbot

+0

Methoden nicht mit "get" voranstellen . – bbum

Antwort

3

Sie müssen es wahrscheinlich auseinander teilen.

Sie können eine fetchRate: Methode, die einen Abschluss Block nimmt:

- (void)fetchRate:(NSString*)rateCode completion:(void (^)(NSDecimalNumber *))completion; 

Dann wie folgt aufrufen:

void (^completion)(NSDecimalNumber *) = ^(NSDecimalNumber * rate){ 
    // this is called when rate is returned from your webservice 
} 

// call fetchRate: now, results will arrive later... 
[ myObj fetchRate:<rate code> completion:completion ]; 

// code here runs immediately; the results come back later. 

-fetchRate: sieht ungefähr so ​​aus ...

- (void)fetchRate:(NSString *)rateCode completion:(void (^)(NSDecimalNumber *))completion 
{ 
    void (^asiCompletionBlock)(/*args*/) = ^(/*...args...*/){ 
     // called after ASI request completes 

     NSDecimalNumber * answer = /* get answer from ASI HTTP response */ 

     // call our completion block that was passed in: 
     completion(answer); 
    }; 

    // do your asi HTTP request here, pass asiCompletionBlock for completion arg 
} 
+0

... und nennen Sie es "fetchRate" oder etwas ähnliches, [nicht "** get ** Rate"] (https://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia-CoacoCore /AccessorMethod.html). –

+0

guten Punkt, aktualisierte ich meine Antwort. – nielsbot

+0

ok, aber Probleme mit dem Aufruf von fetchRate haben –