このリンクの図4-7のように、真のCocoaMVCを実装する方法を理解しようとしています。
ここにリンクがあります
図4-7は、モデルがパターンオブザーバーを使用してコントローラー(パッシブMVC)に通知することを示しています。このようにモデルにオブザーバーを実装します
@interface IADataManager : NSObject
//MARK: Parsed Feed With IANewsDataObj
@property (nonatomic,retain) NSMutableArray *feedArray;
//MARK: Model use Singelton Pattern
+ (IADataManager *) sharedInstance;
//MARK: Observation methods
- (void) addListener:(id<IADataManagerListener>) listener;
- (void) removeListener:(id<IADataManagerListener>) listener;
//MARK: Business Logic
- (void) loadFeedFromNetwork;
- (void) loadFeedFromDataBase;
- (void) loadImageForTarget:(id<IADataManagerListener>) target
AtIndexPath:(NSIndexPath *) indPath;
- (void) saveFeedToDataBase;
@end
@protocol IADataManagerListener <NSObject>
- (void) IADataManager :(IADataManager *) dataMng
didRefreshWithError :(NSError *) error;
- (void) IADataManager :(IADataManager *) dataMng
didLoadImageForIndexPath :(NSIndexPath *) indexPath;
- (void) IADataManager :(IADataManager *) dataMng
didLoadWithError :(NSError *) error;
@end
- (void) addListener:(id<IADataManagerListener>) listener
{
if([self.listeners indexOfObject:listener] == NSNotFound && listener)
[self.listeners addObject:listener];
}
- (void) removeListener:(id<IADataManagerListener>) listener
{
if([self.listeners indexOfObject:listener] !=NSNotFound && listener)
[self.listeners removeObject:listener];
}
//Notification example
- (void) handleLoadedNews:(NSArray *) loadedNews
{
[self.feedArray addObjectsFromArray:loadedNews];
[self.listeners enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
objc_msgSend(obj, @selector(IADataManager:didRefreshWithError:),self,nil);
}];
}
モデルにオブザーバーを実装するより良い方法があるのだろうか?たとえば、KVOまたはNSNotificationCenterを使用します。しかし、問題は、KVOとNSNotificationCenterの助けを借りて、複数の引数を持つセレクターを使用できないことです。例えば、
- (void) DataManager:(DataManager *) dm withObj1:(Obj1*) obj1 Obj1:(Obj2*) obj2 Obj3:(Obj3*) obj3
どうもありがとう!