ios - NSOperationQueue 序列化 NSURLConnection 请求

标签 ios objective-c nsurlconnection nsoperationqueue

正如很多人所做的那样,我想异步执行 NSURLConnections,但要连续执行,这样每个请求的响应都不会越过/附加到另一个请求的响应上。

我有一个 HTTP 请求助手,它不具备以下功能:

@property (nonatomic,retain) NSURLConnection *connection;
@property (nonatomic,retain) NSOperationQueue *queue;
@property (nonatomic,retain) NSURLResponse *response;
@property (nonatomic,retain) NSMutableData *responseData;

@end

@implementation HttpRequester

@synthesize delegate = _delegate;

- (id)init {
    if(self = [super init]) {
        _connection = nil;
        // create our queue
        _queue = [[NSOperationQueue alloc] init];
        _queue.maxConcurrentOperationCount = 1; // one request at a time
        _response = nil;
        _responseData = nil;
    }
    return self;
}

- (void)sendRequest:(NSURLRequest *)request {
    _connection = [[NSURLConnection alloc] initWithRequest:request
                                                  delegate:self
                                          startImmediately:NO];
    [_connection setDelegateQueue:_queue];
    [_connection start];
}

创建最大计数为 1 的 NSOperationQueue 并根据我的 NSURLConnection 设置是否足够,这样每次调用 sendRequest 都会排队NSURLConnectionDelegate 回调直到前一个完成?

如果没有,我想最直接的方法是围绕这些请求实现一个队列,我只是想更多地了解这里的行为。

谢谢。

最佳答案

由于网络请求是异步的(并且您没有使用 sendSynchronousRequest 帮助程序),因此操作在启动请求后立即完成,队列继续前进。如果您希望队列“等待”操作的异步部分,您需要实现:

- (BOOL)isConcurrent {
    return YES;
}

然后操作队列使用 KVO 来监视操作的 isFinished 方法。

也是这样:

@implementation MyOp {
     BOOL _isFinished;
} 

- (BOOL)isConcurrent {
    return YES;
}
- (BOOL)isReady {
    return YES;
}
- (BOOL)isFinished {
    return _isFinished;
}

...

然后在 didReceiveResponse 中执行您在上面所做的操作。当你 100% 完成时,做

[self willChangeValueForKey:@"isFinished"];
_isFinished = YES;
[self didChangeValueForKey:@"isFinished"];

关于ios - NSOperationQueue 序列化 NSURLConnection 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25797502/

相关文章:

ios - 如何在滚动时保持 UICollectionView Cells 的背景颜色不变?

ios - AVCaptureOutput didOutputSampleBuffer 停止被调用

iOS 在一个数组中搜索,通过另一个数组的索引匹配

objective-c - 模态 segue 无过渡

ios - 从 NSURLConnection 迁移到 NSURLSession

ios - API POST方法不将数据保存在sql server中

ios - NSURLConnection 的委托(delegate)方法,请求authenticationChallenge 不会被解雇?

java - Swift 在 Kotlin(或 Java)中的结构?同一类的多个实例,改变其变量

ios - 如何在 iOS 上更改 UISearchBar 组件的内部背景颜色

ios - iOS 中的 NSURLConnection 和基本 HTTP 身份验证