blocos em nsdictionary?
Então, eu estou armazenando ações de bloco em um nsmutabledictionary e, em seguida, recuperando-as quando uma resposta retorna em um websocket. Isso transforma a solicitação assíncrona em uma sintaxe de bloco. Aqui está o código simplificado:
- (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];
}
}
Nota: O servidor responde com um ID de correlação enviado com a solicitação. Portanto, cada resposta é vinculada a cada solicitação por meio desse id.
Isso funciona perfeitamente, melhor do que eu esperava. A pergunta que tenho é que é seguro executar blocos dessa maneira? Está chamando [messageBlocks removeObjectForKey: correlationID]; o suficiente para removê-lo da memória. Lembro-me de pré-ARC, block_release era uma opção.