2010-06-08 54 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];