设计思路
- 定义协议:创建一个协议,用于声明网络请求完成后传递数据给视图控制器的方法。
- 网络请求类:在网络请求类中定义一个代理属性,类型为上述定义的协议。当网络请求完成时,调用代理方法传递数据。
- 视图控制器:视图控制器遵循该协议,实现协议方法以处理接收到的数据并进行展示。同时,将自身设置为网络请求类的代理。
关键代码片段(以Swift为例)
- 定义协议
protocol NetworkRequestDelegate {
func networkRequestDidFinish(_ request: NetworkRequest, withData data: Data?)
}
- 网络请求类
class NetworkRequest {
var delegate: NetworkRequestDelegate?
func startRequest() {
// 模拟网络请求
DispatchQueue.global().asyncAfter(deadline: .now() + 2) { [weak self] in
let mockData = "Mock response data".data(using: .utf8)
self?.delegate?.networkRequestDidFinish(self!, withData: mockData)
}
}
}
- 视图控制器
class ViewController: UIViewController, NetworkRequestDelegate {
let networkRequest = NetworkRequest()
override func viewDidLoad() {
super.viewDidLoad()
networkRequest.delegate = self
networkRequest.startRequest()
}
func networkRequestDidFinish(_ request: NetworkRequest, withData data: Data?) {
if let data = data, let text = String(data: data, encoding: .utf8) {
print("Received data: \(text)")
// 在这里进行数据展示相关操作,比如更新UI
}
}
}
关键代码片段(以Objective - C为例)
- 定义协议
@protocol NetworkRequestDelegate <NSObject>
- (void)networkRequestDidFinish:(NetworkRequest *)request withData:(NSData *)data;
@end
- 网络请求类
@interface NetworkRequest : NSObject
@property (nonatomic, weak) id<NetworkRequestDelegate> delegate;
- (void)startRequest;
@end
@implementation NetworkRequest
- (void)startRequest {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *mockData = @"Mock response data";
NSData *data = [mockData dataUsingEncoding:NSUTF8StringEncoding];
[self.delegate networkRequestDidFinish:self withData:data];
});
}
@end
- 视图控制器
@interface ViewController : UIViewController <NetworkRequestDelegate>
@property (nonatomic, strong) NetworkRequest *networkRequest;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.networkRequest = [[NetworkRequest alloc] init];
self.networkRequest.delegate = self;
[self.networkRequest startRequest];
}
- (void)networkRequestDidFinish:(NetworkRequest *)request withData:(NSData *)data {
NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Received data: %@", text);
// 在这里进行数据展示相关操作,比如更新UI
}
@end