在completionHandler - __block中传递一个变量没有帮助我

时间:2014-07-08 03:22:45

标签: objective-c cocoa localization objective-c-blocks

我认为我需要修改此方法以返回由completionHandler提供的变量 - 任何正文我知道如何以正确的方式执行此操作?

dispatch_async(dispatch_get_main_queue(), ^{
    NSLog(@"%@", [self getLanguageOfText:content]);
});



- (NSString *)getLanguageOfText:(NSString *)fewSentences {
__block NSString *returnLanguageString = @"Navi";

NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
[spellChecker setAutomaticallyIdentifiesLanguages:YES];
NSString *spellCheckText = fewSentences;

[spellChecker requestCheckingOfString:spellCheckText
                                range:(NSRange) {0, [spellCheckText length] }
                                types:NSTextCheckingTypeOrthography
                              options:nil
               inSpellDocumentWithTag:0
                    completionHandler: ^(NSInteger sequenceNumber, NSArray *results, NSOrthography *orthography, NSInteger wordCount) {
    //NSLog(@"dominant language = %@", orthography.dominantLanguage);
    //language = @"Hi";

    NSLog(@"dominant language = %@", orthography.dominantLanguage);

    returnLanguageString = orthography.dominantLanguage;
}];

return returnLanguageString;
}

但returnLanguageString总是“Navi”但我想要返回orthography.dominantLanguage。

请注意:我需要使用此方法和NSSpellChecker代码

我上面提到的几句话就像这样,它存储在NSString中:

40
00:02:59.000 --> 00:03:01.000
彼らは私達にメッセージを送った

41
00:03:01.000 --> 00:03:03.000
彼らは彼らが望むものは何でも取ることができる

42
00:03:04.000 --> 00:03:05.000
我々は彼らにメッセージを送信します。

43
00:03:07.000 --> 00:03:09.000
これは私たちの土地である

1 个答案:

答案 0 :(得分:1)

您的块正在异步运行。这意味着它在函数返回之前不会完成执行 - 并且返回值不变。

您需要异步处理设置此变量。最简单的方法是使用一个块,例如:

- (void)getLanguageOfText:(NSString *)fewSentences {

    NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
    [spellChecker setAutomaticallyIdentifiesLanguages:YES];
    NSString *spellCheckText = fewSentences;

    [spellChecker requestCheckingOfString:spellCheckText
                                    range:(NSRange) {0, [spellCheckText length] }
                                    types:NSTextCheckingTypeOrthography
                                  options:nil
                   inSpellDocumentWithTag:0
                        completionHandler: ^(NSInteger sequenceNumber, NSArray *results, NSOrthography *orthography, NSInteger wordCount) {

        NSString * returnLanguageString = orthography.dominantLanguage;

        // handle the result somehow on the main queue
        dispatch_async(dispatch_get_main_queue() ^{
            [self doSomethingWithResult:returnLanguageString];
        });
    }];
}