1

这看起来真的很奇怪,所以我怀疑这是一个好习惯,但我正在开发一个旧应用程序,我需要在不完全重新设计整个东西的情况下进行一些更新。

目前,我有一个 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代码,现在单独封装,以便在适当的时候调用它。

但!我需要那个sender

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

- (void) originalToggleBroadcastCode:(UIButton*) sender?

4

2 回答 2

1

要完成您的要求,您可以尝试创建一个接受 UIView 作为参数的 NSOperation 子类。此操作可以执行请求,然后在完成后更新 UIView。(请务必在主线程上进行 UI 更新)。不过,这似乎是一种奇怪的设计模式。

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

于 2013-05-20T15:15:50.177 回答
1

您可以使用非常好的BlocksKit 库,然后您可以执行以下操作:

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

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

    [connection start];
 };
于 2013-05-20T15:24:28.083 回答