2016-09-17 52 views
0

我打电话,返回字符串类型值languageConvertor功能,但我想回到执行,请在上面的代码中,我想返回翻译字符串,但后检查下面的代码如何在完成块执行后从函数返回字符串?

-(NSString *)languageConvertor:(NSString *)str 
{  

    [self.translator translateText:str completion:^(NSError *error, NSString *translated, NSString *sourceLanguage) 
    { 
     if (error) 
     { 
      [SVProgressHUD dismiss]; 
     } 
     else 
     {    
      NSString *fromLanguage = [[self currentLocale] displayNameForKey:NSLocaleIdentifier value:sourceLanguage]; 
      [SVProgressHUD dismiss]; 
     } 
     }]; 
    return translated; 
} 

现在完成块之后的字符串类型值执行完成块,所以任何一个PLZ建议我?

+0

你不能当翻译异步完成时返回一个值。您需要将完成块传递给此函数,并从翻译完成处理程序中调用它 – Paulw11

回答

0

当您使用完成块来翻译文本。该块称为异步。为什么在翻译文本之前调用return语句。

所以要返回翻译文本,您需要在您的方法中添加块参数。如下所示。

-(void)languageConvertor:(NSString *)str completionBlock:(void(^)(NSString *strText, NSError *error)) completion { 
[self.translator translateText:str completion:^(NSError *error, NSString *translated, NSString *sourceLanguage) { 
    if (error) { 
     [SVProgressHUD dismiss]; 
    } 
    else { 
     NSString *fromLanguage = [[self currentLocale] displayNameForKey:NSLocaleIdentifier value:sourceLanguage]; 
     [SVProgressHUD dismiss]; 
    } 

     if (completion) { 
      completion(translated, error); 
     } 
}]; 
} 

让我知道你是否有任何疑问。

谢谢。

0

不,你不能从Block返回。你必须找到一个不同的方式来做到这一点。所以它的下一行执行,就像你调用该块功能

-(NSString *)languageConvertorForString:(NSString*)str withComletionBlock:(void (^)(NSString *translated, NSError *error))block 

    {  

    [self.translator translateText:str completion:^(NSError *error, NSString *translated, NSString *sourceLanguage) 

{ 
     [SVProgressHUD dismiss]; 
     block(translated, error); 

}]; 

} 

块需要你的过程是异步的。

所以你必须创建自己的块得到现有块的结果。

0
- (void)languageConvertor:(NSString *)str withCompletion:(void (^)(NSString *string, NSError *error))completion 

{ 

    [self.translator translateText:str completion:^(NSError *error, NSString *translated, NSString *sourceLanguage) 

    { 
     if (error) 
     { 
      completion(nil, error); 
      [SVProgressHUD dismiss]; 

     } 
     else 
     {    NSString *fromLanguage = [[self currentLocale] displayNameForKey:NSLocaleIdentifier value:sourceLanguage]; 
      completion(yourReturnString, nil); 
      [SVProgressHUD dismiss]; 
     } 
    }]; 
} 

并调用该方法类似,

[yourObject languageConvertor:yourString withCompletion:^(NSString *string, NSError *error) { 
     if(error) { 

     } else { 

     } 
    }]; 

如果你想要做回一些用户界面的变化,然后请来电主队列完成块,

dispatch_async(dispatch_get_main_queue(), ^{ 
       completion(yourString, nil); 
      });