1

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

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

Mylock是类型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];
}];
4

1 回答 1

1

我已经使用NSOperationand完成了与此类似的事情NSOperationQueue。根据您的需要,您可以NSOperation在添加新操作之前进行子类化并检查该类型的操作是否在队列中(以防止重复调用),或者只是将您的网络请求放入队列中,它们将按顺序执行,一个在时间设置maxConcurrentOperationCount为 1

您提到您正在使用 AFNetworking,它有一个名为 AFURLConnectionOperation 的 NSOperation 子类,它也可能适合您的需求。

于 2013-05-03T01:20:31.290 回答