2014-07-08 1 views
0

completeHandler에서 제공하는 변수를 반환하려면이 메서드를 수정해야한다고 생각합니다. 어떤 몸이라도 올바른 방법으로 어떻게 알 수 있습니까?completionHandler에서 __block 변수를 전달하면 도움이 안됨

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 
これは私たちの土地である 
+0

NSLog (@ "dominant language = % @", orthography.dominantLanguage)를 인쇄하려고하십니까? 맞춤법 검사기에서 인쇄 하시겠습니까? 맞춤법 검사 완료 핸들러에 NSString의 리턴 유형이 있습니까? – jailani

+0

예 반환 유형은 __NSCFConstantString입니다. – user226372

+0

이 모든 문제는 잘못된 것입니다. 결과가 비동기 적으로 획득 될 때 값을 리턴하지 마십시오. 콜백 블록을 사용해야합니다. 이 대답을보십시오. http://stackoverflow.com/questions/24253207/wrapping-blocks-based-api-in-convenience-methods/24253250#24253250 – CrimsonChris

답변

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

성공하지 못함 ... 내 코드는 다음과 같습니다. dispatch_async (dispatch_get_main_queue()^{ \t \t \t \t NSLog (@ "%의 @", [자기 getLanguageOfText : 내용]) \t \t \t \t}); – user226372

+0

성공하지 못함 ... 내 코드 업데이트 – user226372

+0

메소드의 반환 값을 사용하여 결과를 반환 할 수 없으며 _ 반환 할 수 없습니다. 귀하의 방법은 무효를 반환해야합니다. 이 답변은 귀하가 귀하의 응답을받을 때 "응답을 받았습니다"라는 방법을 부르라고 말하려고합니다. 콜백 블록을 선호합니다. 위 내 의견을 참조하십시오. – CrimsonChris