//
// Event.h
//
// Created by Yongho Ji on 10. 10. 25..
// Copyright 2010 Wecon Communications. All rights reserved.
//
// 이벤트를 다룬다. 내부적으로 Notification 기능을 한번 감싼형태이다.
// 이렇게 만드는 이유는 호스트코드에서 더 쉽게 사용할 수 있게 하기 위함이다.
//
#import <Foundation/Foundation.h>
//=================================================
//
// 이벤트
// 1. 내부 생성클래스이다.
// 2. 개발자가 직접 생성하지 않는다.
// 3. 개발자는 등록된 이벤트 청취자로부터 이 이벤트 객체를 받게 되어 있다.
//
//=================================================
@interface Event: NSObject
{
@private
id _dispatcher; // 이벤트 송출자
id _data; // 이벤트 데이타
NSString *_eventName; // 이벤트 명
}
@property (nonatomic, readonly) id dispatcher;
@property (nonatomic, readonly) id data;
@property (nonatomic, readonly) NSString *eventName;
@end
//=================================================
//
// 이벤트 청취자
// 1. 내부 클래스이며 외부 노출되지 않는다.
// 2. 이벤트 청취 목록을 관리하기 위한 클래스이다.
//
//=================================================
@interface EventListener : NSObject
{
@private
id _listener; //이벤트 청취자
SEL _selector; //이벤트 청취자의 selector
NSString *_eventName; //이벤트 이름
}
@property (readonly) id listener;
@property (readonly) SEL selector;
@property (readonly) NSString* eventName;
-(id)initWithListener:(id)listener selector:(SEL)selector eventName:(NSString*)eventName;
@end
//=================================================
//
// 이벤트 센터
// 1. 싱글톤 클래스이다.
// 2. [EventCenter defaultCenter]로 접근해서 사용한다.
// 3. 이벤트 청취자 등록은 [[EventCenter defaultCenter]add:self selector:@selector(mySelector:) eventName:@"MY_EVENT"] 형태로 한다.
// 4. 이벤트 청취자 삭제는 3가지가 있다.
// - 1개의 이벤트 명에 대한 청취자 삭제 [[EventCenter defaultCenter] remove:self selector:@selector(mySelector:) eventName:@"MY_EVENT"] 형태로 한다.
// - 여러개의 이벤트 명에 대한 청취자 삭제 [[EventCenter defaultCenter] remove:self selector:@selector(mySelector:)] 형태로 한다.
// - 모든 이벤트 청취자 삭제 [[EventCenter defaultCenter] remove:self] 형태로 한다.
// 5. 이벤트 발송은 2가지 방법이 있다.
// - 데이터가 미포함된 이벤트 : [[EventCenter defaultCenter] dispatch:self eventName:@"MY_EVENT"]
// - 데이터가 포함된 이벤트 : [[EventCenter defaultCenter] dispatch:self eventName:@"MY_EVENT" data:myData]
// - 데이터는 NSObject를 확장한 것이라면 어떤 것이든 보낼 수 있다.
// - 이벤트가 발송되면 해당 이벤트 이름으로 등록된 모든 이벤트 청취자를 실행한다.
// 6. 이벤트 청취자는 listener과 selector로 한묶음으로 본다. selector는 -(void)mySelector:(Event*)event; 또는 -(void)mySelector; 형태로 만들면 되겠다.
// 단, 인자로 Event객체가 오면 그 속성값에 dispatcher(이벤트를 발생한 넘), eventName(이벤트명), data(이벤트시 보낸 데이타)를 참조할 수 있다.
// 7. UIViewController기반에서 이벤트 등록과 삭제는 반드시 각각 viewWillAppear, viewWillDisappear에서 하도록 한다. 왜냐하면 등록된 이벤트 청취자 관리를 잘 못하면 중복 호출이 될 수 있다.
//=================================================
@interface EventCenter : NSObject {
NSMutableArray *eventListeners;
}
//이벤트 기본 Center. 싱글톤 처리
+(EventCenter*)defaultCenter;
//이벤트 청취자 등록 (중복된 등록은 무시됨)
-(void)add:(id)listener selector:(SEL)selector eventName:(NSString*)eventName;
//이벤트 청취자 삭제. selector, eventName에 상관없이 같은 listener로 등록되어 있으면 모두 삭제. 이미 삭제되어 있다면 무시.
-(void)remove:(id)listener;
//이벤트 청취자 삭제. eventName에 상관없이 같은 listener, selector로 등록되어 있으면 모두 삭제. 이미 삭제되어 있다면 무시.
-(void)remove:(id)listener selector:(SEL)selector;
//이벤트 청취자 삭제. listner, selector, eventName이 모두 같아야 삭제된다. 이미 삭제되어 있다면 무시.
-(void)remove:(id)listener selector:(SEL)selector eventName:(NSString*)eventName;
//이벤트 송출. 데이터 미포함
-(void)dispatch:(id)dispatcher eventName:(NSString*)eventName;
//이벤트 송출. 데이터 포함
-(void)dispatch:(id)dispatcher eventName:(NSString*)eventName data:(id)data;
@end
'소프트웨어 개발 > iOS' 카테고리의 다른 글
[아이폰어플]APNS 개발버전과 배포버전의 차이점. Device Token 등 (0) | 2010.12.18 |
---|---|
APNS Device Token을 못받아올때 (9) | 2010.12.18 |
아이폰 어플 개발시 염두해야할 사항 (4) | 2010.12.18 |
[아이폰어플]UIImageView에 원격이미지 비동기 로드 및 캐쉬 기능 넣기 (19) | 2010.12.17 |
[아이폰어플]로컬/원격 테스트, 로그출력을 컴파일 타임에서 제어하기 (1) | 2010.12.17 |