2016-06-28 169 views
0

我有函數返回類型是'布爾'和函數體調用HTTP請求。如何從塊體返回函數值?

如果數據存在,我想返回'真'。我想同步管理

- (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

**不,你不希望它同步**。即使你願意,這也是一個壞主意,它會在網絡通話中阻止你的應用程序(想象地鐵中的人,沒有網絡,你的應用程序必須被殺死)。檢查我的答案,我更新它以適應您的需求。 – AnthoPak

+0

@AnthoninC。感謝您指出在我的情況下同步通話的黑暗面... –

+1

沒問題的朋友,很高興有幫助。 – AnthoPak

回答

1

你不能在一個塊返回值,因爲它是異步的。你可以做的是使用completionHandler來發送結果。下面是一個示例代碼:

-(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]; 
} 

,並使用它像:

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

我正在尋找同步調用,因爲我想檢查進一步業務邏輯的狀態。 –

+0

這不是問題。在'if(response){...}'放入您的業務邏輯。您提供的代碼不是同步的,並且對WebServices的所有調用都必須是異步的,以便不阻止主線程。 – AnthoPak