从 GCDWebServer 请求处理程序访问可变数据

Posted

技术标签:

【中文标题】从 GCDWebServer 请求处理程序访问可变数据【英文标题】:Accessing mutable data from a GCDWebServer request handler 【发布时间】:2016-06-03 20:44:59 【问题描述】:

我在访问可变字典的 GCDWebServer 处理程序中偶尔发生崩溃。 GCDWebServer 自述文件说处理程序“在 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];

【问题讨论】:

【参考方案1】:

您是否在创建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 请求读取 POST 请求的正文

需要帮助使用 GCDWebServerDataRequest 实现 GCDWebServer

GCDWebServer中不同本地资源的两条路径

如何向 GCDWebServer 请求发送两个响应

GCDWebServer 运行 -addHandlerForMethod:两次不同路径,第二次请求失败?

GCDWebServer:如何更改服务器上的文件权限以进行 WebDAV 操作? (iOS)