Я получаю случайные сбои в своих обработчиках GCDWebServer, которые обращаются к изменяемым словарям. В GCDWebServer ReadMe говорится, что обработчики «выполняются в произвольных потоках внутри GCD, поэтому особое внимание следует уделять безопасности потоков и повторному входу», и я думаю, что это моя проблема. Существует ли наилучшая практика или рекомендуемый шаблон для доступа к изменяемым свойствам родительского объекта из обработчиков?
Я не знаю, могу ли я синхронизировать потоки, так как я не создаю потоки обработчика. Кроме того, я думаю, что мог бы использовать асинхронный обработчик, затем вызвать метод в основном потоке оттуда, затем выполнить свою работу в этом методе, а затем отправить ответ, но это кажется более сложным и менее эффективным, чем необходимо.
Вот упрощенная версия моего кода:
@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];
}