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