2012-02-29 5 views
0

GCDAsyncSocket 및 AsyncSocket 제목은 모두 비동기 적이며 상태가 비슷합니다. 그러나 소켓에 관한 모든 내용은 TCP 데이터 패킷에서 오는 무제한 길이의 단일 연속 스트림 처리에 관한 것입니다. 처음에는 좀 혼란 스러웠습니다. AsyncSocket은 사용자 정의 요청 및 응답 패킷을 만들고이를 비동기 적으로 처리하여 일부 마법을 수행합니다 (예를 들어 요청 A, B, C를 작성한 경우 서버의 응답이 다른 순서, 예를 들어 B, C, A). 소켓 세계를 파고 들자면 소켓 읽기를 통해 서버에서 오는 데이터가 비동기가 아닌 버트 동기가된다는 것을 알았습니다. 하나의 스트림을 읽고 패킷으로 잘라내서 내 대의원 클래스에 콜백을 작성하는 것입니다. 요청을 A, B, C로하면 서버의 응답은 A, B, C와 같은 순서로 올 것입니다. AFAIK, AsyncSocket은 메인 실행 루프를 사용하므로 메인 쓰레드 인 메인 큐를 다시 사용합니다. 그렇다면 비동기적인 부분은 무엇입니까?AsyncSocket/GCDAsyncSocketis의 어떤 부분이 비동기입니까?

답변

2

읽기 및 쓰기 호출이 스레드를 차단하지 않고 즉시 반환된다는 점에서 비동기식이며 위임 및/또는 블록을 통해 나중에 결과를 처리 할 수 ​​있습니다.

0

UIAdam이 맞습니다. 예를 들어, AsyncSocket은 다른 스레드에서 결과를 처리하여 읽기 스트림 콜백을 구현합니다. 다음은 소스 코드 조각입니다.

static void MyCFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    AsyncSocket *theSocket = [[(AsyncSocket *)pInfo retain] autorelease]; 
    [theSocket doCFReadStreamCallback:type forStream:stream]; 

    [pool drain]; 
} 
관련 문제