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는 옵션이었다.

답변

8

안전하게 스택에 저장하기 위해 스택 기반 블록을 복사해야합니다.

[self.messageBlocks setObject:[responseAction copy] forKey:correlationID]; 

비 -ARC 코드의 경우 -autorelease도 필요합니다.

[self.messageBlocks setObject:[[responseAction copy] autorelease] forKey:correlationID]; 

희망이 있습니다.

관련 문제