2013-07-22 95 views
3

我正在嘗試創建一個以SEL作爲參數並將其傳遞給dispatch_async執行的泛型方法,但我無法如何執行SEL中的傳遞。 任何人都可以幫助我。如何將SEL傳遞給dispatch_async方法

// Test.m 

-(void) executeMe 
{ 
    NSLog(@"Hello"); 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    SEL executeSel = @selector(executeMe); 
    [_pInst Common_Dispatch: executeSel]; 
} 

// Common.m 
-(void) Common_Dispatch:(SEL) aSelector 
{ 
    dispatch_async(iDispatchWorkerQueue, ^(void) { 
     // How to execute aSelector here? 
    }); 
} 

回答

6

您還需要有一個「目標」參數您Common_Dispatch的方法,因爲你需要調用特定對象上的選擇器。

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    SEL executeSel = @selector(executeMe); 
    [_pInst Common_Dispatch:executeSel target:self]; 
} 

- (void)Common_Dispatch:(SEL)aSelector target:(id)target { 
    dispatch_async(iDispatchWorkerQueue, ^(void) { 
     [target performSelector:aSelector]; 
    }); 
} 

BTW - 標準命名約定聲明,方法名稱應以小寫字母開頭,並使用駝峯。你的方法應該是commonDispatch。

+0

+1。準備寫同樣的東西。 –

+0

完美...感謝rmaddy。 – newdev1

0

您只需調用performSelector方法,像這樣:

[self performSelector:aSelector]; 

還有其他有用的替代來performSelector你會發現。

編輯

選擇的目標也已被作爲PARAM傳遞:

// Test.m 

-(void) executeMe 
{ 
    NSLog(@"Hello"); 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    SEL executeSel = @selector(executeMe); 
    [_pInst Common_Dispatch: executeSel target:self]; 
} 

// Common.m 
-(void) Common_Dispatch:(SEL) aSelector target:(id)target 
{ 
    dispatch_async(iDispatchWorkerQueue, ^(void) { 
     [target performSelector:aSelector]; 
    }); 
} 
+1

除選擇器不在'self'外。這是另一類的方法。 – rmaddy

+0

哦,是的,沒有注意到。目標也必須通過。 –

2

或者,您可以使用塊參數,例如,

- (void)commonDispatch:(void (^)(void))block 
{ 
    dispatch_async(iDispatchWorkerQueue, block); 
} 

你會然後調用,作爲:

[_pInst commonDispatch:^{ 
    [self executeMe]; 
}]; 

這樣,您就可以使用此調度程序調用像executeMe它不帶參數,或派遣是需要大量的參數的方法方法,例如:

[_pInst commonDispatch:^{ 
    [self executeOtherMethodForURL:url requestType:type priority:priority]; 
}]; 

或更復雜的情況下,也:

[_pInst commonDispatch:^{ 
    [self executeOtherMethodForURL:url requestType:type priority:priority]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // update my UI to say that the request is done 
    }); 
}];