Objective-C 디자인 모델 프로 그래 밍 에서 비망록 모델 에 대한 활용

5835 단어 iOS디자인 모드
기본 이해
이 모델 은 세 가지 관건 적 인 역할 이 있 는데 그것 이 바로 원 발 기(Originator),비망록(Memento),관리인(caretaker)이다.세 사람의 기본 적 인 관 계 는 원 발 기 가 그 상 태 를 포함 하 는 비망록 을 만 들 고 관리자 에 게 전달 하 는 것 이다.관리인 은 비망록 과 어떻게 상호작용 을 하 는 지 모 르 지만 비망록 을 안전 한 곳 에 두 고 잘 보관 할 것 이다.
비망록(Memento):패 키 징 성 을 파괴 하지 않 는 전제 에서 대상 의 내부 상 태 를 포착 하고 이 대상 외 에 이 상 태 를 저장 합 니 다.이렇게 하면 이 대상 을 원래 저 장 된 상태 로 되 돌 릴 수 있다.
Originator(발기인):현재 시각 에 있 는 내부 상 태 를 기록 하고 비망록 내부 상 태 를 복원 하 는 비망록 을 만 드 는 것 을 책임 집 니 다.Originator 는 필요 에 따라 Memento 가 Originator 를 저장 하 는 내부 상 태 를 결정 할 수 있 습 니 다.
Memento(비망록):Originator 대상 의 내부 상 태 를 저장 하고 Originator 이외 의 다른 대상 이 비망록 에 접근 하 는 것 을 방지 할 수 있 습 니 다.비망록 에는 두 개의 인터페이스 가 있다.
비망록 의 좁은 인터페이스 만 볼 수 있 고 비망록 을 다른 대상 에 게 만 전달 할 수 있다.originator 는 이전 상태 로 돌아 가 는 데 필요 한 모든 데이터 에 접근 할 수 있 도록 넓 은 인 터 페 이 스 를 볼 수 있 습 니 다.
Caretaker(관리자):비망록 을 잘 보관 하고 비망록 의 내용 을 조작 하거나 검사 할 수 없습니다.
저장 할 디 테 일 을 Memento 에 봉인 하 는 것 입 니 다.어느 날 저장 할 디 테 일 을 변경 하 더 라 도 클 라 이언 트 에 영향 을 주지 않 아 도 됩 니 다.
비망록 사용 장소
비망록 모드 는 기능 이 복잡 하지만 속성 역 사 를 유지 하거나 기록 해 야 하 는 클래스 나 저장 해 야 하 는 속성 이 여러 속성 중의 일부분 일 때 Orignator 는 저 장 된 Memento 정보 에 따라 이전 상태 로 복원 할 수 있 습 니 다.
어떤 시스템 에서 명령 모드 를 사용 할 때 명령 의 취소 기능 이 필요 하 다 면 명령 모드 는 비망록 모드 를 사용 하여 취소 작업 상 태 를 저장 할 수 있 습 니 다.어떤 때 는 일부 대상 의 내부 정 보 를 대상 이외 의 곳 에 저장 해 야 하지만 대상 이 스스로 읽 어야 한다.이때 비망록 을 사용 하면 복잡 한 대상 내부 정 보 를 다른 대상 에 게 차단 할 수 있다.
상 태 를 가 져 오 는 인터페이스 가 노출 되 어 인 터 페 이 스 를 차단 해 야 합 니 다.
이 프로그램 은 일반적으로 게임,문자 처리 프로그램의 디자인 에 사용 되 는데 이 프로그램 은 현재 컨 텍스트 의 복잡 한 상태의 스냅 샷 을 저장 하고 나중에 다시 처리 해 야 합 니 다.
역할.
캐릭터 의 상태 가 바 뀌 었 을 때 이 상태 가 잘못 되 었 을 수도 있 습 니 다.이 럴 때 잠시 저 장 된 비망록 을 사용 하여 상 태 를 복원 할 수 있 습 니 다.
Cocoa Touch 프레임 의 비망록 모드
Cocoa Touch 프레임 워 크 는 압축 파일,속성 목록 의 직렬 화 와 핵심 데이터 에 비망록 모드 를 사용 합 니 다.
Cocoa 의 압축 파일 은 대상 과 그 속성,그리고 다른 대상 과 의 관 계 를 인 코딩 하여 하나의 문 서 를 만 드 는 것 입 니 다.이 문 서 는 파일 시스템 에 저장 할 수도 있 고 프로 세 스 나 네트워크 에서 전송 할 수도 있 습 니 다.대상 과 다른 대상 의 관 계 를 대상 그림 으로 보 는 네트워크.
압축 파일 과정 은 대상 을 구조 와 무관 한 바이트 흐름 으로 저장 하고 대상 의 표지 와 대상 간 의 관 계 를 유지한다.대상 의 유형 도 데이터 와 함께 저 장 됩 니 다.바이트 스 트림 에서 디 코딩 된 대상 은 일반적으로 대상 인 코딩 시 같은 종 류 를 예화 하 는 데 사용 된다.NSCoder 의 구체 적 인 클래스 NSKeyed Archiver 와 NSKeyed Unarchiver 를 사용 하고 키 기반 압축 파일 기술 을 사용 하 며 인 코딩 된 대상 은 NSCoding 프로 토 콜 을 준수 하고 다음 과 같은 방법 을 실현 해 야 합 니 다.

