2012-01-26 4 views
0

にメッセージを送る私はかなりのタスクの次のようなものをどのように扱うかについては理解していない:Objective Cのクリエーター

@implementation SomeInterface 

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

質問です - doJobが終了した後、どのようにすることができますMOメッセージを送るバックSomeInterfaceに? NSNotificationCenterを使用する必要がありますか?

答えて

2

をNSNotificationCenterを使用するか、または書くことができます。したがって、たとえば...

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:SomeInterface.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 */ 
} 

-(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_asyncdispatch_get_main_queueの結果を使用して、補完ハンドラがメインスレッド上で確実に行われるようにすることができます。

Joachim Bengtssonがa good introductory guide to blocksと書いています。グランドセントラルディスパッチ(Grand Central Dispatch)とのやり方(そしてGCDの一般的な使い方)に関しては、Apple's documentationが良いです。

+0

ありがとうございますtommy! – Nils

+1

私の名前がグーグルであることは信じられないほど明白です: Pしかし、ジョブを表すオブジェクトがある場合、多分NSOperationQueueはGCDより良くフィットします。 – nevyn

0

はい、あなたはおそらく最も簡単な方法は、それが完了した時点で何をすべきかを指示することdoJobにブロックを渡すことです、iOSの4のとおり、コールバックメソッド

+2

通知、委任パターンまたはコールバックブロックは、選択してください。 – mit3z

+0

私は既にNSNotificationCenterでこれを行っていますが、ここではコールバックが良いと思います。コールバックを行う方法を理解できません( – Nils