5
그래서 블록 조치를 nsmutabledictionary에 저장하고 응답이 웹 소켓에서 다시 발생하면 호출합니다. 그러면 비동기 요청이 블록 구문으로 바뀝니다. 다음은 제거 된 코드입니다.블럭?
- (void)sendMessage:(NSString*)message responseAction:(void (^)(id))responseAction
{
NSString *correlationID = (NSString*)[[message JSONValue] objectForKey:@"correlationId"];
[self.messageBlocks setObject:responseAction forKey:correlationID];
NSLog(@"Sending message: %@", correlationID);
[webSocket send:message];
}
- (void)webSocket:(SRWebSocket *)wsocket didReceiveMessage:(id)message;
{
NSString *correlationID = (NSString*)[[message JSONValue] objectForKey:@"correlationId"];
NSLog(@"Incoming message. CorrelationID: %@", correlationID);
void (^action)(id) = nil;
if (correlationID) {
action = [messageBlocks objectForKey:correlationID];
if (action) action([message JSONValue]);
[messageBlocks removeObjectForKey:correlationID];
}
}
참고 : 서버는 요청과 함께 전송 된 상관 ID로 응답합니다. 따라서 각 응답은 해당 ID를 통해 각 요청에 연결됩니다.
예상보다 완벽하게 작동합니다. 내가 가진 질문은 이런 방식으로 블록을 실행하는 것이 안전하다는 것입니다. [messageBlocks removeObjectForKey : correlationID]를 호출하고 있습니다. 그것을 메모리에서 제거하기에 충분합니다. 나는 pre-ARC를 기억한다. block_release는 옵션이었다.