вот что я хочу:object-c/iphone: как установить, что все методы какого-либо объекта будут выполняться в определенном потоке?
создать объект, который «живет» в своем потоке, все методы должны выполняться в этом потоке.
т.е.:
// i'm in the main thread
MyClass *myObject = [ [MyClass alloc] init ]; // it creates its own thread
[myObject method1]; // should execute the method1 in myObject's thread
[myObject method2]; // should execute the method2 in myObject's thread
[myobject release]; // should deallocate everything that is used for myObject and remove myObject's thread
я читал о потоках и runloops. Я создал новый поток в методе init
, его точкой входа является метод runloop. Метод runloopMethod просто устанавливает наиболее простые элементы, необходимые для запуска NSRunLoop и запускает его.
aThread = [[NSThread alloc] initWithTarget:self selector:@selector(runloopMethod) object:nil];
[aThread start];
он работал нормально, но когда я вызвать метод (т.е. [myObject method1];
) от основного потока он запускает его на главном потоке, как я это знаю ?, хорошо, потому что method1 выполняет несколько операций, блоки пользовательский интерфейс. Что я сделал, чтобы перенаправить вызов таким образом:
// on MyClass.m
-(void) method1 {
if ([NSThread currentThread] != aThread) {
[self performSelector:@selector(method1) onThread:aThread withObject:nil waitUntilDone:YES];
}else {
// do my stuff
}
это работает, но этот путь ограничивает меня, и у меня есть несколько вопросов к вам:
я понял, что, если я нахожусь в X-thread и вызов метода некоторого объекта, он будет выполнен в X-thread. Я думаю, что вызов метода будет добавлен (не уверен, что это слово) к runloop X-thread. правильно?
Есть ли способ установить это: любой вызов методов моего объекта будет выполняться в потоке объекта? (не делая все это).
также, это правильный способ для того, что я делаю? method1, method2 и т. Д. - это синхронизирующая версия моих функций. Так что они заблокируют пользовательский интерфейс. что «почему я предполагаю, что у другого потока есть путь.
спасибо за чтение !.
кстати. Я не использую GCD, так как мне нужно поддерживать iOS 3
где определяется «runloopMethod»? Я хотел бы сделать то же самое, что вы делаете, но я немного смущен этой частью – abbood