2017-06-01 12 views
-1

Ich teste die Rückruf- und Blockierfunktion.ios Callback Block Rückgabewert

Ich verwende das Ziel-c in iOS.

Ich schreibe einen Rückruf Methode Name ist "dosomethingProcessWithCompletion".

dosomethingProcessWithCompletion etwas tun, dann wird es den Wert NSMutableDictionary erhalten, werde ich den Wert nsmutabledictionary verwenden, um etwas zu überprüfen und den Wert ja oder nein zurückgeben.

Wenn der Wert ja (------- ------- AAAAA), ich brauche die

für brechen (NSInteger i = 0; i < myAry.count; i ++) .. für die Schleife.

und geben Sie die yes mit der Methode tryToCallBlockMethod zurück.

Wenn der Wert no lautet, wird die for-Schleife zum letzten Element ausgeführt und gibt die no-Methode mit tryToCallBlockMethod zurück.

Aber ich weiß nicht, wie Sie den Rückruf Rückgabewert schreiben.

kann jemand etwas geben?

Mein Code unten:

Mein AppTool declare:

typedef BOOL(^DoMyProcessCompletion)(NSMutableDictionary *completeresult); 
+ (void) dosomethingProcessWithCompletion:(NSURL*)theUrl andUserPsd:(NSString*)psd withCompletion:(DoMyProcessCompletion) completion{ 

..... 
.... 
.. 
NSMutableDictionary *resultDic = [NSMutableDictionary dictionary]; 
if(something == YES){ 

    [resultDic setObject:[NSNumber numberWithBool:YES] forKey:@"resultDicKey"]; 
    [resultDic setObject:myData forKey:@"myDataDicKey"]; 
     }else{ 
[resultDic setObject:[NSNumber numberWithBool:NO] forKey:@"resultDicKey"]; 
    [resultDic setObject:[NSNull null] forKey:@"myDataDicKey"]; 
     } 
    completion(resultDic) 
} 

Meine Nutzung und implementieren die Funktion unten ist:

-(BOOL) tryToCallBlockMethod{ 
    for(NSInteger i = 0 ; i < myAry.count; i++){ 
      userPsd = myAry[i];  
     [AppTool dosomethingProcessWithCompletion:[NSURL URLWithString:theUrl] andUserPsd:userPsd withCompletion:^(NSMutableDictionary *completeResult) { 

      BOOL result = [[completeResult objectForKey:@"resultDicKey"] boolValue]; 
      if(result == YES){ 
       //------- AAAAA------- 
       //------- if result is YES, will break the for look , and tryToCallBlockMethod will return YES. 
       return YES; 
      }else{ 
       //------- BBBBBBB------- 
       return NO; 
      } 
     }]; 
    } 
} 

Ihnen sehr danken.

+0

Ich denke, Sie missverstehen völlig die Verwendung des Blocks. Block wird normalerweise asynchron verwendet. Wie kann ein asynchroner Prozess eine Schleife unterbrechen? Wenn Sie möchten, dass einige Checks Schleife brechen können, sollten Sie nicht Block verwenden, verwenden Sie einfach normalen Synchronisierungsprozess. –

Antwort

0

Sie müssen boolean wie unten beschrieben zurückgeben, während Sie Block innerhalb der Funktion verwendet haben.

-(void) tryToCallBlockMethod:(void(^)(BOOL isResult))callback{ 
     if(result == YES){ 
        callback(YES) 
       return YES; 
      }else{ 
        callback(NO) 

      } 
} 
Verwandte Themen