Какао-нити, являющиеся губительными - PullRequest
0 голосов
/ 07 марта 2012

Короче говоря, я хотел бы, чтобы в Objective-C, какао, программировалось что-то, что функционирует так же, как следующий псевдокод Java:

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 Queue, а также NSThread.

При использовании любого из них я пытался создать простой поток смены меток, который переключал бы текст метки от 1 до 0 на неопределенное время. Мне показалось, что пользователь постоянно блокируется на 1 или 0, случайно выбранных при запуске.

При использовании любого из них и попытке использовать [NSThread sleepForTimeInterval:1]; поток прекращает выполнение всего вместе после вызова sleepForTimeInterval.

Кроме того, просмотрев документы, я понял, что цикл выполнения не вызывается, пока [NSThread sleep... спит!

Если это поможет, я вызывал свои темы из метода - (void)viewDidLoad;.

Мой вопрос к вам:

Как мне остановить [NSThread sleepForTimeInterval:1]; от разрушения моей темы ИЛИ: Как запустить поток демона, который вызывает метод или блок кода (предпочтительно блок кода!)

P.S. если это имеет какое-то значение, это для iOS

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Причина проблем, с которыми вы столкнулись, заключается в том, что UIKit не является поточно-ориентированным, то есть вы можете использовать UILabel только из основного потока.Самый простой способ сделать это - поставить блок в основную очередь (которая связана с основным потоком) с помощью GCD:

dispatch_async(dispatch_get_main_queue(), ^{
    myLabel.text = @"whatever";
});
0 голосов
/ 07 марта 2012

Прежде всего, вы не можете управлять UIKit в фоновых потоках. Чтобы установить текст в 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";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...