【问题标题】:How to trigger delegate méthodes in helpclass如何在帮助类中触发委托方法
【发布时间】:2012-11-26 21:57:15
【问题描述】:

好吧,伙计们。这可能有点新手,但我很难弄清楚如何在我拥有的 helperclass 中触发 NSURLConnection 委托。

问题如下:

我有一个 ViewController 将执行登录到 Web 服务。我从我的角度设置了“连接”对象。

在连接类中我设置了一个请求对象 (NSMutableURLRequest *request)

然后我设置连接。

NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
if (connection) {

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    dataWebService = [NSMutableData data];
    [connection start];
} else {
    // Inform the user that the connection failed.
}

线索是,当我在视图控制器内的 ViewController 类(放置所有委托)中执行此操作时,委托会自动触发,我可以登录到 Web 服务。

如何从“连接类”中的视图控制器调用这些委托?

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connectionDidFinishLoading:(NSURLConnection *)connection

我需要这个,因为我将使用这个连接类从其他视图执行其他任务。在我拥有的每一个视图中都写这些代表有点矫枉过正。

【问题讨论】:

    标签: iphone objective-c xcode delegates


    【解决方案1】:

    您可以在连接类中有一个方法,例如 downloadFromURL:sender:,您可以从任何类调用该方法。当你调用它时,你提供 URL 并提供 self 作为 sender 参数。连接类将有一个属性,例如发送对象,您可以将其设置为发件人:

    -(void)downloadFromURL:(NSURL *) url sender:(id) sender {
        _receivedData = [[NSMutableData alloc] init];
        sendingObject = sender;
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url cachePolicy: NSURLCacheStorageAllowedInMemoryOnly timeoutInterval: 30.0];
        [NSURLConnection connectionWithRequest:request delegate:self];
    }
    

    在这个类中实现所有的委托方法,在 connectionDidFinishLoading: 方法中,你可以这样做:

    -(void) connectionDidFinishLoading:(NSURLConnection *)connection {
        [sendingObject performSelector:@selector(resultFromDownloader:) withObject:_receivedData];
    }
    

    这将允许您处理数据(在 resultFromDownloader 中:),但是您需要在任何调用此方法的类中。

    【讨论】:

      【解决方案2】:

      您可能会说将 NSURLConnection 及其委托方法放在您需要的任何地方有点过头了,但它绝对是最干净的解决方案。

      使用委托时,您应该有 1 个发送者(在本例中为 NSURLConnection)和 1 个接收者(在本例中为 ViewController)。您想要做的是不断更改该接收器或拥有多个接收器,我不完全确定。你可以做。如果您想重用 NSURLConnection (从而保留 1 个接收器),您可以简单地将其委托更改为当时需要它的任何类。这可能很难跟踪。如果您只想将 1 个连接的结果传递给其他类(多个接收器),您可以实现一次委托方法并使用 NSNotifications 将结果发送到注册为观察者的每个类。但是通知不能返回值。

      【讨论】:

        【解决方案3】:

        完全避开代表怎么样?在 iOS5 或更高版本中,您可以运行连接并在一个块中处理响应,如下所示:

        [NSURLConnection sendAsynchronousRequest:request 
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                // handle response, data and error here
            }];
        

        使用此方法,您可以让一个类回答 NSURLConnection 并让另一个类使用块运行它。或者,您可以创建一个类来创建连接并使用作为参数传递的块来运行它。

        【讨论】:

        • 谢谢。我会尝试不同的解决方案。但是使用块的想法听起来是个不错的方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多