首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从GCDWebServer请求处理程序访问可变数据

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

Stack Overflow用户
提问于 2016-06-03 20:44:59
回答 1查看 361关注 0票数 0

我的GCDWebServer处理程序中偶尔会出现崩溃,这些处理程序访问可变字典。GCDWebServer ReadMe说处理程序“在GCD内的任意线程上执行,所以必须特别注意线程的安全性和可重入性”,我认为这是我的问题。是否有从处理程序访问父对象的可变属性的最佳实践或推荐模式?

我不知道是否可以在线程之间同步,因为我没有创建处理程序线程。另外,我想我可以使用一个异步处理程序,然后从那里调用主线程上的一个方法,然后用该方法完成我的工作,然后发送响应,但是这看起来比必要的复杂和效率低。

下面是我的代码的简化版本:

代码语言:javascript
复制
@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];
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-04 05:50:01

在创建data字典之后,您是否正在对它进行变异?如果是这样的话,那就解释了撞车的原因。

必须使用锁防止对data字典的并发访问。最简单的方法是通过GCD。

代码语言:javascript
复制
@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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37623105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档