Quindi sono la memorizzazione di azioni di blocco in un NSMutableDictionary e poi ricordando loro quando una risposta ritorna su un websocket. Questo trasforma la richiesta asincrona in una sintassi di blocco. Ecco il codice ridotto:blocchi in nsdictionary?
- (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: il server risponde con un ID di correlazione che viene inviato con la richiesta. Quindi ogni risposta è collegata a ciascuna richiesta attraverso quell'id.
Questo funziona perfettamente, meglio di quanto mi aspettassi. La domanda che ho è che è sicuro di eseguire blocchi in questo modo? Chiama [messageBlocks removeObjectForKey: correlationID]; abbastanza per rimuoverlo dalla memoria. Ricordo pre-ARC, block_release era un'opzione.