5

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.

risposta

8

È necessario copiare blocchi basati su stack per archiviarli in modo sicuro in un contenitore.

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

Per codice non ARC, è necessario anche -autorelease.

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

Speranza che aiuta.