2013-05-02 42 views
1

我真的很困惑如何在Obj-C中锁定工作。用Obj-C锁定

我只是有一个网络请求,我只想同时调用一次。我想阻止所有其他呼叫,直到它收到一些数据。

我的lock类型为NSCondition和static,_sending只是一个布尔值。这是我的实现。 getWithSuccess使用AFNetworking来执行一些动作网络请求,所以我认为它可以启动多个线程或在GDC中使用一些魔术。

我的问题是,这个实现只是给我造成死锁,我需要一些提示如何正确的实现应该工作。

[lock lock]; 

while (_sending) 
    [lock wait]; 

_sending = YES; 

[self getWithSuccess:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    _sending = NO; 

    [lock signal]; 
    [lock unlock]; 


} fail:^() { 
    _sending = NO; 

    [lock signal]; 
    [lock unlock]; 
}]; 
+4

您不应该在'-wait'周围放置一个while循环。 – 2013-05-02 23:03:29

+0

我是一个真正的小白,所以对不起,如果我不明白。我只是试图删除while语句。但这只是让我的代码冻结。我应该改变更多的顺序吗? – 2013-05-02 23:10:25

+0

您不能对单线程异步API使用这种锁定。第二个传入的请求会在线程等待获取锁时阻止该线程,从而阻止执行成功/失败响应处理程序。 – Darren 2013-05-03 00:16:15

回答

1

我使用NSOperationNSOperationQueue完成与此类似。根据您的需要,您可以继承NSOperation,并在添加新类之前检查该类型的操作是否在队列中(以防止重复调用),或者只将网络请求放入队列中,并按顺序执行,通过设置maxConcurrentOperationCount的时间为1

你提到你正在使用AFNetworking,它有一个名为AFURLConnectionOperation的NSOperation子类,它也可以满足你的需要。