Вы можете использовать блок:
typedef void (^Callback)(NSArray*);
[somebody doSomethingAndPerform:^(NSArray *data) {
// do whatever you want with the data
}];
- (void) doSomethingAndPerform: (Callback) callback
{
NSArray *data = …;
callback(data);
}
Это очень гибкий, но, возможно, слишком сложный.Если вы хотите что-то более простое, вы всегда можете просто передать селектор и цель, как вы думали:
[somebody doSomethingAndCall:@selector(dataReceiver:) on:self];
- (void) doSomethingAndCall: (SEL) selector on: (id) target
{
NSArray *data = …;
[target performSelector:selector withObject:data];
}
Или вы можете использовать протокол:
@protocol DataConsumer
- (void) handleData: (NSArray*) data;
@end
// this class has to implement DataConsumer
[somebody doSomethingAndNotify:self];
- (void) doSomethingAndNotify: (id <DataConsumer>) consumer
{
NSArray *data = …;
[consumer handleData:data];
}
немного тяжелый вес, но преимущество в том, что компилятор ловит некоторые ошибки для вас.Там также больше связи, но это далеко не проблема.