NSProxy, messaging,
многопоточность и
асинхронность в ObjC
Cyril @notorca Lashkevich
wtorek, 10 września 13
Slide 2
Slide 2 text
"All problems in computer science can be
solved by another level of
indirection..."
David Wheeler
wtorek, 10 września 13
Slide 3
Slide 3 text
"All problems in computer science can be
solved by another level of
indirection..."
David Wheeler
"...except for the problem of too many
layers of indirection."
Kevlin Henney
wtorek, 10 września 13
Slide 4
Slide 4 text
Задача
Прозрачно пересылать вызовы методов обекта (например
делегата) в другой поток
wtorek, 10 września 13
Slide 5
Slide 5 text
Задача
Прозрачно пересылать вызовы методов обекта (например
делегата) в другой поток
[obj performSelector:@selector(doThing:)
onThread:thread
withObject:param
waitUntilDone:NO];
wtorek, 10 września 13
Slide 6
Slide 6 text
Задача
Прозрачно пересылать вызовы методов обекта (например
делегата) в другой поток
[obj performSelector:@selector(doThing:)
onThread:thread
withObject:param
waitUntilDone:NO];
wtorek, 10 września 13
Slide 7
Slide 7 text
Задача
Прозрачно пересылать вызовы методов обекта (например
делегата) в другой поток
[obj performSelector:@selector(doThing:)
onThread:thread
withObject:param
waitUntilDone:NO];
[obj doThing:param];
wtorek, 10 września 13
Slide 8
Slide 8 text
NSProxy
Абстрактный класс
Реализует протокол NSObject
Минимальная реализация требует переопределения
2х методов
- (void)forwardInvocation:(NSInvocation *)
invocation
- (NSMethodSignature *)
methodSignatureForSelector:(SEL)aSelector //
Всегда возвращает результат
wtorek, 10 września 13
Slide 9
Slide 9 text
Интерфейс
@interface ThreadProxy : NSProxy
@property (weak) id target;
- (id)initWithTarget:(id)target
thread:(NSThread *)thread
@end
wtorek, 10 września 13
Slide 10
Slide 10 text
Приватная часть интерфейса
@interface ThreadProxy () {
@protected
NSThread *_thread;
id _target;
Class _targetClass;
}
- (void)_invokeInvocation:(NSInvocation *)invocation;
@end
wtorek, 10 września 13
NSInvocation
Вызов метода "замороженный" в виде объекта
target, selector и параметры могут быть
изменены
Вызов можно делать сколько угодно раз
Не для vararg и union параметров
wtorek, 10 września 13