我在尝试为 NSURLConnection 请求创建自定义 URLConnectionDataDelegate 时遇到困难。问题是我可以创建一个实现委托协议的类并发出请求:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:myDelegate];
但是在委托函数中,如(void)connectionDidFinishLoading:(NSURLConnection *)connection
,我必须修改一些UI元素,我不知道该怎么做。
答案 0 :(得分:1)
如果您有一个实现NSURLConnectionDelegate
协议的专用类(不是UIViewController类),则不应修改connectionDidFinishLoading:
方法中的UI元素。此方法用于“连接”类的“内部”使用。
您需要的是从“连接”对象获取请求的最终结果的方法。也就是说,响应数据或 - 可能 - 错误。
实现此目的的一种方法是在“连接”类中提供一个带有完成块的属性,当连接完成时,您的类将调用此块。
typedef void (^completion_block_t)(id result);
@property (nonatomic, copy) completion_block_t completionHandler;
然后,无论何时连接完成(无论出于何种原因),都会使用结果调用块,该结果是响应数据(可能是包含累积数据块的NSMutableData
)或NSError
对象您从连接获得或自己创建的 - 例如,当您没有获得正确的内容类型或连接实际完成但状态代码并不意味着您的应用程序逻辑中的成功请求。
如何在View Controller中使用它的示例:
// somewhere in your UIViewController:
MyConnection* con = [[MyConnection alloc] initWithRequest:request];
__weak MyViewController* weakSelf = self; // idiom to avoid circular references
con.completionHandler = ^(id result){
if (![result isKindOfClass:[NSError error]]) {
// do something with the response data:
NSString* string = [[NSString alloc] initWithData:result
encoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
// UIKit methods:
weakSelf.myLabel.text = string;
});
}
else {
// Error
}
};
// Start the connection:
[con start];
答案 1 :(得分:0)
您可以将视图控制器设置为委托并修改回调中的UI元素,也可以在发生更新时让自定义委托对象向视图控制器发送消息。后者可以使用KVO /绑定,通知,委托,块或其他方式完成。