2016-06-28 14 views
0

戻り値の型が「BOOL」で、関数本体のHTTP要求を呼び出す関数に関数があります。ブロックボディから関数値を返すにはどうすればよいですか?

データが存在する場合は、「True」を返します。私は管理したい同期して

- (BOOL) randomFunction { 
     NSURLSession *session = [NSURLSession sharedSession]; 
     [[session dataTaskWithRequest:mutableRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
      if (data) { 
       NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &error]; 
       NSString *status = (NSString *)[JSON valueForKey:@"enabled"]; 
       if ([status isEqualToString:@"true"]) { 
    //    return YES; // ERROR 
       } 
      } 
    //  return NO; // ERROR 
     }] resume]; 
} 

ERROR:

Incompatible block pointer types sending 'BOOL (^)(NSData * _Nullable __strong, NSURLResponse * _Nullable __strong, NSError * _Nullable __strong)' to parameter of type 'void (^ _Nonnull)(NSData * _Nullable __strong, NSURLResponse * _Nullable __strong, NSError * _Nullable __strong)'

+0

を**ありませんあなたは同期的にそれをしたくない:ここではサンプルコードです:

-(void)randomFunction:(void (^)(BOOL response))completionHandlerBlock { NSURLSession *session = [NSURLSession sharedSession]; [[session dataTaskWithRequest:nil completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (data) { NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &error]; NSString *status = (NSString *)[JSON valueForKey:@"enabled"]; if ([status isEqualToString:@"true"]) { completionHandlerBlock(YES); } } completionHandlerBlock(NO); }] resume]; } 

とそのようにそれを使用。あなたが望む場合でも、それは悪い考えです、それはWeb呼び出し中にあなたのアプリをブロックします(メトロの人々、ネットワークなし、あなたのアプリが殺されなければならないと想像してください)。私の答えを確認し、あなたのニーズに合わせて更新しました。 – AnthoPak

+0

@AnthoninC。私の場合に同期呼び出しの暗い側面について指摘してくれてありがとう... –

+1

問題のバディは、助けてうれしいです。 – AnthoPak

答えて

1

することはできませんブロック内戻り値、それが非同期であるため。代わりに、結果を送信するためにcompletionHandlerを使用することができます。 **

[self randomFunction:^(BOOL response) { 
    if (response) { 
     //handle response 
    } 
}]; 
+0

同期コールを探して、ビジネスロジックのステータスを確認したいのですが。 –

+0

これは問題ではありません。 'if(response){...}'ではビジネスロジックを記述します。あなたが提供するコードは同期的ではなく、メインスレッドをブロックしないために、WebServiceへのすべての呼び出しは非同期でなければなりません。 – AnthoPak

関連する問題