2010-06-08 53 views
2

我有一個「BSjax」類,我寫了這個類讓我使用ASIHTTPRequest類獲取json結果集等服務器的異步調用。我把它使得BSjax類解析我的服務器的JSON響應,然後將控制傳遞迴通過該呼叫的主叫視圖控制器:通過objective-c選擇器回調

[[self delegate] performSelectorOnMainThread:@selector(bsRequestFinished:) withObject:self waitUntilDone:YES]; 

...其中「bsRequestFinished」是在調用視圖中的回調方法控制器。這一切都工作得很好,直到我意識到有些頁面需要進行不同類型的請求...即,我希望根據請求的類型,在該回調函數中執行不同類型的事情。

對我來說,似乎能夠將不同的回調函數名稱傳遞給我的BSjax類將是最乾淨的修復程序......但我遇到了麻煩(我甚至不確定是否有可能)傳遞一個變量保存回調函數的名稱,然後像這樣的東西代替上面的電話:

[[self delegate] performSelectorOnMainThread:@selector(self.variableCallbackFunctionName) withObject:self waitUntilDone:YES]; 

...其中「self.variableCallbackFunctionName」由調用視圖控制器設置時,它調用BSjax作出新的要求。

這甚至可能嗎?如果是這樣,建議?如果沒有,替代方案?

編輯:請注意,無論我到達的修復將需要考慮到這個類是異步請求的現實......所以我需要確保回調函數處理正確綁定到特定的請求。因爲我不能依靠FIFO處理順序。

編輯2:看起來像傳遞SEL類型變量是要走的路?我現在與之戰鬥的是找出將它保存爲BSjax類的保留屬性的語法。

回答

2

variBkecallbackfunctionname是什麼類型的變量?一個NSString?如果是這樣,你可能會想要這樣的東西:

[[self delegate] performSelectorOnMainThread:NSSelectorFromString(self.variableCallbackFunctionName) withObject:self waitUntilDone:YES]; 

我在一個iPad,所以我不能測試這個,但試試看。

編輯:如果variableCallbackFunctionName不是一個nsstring,最簡單的方法可能是,如果我理解你的問題。

編輯2:文檔對於那些已經http://developer.apple.com/mac/library/iPad/index.html#documentation/cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html%23//apple_ref/c/func/NSSelectorFromString

+0

不錯...ü的男人!甚至不知道那個NSSelectorFromString函數。完美地工作! – codemonkey 2010-06-08 22:59:31

3

您可以繞過選擇作爲SEL值。例如:

SEL oneSelector = @selector(bsRequestFinished:); 
SEL anotherselector = @selector(somethingElse:); 
NSString *nameOfSelector = askUserForSelectorName(); 
SEL dynamicSelector = NSSelectorFromString(nameOfSelector); 

因此,只要您的一個variableCallbackFunctionName SEL和它甚至比簡單你希望:

[[self delegate] performSelectorOnMainThread:self.variableCallbackFunctionName withObject:self waitUntilDone:YES];