Objective C 语言 VIPER架构实现

Objective-C阿木 发布于 2025-06-30 15 次阅读


Objective-C VIPER 架构实现与代码解析

VIPER(View, Interactor, Presenter, Entity, Router)是一种流行的iOS应用程序架构模式,它将应用程序的各个部分分离成独立的模块,以提高代码的可维护性和可测试性。本文将围绕Objective-C语言,详细介绍VIPER架构的实现过程,并通过实际代码示例进行解析。

在iOS开发中,随着应用程序的复杂度增加,传统的MVC(Model-View-Controller)架构逐渐暴露出其局限性。VIPER架构应运而生,它通过将MVC中的Controller拆分为Presenter和Router,进一步解耦了视图和业务逻辑,使得代码更加模块化。

VIPER架构概述

VIPER架构包含以下五个主要组件:

1. View:负责显示数据和接收用户输入。

2. Interactor:负责处理业务逻辑。

3. Presenter:负责将Interactor的数据传递给View,并处理用户交互。

4. Entity:负责存储数据。

5. Router:负责处理视图间的导航。

实现步骤

1. 创建项目

使用Xcode创建一个新的Objective-C项目,并选择合适的模板。

2. 定义Entity

Entity是VIPER架构中的数据模型,它负责存储数据。以下是一个简单的Entity示例:

objective-c

@interface User : NSObject

@property (nonatomic, strong) NSString name;


@property (nonatomic, strong) NSString email;

@end

@implementation User

- (instancetype)initWithName:(NSString )name email:(NSString )email {


self = [super init];


if (self) {


_name = name;


_email = email;


}


return self;


}

@end


3. 创建Interactor

Interactor负责处理业务逻辑,它接收来自Presenter的请求,并返回结果。以下是一个简单的Interactor示例:

objective-c

@interface UserInteractor : NSObject

@property (nonatomic, weak) UserPresenter presenter;

- (void)fetchUserWithCompletion:(void (^)(BOOL success, NSError error))completion;

@end

@implementation UserInteractor

- (void)fetchUserWithCompletion:(void (^)(BOOL success, NSError error))completion {


// 模拟网络请求


dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 NSEC_PER_SEC)), dispatch_get_main_queue(), ^{


BOOL success = YES;


NSError error = nil;


if (success) {


User user = [[User alloc] initWithName:@"John Doe" email:@"john.doe@example.com"];


[self.presenter userFetched:user error:error];


} else {


error = [NSError errorWithDomain:@"UserInteractorErrorDomain" code:100 userInfo:@{NSLocalizedDescriptionKey: @"Failed to fetch user"}];


[self.presenter userFetched:nil error:error];


}


completion(success, error);


});


}

@end


4. 创建Presenter

Presenter负责将Interactor的数据传递给View,并处理用户交互。以下是一个简单的Presenter示例:

objective-c

@interface UserPresenter : NSObject

@property (nonatomic, weak) UserView view;


@property (nonatomic, strong) UserInteractor interactor;

- (void)fetchUser;

@end

@implementation UserPresenter

- (void)fetchUser {


[self.interactor fetchUserWithCompletion:^(BOOL success, NSError error) {


if (success) {


[self.view displayUser:self.interactor.user];


} else {


[self.view showError:error];


}


}];


}

@end


5. 创建View

View负责显示数据和接收用户输入。以下是一个简单的View示例:

objective-c

@interface UserView : UIView

@property (nonatomic, strong) UILabel nameLabel;


@property (nonatomic, strong) UILabel emailLabel;

- (void)displayUser:(User )user;


- (void)showError:(NSError )error;

@end

@implementation UserView

- (instancetype)initWithFrame:(CGRect)frame {


self = [super initWithFrame:frame];


if (self) {


self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, CGRectGetWidth(self.bounds) - 20, 30)];


self.nameLabel.font = [UIFont systemFontOfSize:16];


[self addSubview:self.nameLabel];

self.emailLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, CGRectGetMaxY(self.nameLabel.bounds) + 10, CGRectGetWidth(self.bounds) - 20, 30)];


self.emailLabel.font = [UIFont systemFontOfSize:14];


[self addSubview:self.emailLabel];


}


return self;


}

- (void)displayUser:(User )user {


self.nameLabel.text = user.name;


self.emailLabel.text = user.email;


}

- (void)showError:(NSError )error {


UIAlertView alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:error.localizedDescription delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];


[alertView show];


}

@end


6. 创建Router

Router负责处理视图间的导航。以下是一个简单的Router示例:

objective-c

@interface UserRouter : NSObject

@property (nonatomic, weak) UIViewController viewController;

- (void)presentUserViewController:(UIViewController )viewController;

@end

@implementation UserRouter

- (void)presentUserViewController:(UIViewController )viewController {


[self.viewController presentViewController:viewController animated:YES completion:nil];


}

@end


7. 整合组件

将各个组件整合到一起。以下是一个简单的整合示例:

objective-c

@interface ViewController : UIViewController

@property (nonatomic, strong) UserView userView;


@property (nonatomic, strong) UserPresenter presenter;


@property (nonatomic, strong) UserRouter router;

@end

@implementation ViewController

- (void)viewDidLoad {


[super viewDidLoad];


self.userView = [[UserView alloc] initWithFrame:self.view.bounds];


[self.view addSubview:self.userView];

self.presenter = [[UserPresenter alloc] init];


self.presenter.view = self.userView;


self.presenter.interactor = [[UserInteractor alloc] init];


self.presenter.interactor.presenter = self.presenter;

self.router = [[UserRouter alloc] init];


self.router.viewController = self;

[self.presenter fetchUser];


}

@end


总结

本文详细介绍了Objective-C VIPER架构的实现过程,并通过实际代码示例进行了解析。通过使用VIPER架构,我们可以将应用程序的各个部分分离成独立的模块,提高代码的可维护性和可测试性。在实际开发中,可以根据项目需求对VIPER架构进行扩展和优化。