正如很多人所做的那样,我想异步执行 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/