Начиная с iOS 4, вероятно, самое простое - передать блок на doJob
, который определяет, что он должен делать после завершения.Так, например ...
MyObj.h:
// create a typedef for our type of completion handler, to make
// syntax cleaner elsewhere
typedef void (^MyObjDoJobCompletionHandler)(void);
@interface MyObj
- (void)doJobWithCompletionHandler:(MyObjDoJobCompletionHandler)completionHandler;
@end
MyObj.m:
- (void)doJobWithCompletionHandler:(MyObjDoJobCompletionHandler)completionHandler
{
/* do job here ... */
// we're done, so give the completion handler a shout.
// We call it exactly like a C function:
completionHandler();
/* alternatives would have been to let GCD dispatch it,
but that would lead to discussion of GCD and a bunch of
thread safety issues that aren't really relevant */
}
В пределах SomeInterface.m:
-(void)DoSomething
{
MyObj * mo = [MyObj new];
[mo doJobWithCompletionHandler:
^() // you can omit the brackets if there are no parameters, but
// that's a special case and I don't want to complicate things...
{
NSLog(@"whoop whoop, job was done");
// do a bunch more stuff here
}
];
}
Я предполагаю, что на самом деле вы делаете что-то, что заканчивается в DoJob
асинхронностью (иначе вы просто подождете, пока метод не вернется);в этом случае вы можете использовать GCD dispatch_async
с результатом dispatch_get_main_queue
, чтобы гарантировать, что обработчик завершения возвращается в основной поток.
Йоахим Бенгтссон написал хорошее вводное руководство поблоки .Что касается того, как они взаимодействуют с Grand Central Dispatch (и как использовать GCD в целом), Документация Apple хороша.