【问题标题】:How to return string from function after completion block executed?完成块执行后如何从函数返回字符串?
【发布时间】:2016-09-17 06:45:09
【问题描述】:

我正在调用返回字符串类型值的 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;
}

现在在上面的代码中,我想返回翻译后的字符串,但是在执行完成块之后,所以有人建议我吗?

【问题讨论】:

  • 您无法返回值,因为翻译是异步完成的。您需要将完成块传递给此函数并从翻译完成处理程序中调用它

标签: ios iphone function block


【解决方案1】:

不,您不能从街区返回。你必须找到一种不同的方式来做到这一点。

喜欢

-(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】:
    - (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);
                });
    

    【讨论】:

      【解决方案3】:

      当您使用完成块来翻译文本时。该块称为异步。这就是为什么在翻译文本之前调用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);
               }
       }];
      }
      

      如果您有任何疑问,请告诉我。

      谢谢。

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 2022-10-14
        • 1970-01-01
        • 2018-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多