如何将参数传递给委托回调方法?

时间:2013-05-20 14:56:08

标签: ios objective-c asynchronous parameters delegates

这看起来很奇怪,所以我怀疑这是一个很好的做法,但我正在开发一个旧的应用程序,我需要做一些更新,而不是完全重新设计整个事情。

目前,我有一个UIButton,其出口为

- (IBAction) toggleBroadcast:(UIButton*) sender 
{
   // configure and start video capture
}

但是我正在尝试实现远程配置,它使用设备ID调用php脚本并返回(解析为JSON)NSDictionary,它被加载到静态配置类中。

由于网络需要异步委托方法和我的 // configure and start video capture代码依赖于网络检索的数据,我必须使我的toggleBroadcast函数看起来像:

- (IBAction) toggleBroadcast:(UIButton*) sender 
    {
       // get identifier, fill request...
       // NSURLConnection* connection = [NSURLConnection connectionWithRequest:request
                                                                      delegate:self];
    }

然后connectionDidFinishLoading委托方法调用我原来的toggleBroadcast代码,该代码现在单独封装,因此可以在适当的时候调用它。

BUT!我需要sender

那么如何将sender作为参数发送到我的委托方法,以便将其发送给我的新

- (void) originalToggleBroadcastCode:(UIButton*) sender

2 个答案:

答案 0 :(得分:1)

要完成你所要求的,你可以尝试创建一个接受UIView作为参数的NSOperation子类。此操作可以执行请求,然后在完成后更新UIView。 (确保在主线程上进行UI更新)。这看起来像是一种奇怪的设计模式。

就个人而言,我会让我的视图控制器订阅通知,然后在下载完成后发出通知。您可以在存储在NSNotification对象中的userInfo字典中存储有关操作成功或失败的信息,并进行相应的响应。同样,请务必在主线程上发送完成通知。

答案 1 :(得分:1)

您可以使用非常好的BlocksKit library,然后允许您这样做:

- (IBAction) toggleBroadcast:(UIButton*) sender 
{
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request];

    connection.successBlock = ^(NSURLConnection *connection, NSURLResponse *response, NSData *responseData){
         [self originalToggleBroadcastCode:sender];

    [connection start];
 };