Создание собственного NSRunLoop - PullRequest
4 голосов
/ 18 ноября 2009

Я начинаю понимать RunLoop как аналог Очереди событий в Java. Wgat, который я сейчас пытаюсь сделать, просто для лучшего понимания, это создать фоновый поток в приложении, которое запускает собственный RunLoop. Я дошел до этого в примере ViewController, а затем застрял:

@implementation iPhoneRunLoopsViewController

-(void) workerMain
{
  [[NSRunLoop currentRunLoop] run];
}

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
{
  worker = [[NSThread alloc] initWithTarget:self selector:@selector(workerMain) object:nil];
  [worker start];
}

- (IBAction)go:(id)sender {

}

Согласно документам Apple:

Перед запуском цикла выполнения на вторичный поток, вы должны добавить в хотя бы один входной источник или таймер к нему. Если цикл выполнения не имеет источники для мониторинга, он выходит сразу, когда вы пытаетесь запустить его. Примеры того, как добавить источники в цикл выполнения, см. «Настройка цикла выполнения» Источники «.

Я пытаюсь запустить пользовательский поток в моем методе init, который будет использоваться для произвольной работы. Я хотел бы отправить работу из метода "go" в этот произвольный поток. Чего я не знаю, так это как отправить работу в RunLoop из чего-то вроде метода go, который будет связан с кнопкой Go. Допустим, я хочу считать от 1 до 10 с небольшой задержкой между каждым шагом из этого вторичного потока. Я бы добавил код в метод go, чтобы запланировать работу, используя RunLoop вторичного потока, выполняя что-то вроде executeOnThread ... Кеширую ли я ссылку на этот цикл выполнения при запуске? Как мне запустить цикл выполнения и заставить его ждать работы? (Как мне настроить цикл выполнения с пользовательским источником ввода?) Видимо, метод run просто вернется, если для цикла выполнения нет таймера или источника ввода. Я видел документацию, в которой обсуждается, как создавать собственные источники с использованием функций CF, но я не вижу четкого примера того, как все это объединяется. Может кто-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

Чтобы продолжить, вызовите CFRunLoopRun $ или прикрепите таймер CF или NS

Если вы хотите кэшировать цикл выполнения (для последовательных вызовов вы можете). Возможно, было бы лучше начать с создания подкласса NSThread (ваш рабочий var) и предоставить ему что-то, что нужно сделать, и что-то, о чем нужно сообщить, когда закончите (это то, где начинаются ваши настоящие многопоточные проблемы). Таким образом, цикл выполнения подключает таймер, работает до завершения и спит, если он запланирован на продолжение. Я надеюсь, что это имеет смысл, как обзор.

Кешировать ли ссылку на этот цикл выполнения при запуске?

Это действительно не нужно, если вам нужно только из рабочего потока.

Как запустить цикл выполнения и заставить его ждать работы?

Вы запускаете его, начиная поток и обращаясь к нему из потока. Продолжайте работать, сказав ему запустить (то есть в режиме) или подключив таймер.

0 голосов
/ 18 ноября 2009

Читали ли вы раздел о циклах выполнения в Руководстве по программированию Apple Threading ? Это выглядит как хорошее место для начала. В нем рассматриваются как и почему циклы выполнения, а также входные источники и различные варианты -performSelector (один из основных способов взаимодействия потоков между собой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...