2016-09-17 55 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); 
      });