アプリ開発にMVVMパターンを適用する
現在MVVMパターンでアプリを開発しているのですが、色々と調べたりコードを書いたりしても分からないところがあるので質問させていただきたいです。
サンプルで以下に自分なりにMVVMパターンを使用したごく簡単なコードを書いてみました。
ViewController.m
@interface ViewController ()
@end
@implementation ViewController {
ViewModel *viewModel;
}
- (void)viewDidLoad {
[super viewDidLoad];
viewModel = [[ViewModel alloc] initWithSelf:self];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [viewModel vmGetItemsCount];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
return [viewModel vmSetTableViewCell:tableView :indexPath];
}
@end
ViewModel.m
@implementation ViewModel {
ViewController *selfObject;
NSArray *items;
}
- (id)initWithSelf:(ViewController *)vcSelfObject {
if (self = [super init]) {
selfObject = vcSelfObject;
items = @[@"Model", @"View", @"ViewModel"];
}
return self;
}
- (NSInteger)vmGetItemsCount {
return [items count];
}
- (UITableViewCell*)vmSetTableViewCell:(UITableView*)tableView :(NSIndexPath*)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = items[indexPath.row];
return cell;
}
@end
まずViewDidLoad
でViewModel
のインスタンスを生成しているのですが、viewModel
内でViewController
のUIを操作しないといけないので、viewModel = [[ViewModel alloc] initWithSelf:self];
というようにViewController
のself
を引数で渡してViewModel
でそのself
を保持しておくというやり方は正しいやり方でしょうか?色々なサイトを見ていると、viewModel = [[XXviewModel alloc] init];
としか書かれていないのですが、ViewModel
内でUIの操作をしたいときにいちいち関数の引数にself
を書くのは冗長なのではないかなと思ったからです。
そしてinitWithSelf
が実行されると各変数を初期化していくのですが、このイニシャライザ内でNSArray
を初期化するのは正しいやり方でしょうか?ここでNSArray
を初期化するのではなく、ViewController
のviewDidLoad
で[viewModel vmSetDataToItems];
のような形で初期化させた方がいいでしょうか?はたまたここは特にそういうことは意識することなくどっちでもいいでしょうか?
長々とすみません、最後になるのですが、MVVM
パターンを使うとViewController
内の関数は全体的にnumberOfRowsInSection
やcellForRowAtIndexPath
のように[viewModel XXXXXX]という形で一行だけになっていくのでしょうか?
分からないことが多々あり、勘違いしたまま質問をしているかもしれませんが、どなたか詳しい方がいれば教えていただきたいです。すみませんが、よろしくお願いします。