如何触发帮助类别中的委托方法

问题描述:

Okey伙计。这可能有点新手,但是我很难弄清楚如何在我拥有的帮助类中触发NSURLConnection委托。如何触发帮助类别中的委托方法

的问题是如下:

我有一个将执行登录Web服务的视图控制器。我从我的视图中设置“连接”对象。

在连接-I类设置一个请求对象(NSMutableURLRequest *请求)

然后我建立的连接。

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. 
} 

的线索是,我这样做的视图控制器类时(将所有代表)我的视图控制器内,则代表自动触发,我可以登录到Web服务。

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

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

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

我需要这个,因为我将使用此连接类来执行其他视图的其他任务。在我所有的观点中写这些代表会有点矫枉过正。

您可以在连接类中使用类似downloadFromURL:sender:的方法,您可以从任何类中调用该方法。当你调用它的时候,你提供了URL并提供self作为发送者参数。连接类将有一个属性,说sendingObject,你会设置为发件人:

-(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 :)中,但是您需要在任何调用此方法的类中使用。

你可能会说把NSURLConnection及其委托方法放在任何你需要的地方是矫枉过正的,但它绝对是最干净的解决方案。

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

如何完全避免代表?在iOS5的或更高版本,可以运行连接并处理块的响应,这样的:

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

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

+0

谢谢。我会尝试不同的营养。但使用块的想法听起来像是一个很好的做法。 –