NSThread чтение родительских иваров? - PullRequest
1 голос
/ 15 ноября 2011

Я отключаю новый NSThread с помощьюObject: self, чтобы поток мог вызывать основной поток как делегат.Тем не менее, мне также нужен новый поток, чтобы иметь возможность читать некоторые значения в родительском.С NSThread я могу передать только один объект с помощьюObject, и я использую это для передачи себя из-за методов делегата.Есть ли способ, которым мой новый поток может читать значения из своего родителя?Возможно, через сам объект, который передается ему?

Вот где я запускаю поток:

MulticastDaemon* multicastDaemon = [[MulticastDaemon alloc] init];
[NSThread detachNewThreadSelector:@selector(doWorkWithDelegate:)
                         toTarget:multicastDaemon
                       withObject:self];

Я хочу передать многоадресный IP-адрес и номер порта демону, чтобы онзнает, что слушать, но я не уверен, как получить эти значения в multicastDaemon.

Как multicastDaemon может получить доступ к этим значениям?

Ответы [ 3 ]

1 голос
/ 15 ноября 2011

Вам лучше использовать подкласс NSOperation, а затем добавить его в NSOperationQueue. Вы можете добавить любые дополнительные параметры к этому подклассу операции.

Есть еще одно преимущество NSOperation по сравнению с NSThread. NSOperation и NSOperationQueue построены поверх GCD , и многопоточность гораздо более оптимальна, чем NSThread.

Но вы также можете просто добавить некоторые свойства в свой MulticastDaemon.

1 голос
/ 15 ноября 2011

Да, вы можете получить доступ к переменным, сделав их свойства, а затем сделать что-то вроде этого (вы не говорите, из какого класса сделан этот вызов, поэтому я назвал его MyClass):

@implementation MulticastDaemon

-(void) doWorkWithDelegate:(MyClass*) cls
{
    cls.value1 = 12;
    ...
}

...

@end

РЕДАКТИРОВАТЬ: Исправлена ​​реализация.

0 голосов
/ 15 ноября 2011

Вы можете немного изменить интерфейс MulticastDaemon, чтобы установить делегата перед созданием нового потока.Затем вы освобождаете слот withObject:, чтобы передать что-то еще.Это позволяет избежать доступа к переменным между потоками.

Либо:

 MulticastDaemon* multicastDaemon = [[MulticastDaemon alloc] initWithDelegate:self];
[NSThread detachNewThreadSelector:@selector(doWorkWithInformation:)
                         toTarget:multicastDaemon
                       withObject:operatingInfo];

, либо

MulticastDaemon* multicastDaemon = [[MulticastDaemon alloc] init];
[multicastDaemon setDelegate:self];

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

...