-(id)initWithCoder:(NSCoder *)coder;
-(void)encodeWithCoder:(NSCoder *)coder;
실례
ViewController.m 파일 에 다음 두 가지 방법 을 추가 합 니 다.

- (void)saveCurrentState
{
    // ,
    // ,
    // , NSUserDefaults
    [[NSUserDefaults standardUserDefaults] setInteger:currentAlbumIndex forKey:@“currentAlbumIndex”];
}

- (void)loadPreviousState
{
    currentAlbumIndex = [[NSUserDefaults standardUserDefaults] integerForKey@“currentAlbumIndex”];
    [self showDataForAlbumAtIndex:currentAlbumIndex];
}

savecourrentState 는 현재 앨범 의 색인 을 NSUserDefaults-NSUserDefaults 에 저장 합 니 다.iOS 는 프로그램 설정 과 데 이 터 를 전문 적 으로 저장 합 니 다.
loadPrevious State 에 저 장 된 앨범 색인 을 불 러 옵 니 다.이것 은 비망록 모델 의 전부 가 아니 지만,너 는 이미 목적 을 달성 했다.
현재 ViewController.m 에서 스크롤 보기 가 초기 화 되 기 전에 view DidLoad 에 다음 줄 을 추가 합 니 다.

[self loadPreviousState];
프로그램 이 시 작 될 때 지난번 저장 상 태 를 불 러 옵 니 다.그런데 프로그램의 현재 상 태 를 어디서 저장 합 니까?너 는 통 지 를 써 서 이런 일 을 해 야 한다.프로그램 이 배경 에 들 어 갈 때 iOS 는 UIApplicationDidEnterBackground Notification 알림 을 보 냅 니 다.이 알림 을 이용 하여 savecourrentState 를 호출 할 수 있 습 니 다.이렇게 편리 해?
view Did Load:맨 뒤에 다음 줄 추가

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveCurrentState) name:UIApplicationDidEnterBackgroundNotification object:nil];
현재,앱 이 백 엔 드 에 들 어가 실행 되면 ViewController 는 자동 으로 saveCurrentState 를 호출 하여 현재 상 태 를 저장 합 니 다.
현재 다음 코드 를 추가 합 니 다:

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
뷰 컨트롤 러 가 풀 려 날 때 클래스 를 제거 하 는 Observer 입 니 다.
앱 을 구축 하고 실행 합 니 다.앨범 을 클릭 하고 Command+Shift+H(시 뮬 레이 터 를 사용한다 면)로 프로그램 을 배경 에서 실행 한 다음 앱 을 끄 십시오.app 을 다시 시작 합 니 다.선택 한 앨범 이 가운데 에 있 는 지 확인 하 십시오.
2016323170032314.png (214×320)
앨범 데이터 가 맞 는 것 처럼 보이 지만 정확 한 앨범 표 지 는 확실히 중간 에 있 지 않 습 니 다.무슨 문제 가 있 습 니까?
이것 이 바로 선택 가능 한 방법 입 니 다.initialViewIndex ForHorizontal Scroller 의 용도 입 니 다!이 방법 이 실행 되 지 않 았 기 때문에 뷰 컨트롤 러 는 이 경우 기본 첫 번 째 앨범 표 지 를 항상 표시 합 니 다.
이 문 제 를 복구 하려 면 ViewController.m 에 다음 코드 를 추가 하 십시오.

- (NSInteger)initialViewIndexForHorizontalScroller:(HorizontalScroller *)scroller
{
    return currentAlbumIndex;
}
현재 Horizontal Scroller 의 첫 번 째 보 기 는 항상 current AlbumIndex 색인 그림 으로 설 정 됩 니 다.이 방법 은 당신 의 app 이 매우 좋 은 사용자 체험 을 가지 고 있 으 며 회복 할 수 있 도록 보장 할 수 있 습 니 다.
app 을 다시 실행 하고 앨범 표 지 를 스크롤 하 며 app 을 닫 은 다음 문제 가 해결 되 었 는 지 확인 합 니 다.
2016323170107827.png (214×320)
Persistency Manger 의 초기 화 방법 을 보면 앨범 의 데이터 가 하 드 인 코딩 이라는 것 을 알 게 될 것 입 니 다.Persistency Manger 는 만 들 때마다 데 이 터 를 다시 만 듭 니 다.앨범 목록 이 만 들 어 졌 을 때 저장 하 는 더 좋 은 방법 은 없 을 까?그러면 어떻게 앨범 데 이 터 를 파일 에 저장 합 니까?
하나의 선택 은 Album 에 순환 적 으로 접근 하 는 속성 을 선택 한 다음 plist 파일 에 저장 하고 필요 할 때 Album 의 인 스 턴 스 를 다시 만 드 는 것 입 니 다.이것 은 가장 좋 은 선택 이 아니다.이것 은 모든 종류 에서 서로 다른 데이터 나 속성 에 따라 특정한 코드 를 써 야 한다.예 를 들 어 잠시 후에 영화 의 종류 가 필요 하 다 면 그 안에 서로 다른 속성 이 있 습 니 다.이 데 이 터 를 저장 하고 불 러 오 려 면 새로운 코드 를 써 야 합 니 다.
또한,접근 할 수 없 는 외부 클래스 이기 때문에 모든 종류의 인 스 턴 스 에 개인 변 수 를 저장 할 수 없습니다.애플 이 압축 파일(Archiving)체 제 를 만 드 는 이유 다.

좋은 웹페이지 즐겨찾기