Передача данных между объектами / потоками в Какао - PullRequest
1 голос
/ 07 сентября 2011

Я создаю новый поток из контроллера следующим образом:

[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:nil];

Каков наилучший способ вызова методов на контроллере из нового объекта thread / movieMaker?

Ответы [ 3 ]

2 голосов
/ 07 сентября 2011

В этом случае вы, вероятно, захотите использовать шаблон делегата. В файле .h вашего класса создателя фильма:

@protocol MovieMakerDelegate;

@interface MovieMaker : NSObject
{
    id<MovieMakerDelegate> delegate;

    ...
}

@property (nonatomic, assign) id<MovieMakerDelegate> delegate;

...

@end

@protocol MovieMakerDelegate <NSObject>
- (void)movieMaker:(MovieMaker *)maker didSomething:(id)result;
@end

... и в .m:

@implementation MovieMaker

@synthesize delegate;

...

- (void)makeMovie
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    ...

    [self performSelectorOnMainThread:@selector(notifyDelegateOfDoingSomethingWithObject:) withObject:someObject waitUntilDone:YES];

    [pool release];
}

- (void)notifyDelegateOfDoingSomethingWithObject:(id)someObject
{
    [self.delegate movieMaker:self didSomething:someObject];
}

...

@end

Затем в заголовке вашего контроллера объявите, что он поддерживает протокол MovieMakerDelegate, например:

@interface MyController : Whatever <MovieMakerDelegate>

и в вашем .m, прежде чем позвонить на -detachNewThreadSelector:etc:, позвоните movieMaker.delegate = self;. Реализуйте метод -movieMaker:didSomething: на вашем контроллере, и все готово.

2 голосов
/ 07 сентября 2011

Вы можете передать экземпляр контроллера вашему методу makeMovie с параметром withObject.

[NSThread detachNewThreadSelector:@selector(makeMovie) toTarget:movieMaker withObject:self];

Вы также можете использовать шаблон, подобный одиночному, если это применимо, для получения экземпляра контроллераиз нити.

1 голос
/ 07 сентября 2011

Используйте performSelectorOnMainThread:withObject:waitUntilDone: (или аналогичные performSelector:... методы), это самый простой способ.

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