использовать -performSelectorOnThread: withObject: waitUntilDone: . Объект, который вы передаете, будет чем-то, что имеет свойство или другой «слот», в который вы можете поместить возвращаемое значение. Например,
SomeObject* retObject = [[SomeObject alloc] init];
[anotherObject performSelectorOnThread: whateverThread withObject: retObject waitUntilDone: YES];
id retValue = [retObject retValue];
Если вы хотите быть действительно искушенным в этом, вместо передачи объекта класса, который вы определяете, используйте NSInvocation объект и просто вызовите его в другом потоке не вызывайте одну и ту же NSInvocation одновременно для двух потоков), например,
[invocation performSelectorOnMainThread:@selector(invoke) withObject:NULL waitUntilDone:YES];
Редактировать
если вы не хотите ждать завершения обработки в другом потоке и хотите получить возвращаемое значение, вы не можете избежать обратного вызова другого потока в ваш поток. Вы по-прежнему можете использовать вызов, например
[comObject setInvocation: myInvocation];
[comObject setCallingThread: [NSThread currentThread]];
[someObject performSelectorOnMainThread: @selector(runInvocation:) withObject: comObject waitUntilDone: NO];
// in someObject's implementation
-(void) runInvocation: (ComObject*) comObject
{
[[comObject invocation] invoke];
[self perfomSelector: @selctor(invocationComplete:)
onThread: [comObject callingThread]
withObject: [comObject invocation]];
}
Если вам не нравится создавать новый класс для передачи потока и вызова, используйте вместо этого NSDictionary, например,
comObject = [NSDictionary dictionaryWithObjectsAndKeys: invocation, "@invocation" [NSThread currentThread], @"thread", nil];
Будьте осторожны с владением объектом. Различные методы executeSelector ... сохраняют и получатель, и объект до тех пор, пока они не будут выполнены, но при асинхронных вызовах может быть небольшое окно, в котором они могут исчезнуть, если вы не будете осторожны.