Цель C отправить сообщение создателю - PullRequest
0 голосов
/ 26 января 2012

Я не совсем понимаю, как справиться с задачей следующего типа:

@implementation SomeInterface

-(void)DoSomething
{
     MyObj * mo = [MyObj new];
     [mo doJob];
}
end

Вопрос в том, как мо- жет отправить сообщение обратно SomeInterface после завершения doJob?Должен ли я использовать NSNotificationCenter?

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Начиная с 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 хороша.

0 голосов
/ 26 января 2012

да, вы можете использовать NSNotificationCenter или написать метод обратного вызова

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