1

@protocolをModelクラスに追加し、それをControllerに実装するのは良いパターンですか?

これは、モデルデータが変更されたときにUITableViewをリロードするためのメッセージを送信するために使用するコードです。これは、オブジェクトcコーディングに適したアプローチですか?:

MyModel.h

@protocol myModelDelegate
{
(void) refreshTableView:(id) sender;
}
@end

@interface MyModel
{
@property (nonatomic,strong) (NSArray *) myData;
@property (nonatomic,weak) (id) <myModelDelegate> delegate;
}
@end

MyModel.m

@implementation MyModel

@synthesize myData=_myData;

    - (NSArray*) myData {
    if(!_myData) {
    _myData= [[NSArray alloc] init];
    }

    return _myData;
    }

 - (void) setMyData: (NSArray*) myData
    {
         if (_myData != myData) {
        _myData=myData;
    [delegate refreshTableView:self];
                           }
    }

@end

myDataController.h

...
@interface MyDataController: UITableViewController <myModelDelegate>
...

myDataController.m

@interface MyDataController()
        @property (nonatomic,strong) (MyModel *) model;
@end

@implementation MyDataController

@synthesize model=_model;

-(MyModel *) model
{
if(!_model)
  {
    _model=[[MyModel alloc]init];
     model.delegate=self;
  }
return _model;
}
    ...
        - (void) refreshTableView: (id) sender
        {
          [TableView reloadData];
        }
    ...
@end
4

1 に答える 1

4

このデザインには問題はありません。

私が変更するのは、デリゲートメソッドのシグネチャを次のように変更することだけです。

-(void)modelDidChange:(MyModel*)model;

これは、デリゲートメソッドの命名について見られるベストプラクティスとより一致しており、メソッドのより広範なセマンティクスを示唆しています。モデルは、変更されたという事実を「通知」し、デリゲートはそれに基づいてアクションを実行します(つまり、テーブルの場合はテーブルを更新し、永続性コンポーネントの場合はモデルコンテンツを保存します。)

于 2012-08-01T07:38:52.253 に答える