2016-06-03 11 views
0

Ich erhalte gelegentlich Abstürze in meinen GCDWebServer-Handlern, die auf änderbare Wörterbücher zugreifen. Die GCDWebServer ReadMe sagt, dass die Handler "auf beliebigen Threads innerhalb von GCD ausgeführt werden, so dass besonders auf Thread-Sicherheit und Re-Enrancy geachtet werden muss", und ich denke, das ist mein Problem. Gibt es eine Best Practice oder ein empfohlenes Muster für den Zugriff auf änderbare Eigenschaften des übergeordneten Objekts von den Handlern?Zugriff auf veränderbare Daten von einem GCDWebServer-Request-Handler

Ich weiß nicht, ob ich zwischen Threads synchronisieren kann, da ich die Handler-Threads nicht erstellen. Außerdem stelle ich mir vor, ich könnte einen asynchronen Handler verwenden, dann eine Methode für den Haupt-Thread von dort aufrufen, dann meine Arbeit mit dieser Methode machen und dann die Antwort senden, aber das scheint komplizierter und weniger effizient als nötig.

Hier ist eine vereinfachte Version von meinem Code:

@property (nonatomic, strong) NSMutableDictionary *data; 
@property (nonatomic, strong) GCDWebServer *webServer; 

- (void)setup { 
    self.data = [NSMutableDictionary dictionary]; 
    [self.data setObject:@"1" forKey:@"status"]; 

    self.webServer = [[GCDWebServer alloc] init]; 
    [self.webServer addHandlerForMethod:@"GET" path:@"/getStatus.txt" requestClass:[GCDWebServerRequest class] processBlock:^(GCDWebServerRequest *request) { 
     return [self handleStatusRequest:request]; 
    }]; 
} 

- (GCDWebServerDataResponse *)handleStatusRequest:(GCDWebServerRequest *)request { 
    NSString *status = [self.data objectForKey:@"status"]; // crash here 
    return [GCDWebServerDataResponse responseWithText:status]; 
} 

Antwort

1

Sind Sie data Wörterbuch nach mutiert es zu schaffen? Wenn ja, würde das die Abstürze erklären.

Sie müssen den gleichzeitigen Zugriff auf Ihr data Wörterbuch mithilfe von Sperren verhindern. Der einfachste Weg ist durch GCD, z.B.

@property dispatch_queue_t lock; 

__block NSString* status; 
dispatch_sync(self.lock, ^{ 
    status = [self.data objectForKey:@"status"]; 
}); 

NSString* status = @"Hello"; 
dispatch_async(self.lock, ^{ 
    [self.data setObject:status forKey:@"status"]; 
}); // Use dispatch_sync() or dispatch_async() here depending on your needs 
+0

Dies scheint es behoben zu haben. Vielen Dank! – arlomedia

Verwandte Themen