在completionHandler语言 - __block中传递一个变量并不能帮助我解决这个问题



我想我需要修改这个方法来返回由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",但我想要正字法。要返回的主要语言。

请注意:我需要有这个方法和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
これは私たちの土地である

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

你需要异步地设置这个变量。最简单的方法是使用块,例如:

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