2013년 2월 7일 목요일

ChatManager - Smack

1. 상대방 user id와 이에 대한 MessageListener로 Chat 방 하나가 만들어짐

* thread id를 만들어 관리함
** thread id: 숫자와 문자로 된 5개의 문자 + 0에서 시작하여 만들때마다 1씩 증가하는 number
* thread id, user id, base user id 이렇게 세개의 map을 통해 chat을 관리함
** 예: 5ab3et5, google@gmail.com/resource, google@gmail.com
** 왜 굳이 이렇게 3개를 가지고 chat을 관리할까? base user id 하나만으로도 충분하지 않나?

2. 상대방으로 부터 메시지가 오는 경우 chat 찾기

* thread id 확인 ->(없으면) user id로 chat 찾기 -> (없으면) chat 새로 생성
                        ->(있으면) thread id로부터 chat 찾기 ->(없으면) user id로부터 chat 찾기 -> (없으면) chat 새로 생성
* chat을 찾으면 여기에 message 전달

3. connection에 PacketListener와 PacketFilter를 전달하여 필요한 message를 전달받음

* PacketFilter의 accept함수가 true를 리턴하는 경우의 패킷이 있으면 PacketListener의 processPacket 함수를 호출함(PacketReader에서 이 작업을 해줌)

4. chat을 생성했을 때의 이벤트를 받기위한 ChatManagerListener를 등록할 수 있음

* 이 리스너를 등록하면 chat이 생성되었을 때 chatCreated 함수가 호출됨.

5. 패킷을 보낼 때 intercept하여 패킷에 변형을 가할 수 있도록 해주는 PacketInterceptor를 등록할 수 있음

* PacketFilter와 쌍으로 동작하여 PacketFilter의 accept 함수가 true를 리턴하는 경우 PacketInterceptor의 interceptPacket 함수를 호출함 - 이 함수 안에서 message의 변형을 가하면 됨

6. 지정한 패킷이 왔을 때 호출되도록 할 수 있는 PacketCollector를 제공함

* ChatManager가 제공하는 PacketCollector는 thread id 와 상대방 user id가 맞으면 호출되는 collector

ReferenceMap : id와 chat 관리에 사용 - weak reference
CopyOnWriteArraySet : ChatManagerListener에 사용
WeakHashMap : PacketInterceptor 관리에 사용

댓글 없음:

댓글 쓰기

Building asynchronous views in SwiftUI 정리

Handling loading states within SwiftUI views self loading views View model 사용하기 Combine을 사용한 AnyPublisher Making SwiftUI views refreshable r...