2012-03-07 6 views
0

되고, 나는 싶습니다, 다음 Java 의사와 같은 방식으로 기능 오브젝티브 C 코코아, 프로그램 뭔가 : 즉코코아 스레드는 한마디로 심술 궂은

public class MainClass 
{ 
    public void mainmethod() //Gets called at start of program 
    { 
     UILabel label = CreateAButton(); 
     new DaemonClass(label).start(); 
     //Do things without being interrupted by the Daemon class sleeping or lagging 
    } 
} 

public class DaemonClass extends Thread 
{ 
    public UILabel label; 
    public DaemonClass(UILabel lbl) 
    { 
     setDaemon(true); 
     label = lbl; 
    } 

    public void run() 
    { 
     int i = 0; 
     while(true) 
     { 
      i++; 
      i = i%2; 
      UILabel.setText("" + i); 
      Thread.sleep(1000); 
     } 
    } 
} 

... 내가 좋겠를 메인 스레드를 포함하여 다른 스레드의 진행이나 속도를 방해하지 않고 원하는 속도로 느려질 수있는 데몬 스레드를 생성하려고합니다.

나는 Dispatch QueueNSThread 같은 것을 사용하려고 시도했다.

이들 중 하나를 사용할 때 라벨의 텍스트를 1에서 0으로 무한대로 토글 한 간단한 라벨 체인저 스레드를 만들려고했습니다. 사용자 인 나에게는 시동시 무작위로 선택되는 1 또는 0 중 하나에서 지속적으로 잠긴 것처럼 보였습니다.

이들 중 하나를 사용하고 [NSThread sleepForTimeInterval:1];을 사용하려고 시도하면 스레드는 sleepForTimeInterval 호출 이후에 모두 함께 실행을 중지합니다.

또한, 문서를 다듬어서 [NSThread sleep...이 잠든 동안 실행 루프가 호출되지 않는다는 사실을 확인했습니다.

도움이된다면 - (void)viewDidLoad; 메서드에서 스레드를 호출하고있었습니다.

당신에 대한 내 질문은 :

내 스레드 충돌에서 [NSThread sleepForTimeInterval:1];을 중지, 또는 어떻게 : (! 바람직 코드 블록) 는 어떻게하는 방법 또는 코드 블록을 호출 데몬 스레드를 시작합니까

PS 만약 차이가 있다면, 이것은 iOS 용입니다

답변

1

당신이 보았던 문제의 이유는 UIKit이 스레드 안전성이 없다는 것입니다. 즉, 메인 스레드에서 UILabel 만 사용할 수 있습니다. 당신이 백그라운드 스레드에서 UIKit을 관리 할 수있는 모든의

dispatch_async(dispatch_get_main_queue(), ^{ 
    myLabel.text = @"whatever"; 
}); 
+0

감사합니다. 디스패치 대기열을 사용하고 레이블 설정 방법을 사용하면 매력처럼 작동했습니다! 당신까지 엄지 손가락 :) –

0

첫째 : 그 작업을 수행하는 가장 쉬운 방법은 GCD를 사용하여 (주 스레드와 관련된) 주요 큐에 블록을 대기열에하는 것입니다. 텍스트를 UILabel로 설정하려면 메인 스레드를 사용해야합니다.

달성하려는 작업 유형으로 판단 할 때 NSTimer를 사용해야합니다. 언제 호출해야하는지 시간 간격을 설정하고 언제든지 중지하고 다시 시작할 수 있습니다.

@property (strong, nonatomic) NSTimer *timer; //in your .h file 

- (void)startChangingLabelText { 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
               target:self 
               selector:@selector(checkTime:) 
               userInfo:nil 
               repeats:YES]; 
} 

- (void)stopChangingLabelText { 
    [timer invalidate], self.timer = nil; 
} 

    - (void)checkTime:(NSTimer *)timer { 
     int rand = arc4random() % 2; 
     if (rand) 
     label.text = @"true"; 
     else 
     label.text = @"false"; 
    }