完成块执行后如何从函数返回字符串?

时间:2016-09-17 06:45:10

标签: ios iphone function block

我正在调用返回字符串类型值的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都建议我吗?

3 个答案:

答案 0 :(得分: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);
         }
 }];
}

如果您有任何疑问,请与我们联系。

感谢。

答案 1 :(得分: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);

 }];

 }

Block使您的进程异步,因此它的下一行就像调用该块函数一样执行。

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

答案 2 :(得分: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 {

        }
    }];

如果您想在返回时进行一些UI更改,请从主队列中调用完成块

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