5

इसलिए मैं ब्लॉक क्रियाओं को nsmutabledictionary में संग्रहीत कर रहा हूं और फिर उन्हें याद कर रहा हूं जब एक वेबसाईट पर प्रतिक्रिया वापस आती है। यह एक ब्लॉक वाक्यविन्यास में async अनुरोध बदल जाता है। यहां स्ट्रिप डाउन कोड है: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]; 
    } 
} 

नोट: सर्वर अनुरोध के साथ भेजे गए सहसंबंधिता के साथ प्रतिक्रिया करता है। तो प्रत्येक प्रतिक्रिया उस आईडी के माध्यम से प्रत्येक अनुरोध से जुड़ा हुआ है।

यह मेरी अपेक्षा से बेहतर, बेहतर काम करता है। मेरे पास सवाल यह है कि क्या इस तरह से ब्लॉक चलाने के लिए सुरक्षित है? कॉल कर रहा है [messageBlocks removeObjectForKey: correlationID]; स्मृति से इसे हटाने के लिए पर्याप्त है। मुझे प्री-एआरसी याद है, block_release एक विकल्प था।

उत्तर

8

आपको उन्हें कंटेनर में सुरक्षित रूप से स्टोर करने के लिए स्टैक-आधारित ब्लॉक की प्रतिलिपि बनाने की आवश्यकता है।

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

गैर-एआरसी कोड के लिए, आपको -autorelease भी यह चाहिए।

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

आशा है कि मदद करता है।