从 GCDWebServer 请求处理程序访问可变数据
Accessing mutable data from a GCDWebServer request handler
我的 GCDWebServer 处理程序偶尔会崩溃,这些处理程序访问可变字典。 GCDWebServer 自述文件说处理程序 "are executed on arbitrary threads within GCD so special attention must be paid to thread-safety and re-entrancy,",我认为这是我的问题。从处理程序访问父对象的可变属性是否有最佳实践或推荐模式?
我不知道是否可以在线程之间同步,因为我没有创建处理程序线程。另外,我想我可以使用异步处理程序,然后从那里调用主线程上的方法,然后在该方法中完成我的工作,然后发送响应,但这似乎比必要的更复杂且效率更低。
这是我的代码的简化版本:
@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];
}
您是否在 data
创建字典后 改变它?如果是这样就可以解释崩溃。
您必须使用锁来防止对 data
词典的并发访问。最简单的方法是通过 GCD 例如
@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
我的 GCDWebServer 处理程序偶尔会崩溃,这些处理程序访问可变字典。 GCDWebServer 自述文件说处理程序 "are executed on arbitrary threads within GCD so special attention must be paid to thread-safety and re-entrancy,",我认为这是我的问题。从处理程序访问父对象的可变属性是否有最佳实践或推荐模式?
我不知道是否可以在线程之间同步,因为我没有创建处理程序线程。另外,我想我可以使用异步处理程序,然后从那里调用主线程上的方法,然后在该方法中完成我的工作,然后发送响应,但这似乎比必要的更复杂且效率更低。
这是我的代码的简化版本:
@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];
}
您是否在 data
创建字典后 改变它?如果是这样就可以解释崩溃。
您必须使用锁来防止对 data
词典的并发访问。最简单的方法是通过 GCD 例如
@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