我真的很困惑Obj-C中锁定是如何工作的。
我只是有一个网络请求,我只想同时调用一次。我想阻止所有其他调用,直到它收到一些数据。
我的lock
属于NSCondition
类型而静态,_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];
}];
答案 0 :(得分:1)
我使用NSOperation
和NSOperationQueue
完成了类似的操作。根据您的需要,您可以继承NSOperation
并在添加新类型之前检查该类型的操作是否在队列中(以防止重复调用)或仅将您的网络请求放入队列中它们将在通过将maxConcurrentOperationCount
设置为1
你提到你正在使用AFNetworking,它有一个名为AFURLConnectionOperation的NSOperation子类,可能也适合你的需要。