내 응용 프로그램의 소켓 통신에 GCDAsyncSocket
(CocoaAsyncSocket
)을 사용하고 있습니다. GCDAsyncSocket
의 비동기 속성으로 인해 네트워크 요청 (submitMessage
아래)이 데이터 수신시 실행되는 콜백 블록 (socket:didReadData
)과 분리됩니다.GCDAsyncSocket을 사용한 동기식 통신
- (void)submitMessage:(NSDictionary *)messageObject onCompletion:(completionBlock)block {
...
[_socket writeData:requestData withTimeout:self.timeout tag:0];
[_socket readDataToLength:4 withTimeout:self.timeout tag:TAG_HEADER];
}
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
...
NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if (self.completionBlock != nil)
self.completionBlock(responseObject);
}
}
이 접근법은 일회성 교환에 적합합니다. 그러나 요청을 게시하고 수신 된 데이터를 사용하여 다른 요청을 게시해야하는 경우가 있습니다. 나는 이것이 제대로 작동하도록 할 수 없습니다. 기본적으로, 나는 이런 식으로 뭔가가 필요합니다
[self submitMessage:request1 onCompletion:^(NSDictionary *response1) {
(...callback 1...)
}];
[self submitMessage:request2 onCompletion:^(NSDictionary *response2) {
(...callback 2...)
}];
}];
또는
[self submitMessage:request1 onCompletion:^(NSDictionary *response1) {
(...callback 1...)
}];
[self submitMessage:request2 onCompletion:^(NSDictionary *response2) {
(...callback 2...)
}];
순서가 엄격하게 request1입니다
- 된 callback1 - request2 -을 callback2.첫 번째 요청의 콜백 후 두 번째 요청을 실행하는 것을 어떻게 막을 수 있습니까? GCD
(dispatch_sync
?) 가야 할 길입니까?
편집
내가 제안 @tigloo 것과 유사한 솔루션 (따라서 그의 대답을 받아들이)를 사용하지만, GCD
대신 NSCondition
를 사용하여 종료 (사람이 세부 사항에 관심이 있다면, 나는 this great discussion를 따라). 나는 이미 다중 쓰레드 (메인 쓰레드의 UI, 다른 쓰레드의 하이 레벨 소켓 통신, 세번째 쓰레드의 소켓 작업)를 실행 중이다. 응답이 도착할 때까지 클래스 속성을 설정하고 NSCondition
을 사용하여 GCDAsyncSocket
대리자를 잠그는 것이 가장 깨끗한 접근 방법입니다.
명확하고 간결하게 작성하십시오. 당신의 문제는 정확히 무엇입니까. (나는 당신의 글을 읽었지만 그 질문을 정확하게 지적하는 것은 어렵습니다.) – ilmiacs
감사합니다 @ilmiacs, 그것이 더 합리적인 지보십시오. – lucianf
그러면 완료 후 콜백 1에서'submitMessage : request2'를 왜 보지 않으시겠습니까? – ilmiacs