MST

星途 面试题库

面试题:Objective-C Protocol的代理模式应用

假设你正在开发一个视图控制器(ViewController),它需要和一个网络请求类(NetworkRequest)进行交互。请使用Protocol和代理模式实现以下功能:网络请求完成后,将数据传递给视图控制器进行展示。请详细说明设计思路,并给出关键代码片段。
45.9万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义协议:创建一个协议,用于声明网络请求完成后传递数据给视图控制器的方法。
  2. 网络请求类:在网络请求类中定义一个代理属性,类型为上述定义的协议。当网络请求完成时,调用代理方法传递数据。
  3. 视图控制器:视图控制器遵循该协议,实现协议方法以处理接收到的数据并进行展示。同时,将自身设置为网络请求类的代理。

关键代码片段(以Swift为例)

  1. 定义协议
protocol NetworkRequestDelegate {
    func networkRequestDidFinish(_ request: NetworkRequest, withData data: Data?)
}
  1. 网络请求类
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)
        }
    }
}
  1. 视图控制器
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为例)

  1. 定义协议
@protocol NetworkRequestDelegate <NSObject>
- (void)networkRequestDidFinish:(NetworkRequest *)request withData:(NSData *)data;
@end
  1. 网络请求类
@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
  1. 视图控制器
@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