2014-02-06 2 views
0

NSOperation에서 소켓을 수신하는 iOS 앱을 작성하고 있습니다. 소켓에서 뭔가 읽었을 때 UIViewController 메서드를 호출하여 뷰의 내용을 변경합니다 (일부 레이블의 숨겨진 매개 변수 만 변경). 문제는보기가 즉시 새로 고쳐지지 않는다는 것입니다. 왜 그리고 어떻게 문제를 해결할 수 있습니까? 내 UIViewController에의있는 viewDidLoad에서 보기 iOS 업데이트

: 리스너가 데이터를 수신 할 때

_broadcastQueue = [[NSOperationQueue alloc] init]; 
_broadcastQueue.name = @"broadcastPairing"; 
PairingDevice *broadcast = [[PairingDevice alloc] initWithCode:_code andDelegate:self]; 
[_broadcastQueue addOperation:broadcast]; 

, 나는 전화 : 내의 UIViewController의 방법

[self.delegate setClientConnectedWithSocket:sockTCP andIP:[NSString stringWithUTF8String:inet_ntoa(sin.sin_addr)] andHostname:[NSString stringWithUTF8String:data.machineName]]; 

나는 (지금은) 수행

_codeLabel.hidden = YES; 
    _infoText.hidden = YES; 

    _hostLabel.hidden = NO; 
    _ipLabel.hidden = NO; 
    _ipLabel.text = ip; 
    _hostLabel.text = hostname; 
+2

코드를 표시하십시오. – Apurv

+0

많은 코드가 있습니다. 내 게시물을 편집하여 다시 사용하려고 시도합니다. – bobby

답변

0

당신은 : 그냥 가정,하지만 당신은 메인 쓰레드 내에서 모든 행해져 Yout UI 물건을 할 필요가 그래서, (의도대로) 네트워크 호출이 백그라운드 스레드에서 수행되는 추측
소켓은 메인 쓰레드에서 듣지 않는다.
다음으로, 운전 방식의 주요 큐와 대리인의 전화를 워프보십시오 :

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    [self.delegate setClientConnectedWithSocket:sockTCP andIP:[NSString stringWithUTF8String:inet_ntoa(sin.sin_addr)] andHostname:[NSString stringWithUTF8String:data.machineName]]; 
}]; 

대리인이 그를 호출하기 전에 @selectore에 응답하면 검사로 또한.

+0

이 문제가 해결되었습니다. 하지만 질문이 있습니다. 메모리가 대기열간에 공유되지 않았습니까? – bobby

1

응용 프로그램의 주 스레드에서 해당 코드를 수행하고 있는지 확인하십시오. 아마

dispatch_async(dispatch_get_main_queue(), ^{ 
// Your UI code 
}); 
관련 문제