0

[IWSession session][IWSession session].currentUser 개체를 통해 현재 사용자 및 해당 세션의 모든 관련 정보를 포함하는 공유 싱글 톤을 사용하고 있습니다.KVO, 속성 변경 및 알림

웹 서비스 호출 (iBeacon에 의해 트리거 됨, 위치 변경으로 트리거 됨)을 통해 현재 사용자 (실제로 응용 프로그램에 로그인 된 사용자를 참조)가 일부 속성을 자주 업데이트 할 수 있습니다. 이것은 응용 프로그램의 다른 위치에서 GUI를 적절하게 업데이트한다는 것을 의미합니다. 5 또는 6 개의 클래스 인스턴스를 예로 들어 봅시다.

속성이 업데이트되는 즉시 앱에 표시되는 정보를 업데이트하는 적절한 방법은 무엇입니까?

나는 약

1

) 자신의 [IWSession session].currentUser에 다음과 같은 링크 Key Value Observing - how to observe all the properties of an object?

2)에 대한 모든 속성에 대한 KVO를 추가하기 KVO는 다음

[[NSNotificationCenter defaultCenter] postNotificationName:@"userUpdated" object:nil]; 

를 실행할 것이라고 생각 레이아웃을 업데이트해야하는 모든 클래스는 해당 알림을 수신합니다.

좋은 접근 방법입니까? 다른 제안 사항이 있으십니까?

답변

0

알림을 사용하면 알림이 게시 된 모든 개체에 대해 메모리가 해제되지 않습니다. 왜냐하면 알림을 사용하면 객체에 대한 참조가 힙에 저장되기 때문입니다. 따라서 Notifications를 사용하는 것이 좋습니다.

+0

다른 제안 사항은 무엇입니까? 감사 –

0

나는 최근에 예를 들어, 해시 테이블

반 위임 메시지로
mObservers = [NSHashTable weakObjectsHashTable]; 

를 사용하여 약한 관찰자 목록을 사용하고 있습니다 :

@protocol UserSessionObserver <NSObject> 
- (void) userSession:(id)session didUpdateUser:(id)userProfile; 
@end 

그래서, 어떤 개체가 그 변경에 관심이있을 것 userProfile 또는 userSession은 공유 된 userSession에 ad-hoc 옵저버로 추가 될 수 있습니다. 이것은 약한 엔트리이기 때문에, 객체는 dealloc의 옵저버 테이블로부터 자동적으로 제거 될 것이다.

트릭 올바른 addObserver 메시지를 작성하는 것입니다 :이 자신의 관찰자 로직을 작성하도록 요구하지만

- (void) addObserver:(__weak id<UserSessionObserver>)observer; 

을, 또한 의미 : 강한 유지 사이클 1. 없음 메모리 관리 문제, 2. 단순화되고 포인트 옵저버 메시징 (시스템 알림 및 KVO 구현은 너무 일반적이므로 이해할 수없는 문제에 접해 있지만 단순히 처리 속도가 느려지는 여러 계층의 로직을 추가합니다).

구현 예 : Weak Observer example