0

好的,伙计们。这可能有点新手,但我很难弄清楚如何在我拥有的 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

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

4

3 回答 3

0

你可能会说把 NSURLConnection 和它的委托方法放在你需要的地方有点过头了,但它绝对是最干净的解决方案。

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

于 2012-11-26T22:24:13.833 回答
0

您可以在连接类中有一个方法,例如 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 中:)但是您需要在任何调用此方法的类中。

于 2012-11-27T00:50:20.260 回答
0

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

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

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

于 2012-11-27T03:19:12.570 回答