在这里,我展示了一个非常简单的框架,以高效且简单的方式处理连接。只需给出一个 NSURLRequest,你将得到一个 NSURLConnection 的结果。
连接以异步方式执行,并且该框架允许您:
该框架使用 NSOperationQueue 来执行并发连接,并使用异步 NSOperation 来操作队列中的调用。
首先,让我们获取连接管理器的实例
AMConnectionManager *connectionManager = [AMConnectionManager defaultManager];
我们可以配置管理器,在执行某些连接时显示 iOS 网络活动指示器
connectionManager.showsNetworkActivityIndicator = YES;
我们还将设置默认连接队列,以同时处理最多 10 个连接
connectionManager.maxConcurrentConnectionCount = 10;
我们可以通过获取 NSOperationQueue 实例并手动配置它来手动配置连接队列
NSOperationQueue *queue = [connectionManager operationQueueForIdentifier:@"SOME_IDENTIFIER"];
// Configure the queue here
使用 nil 或 AMConnectionManagerDefaultQueueIdentifier 作为标识符来获取默认连接队列。
让我们先创建一个请求
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"SOME_URL"]];
然后,我们将使用默认连接队列发送这个请求
NSInteger connectionKey = [connectionManager performRequest:urlRequest completionBlock:^(NSURLResponse *response, NSData *data, NSError *error, NSInteger key) {
// Handle here the connection response
}];
完成块中的 key
是调用方法时返回的键(在这个案例中是 connectionKey
)。
在默认队列中执行请求有不同的方法。例如,您可以通过调用来配置进度状态和连接优先级
NSInteger connectionKey = [connectionManager performRequest:urlRequest
priority:AMConnectionPriorityNormal
progressStatus:^(NSDictionary *progressStatus) {
// Handle the progres status here
} completionBlock:^(NSURLResponse *response, NSData *data, NSError *error, NSInteger key) {
// Handle the connection response
}];
为了使用不同的队列,您应该创建一个 AMAsyncConnectionOperation 并将其传递给连接管理器,并给出所需的队列标识符
AMAsyncConnectionOperation *operation = [[AMAsyncConnectionOperation alloc] initWithRequest:urlRequest completionBlock:^(NSURLResponse *response, NSData *data, NSError *error) {
// Handle here the connection response
}];
operation.progressStatusBlock = ^(NSDictionary *info) {
// Handle the progress status here
};
NSInteger connectionKey = [connectionManager performConnectionOperation:operation inQueue:@"SOME_IDENTIFIER"];
使用 nil 或 AMConnectionManagerDefaultQueueIdentifier 作为标识符来使用默认连接队列。
我们可以更改正在进行的请求的优先级,例如
[connectionManager changeToPriority:AMConnectionPriorityVeryHigh requestWithKey:connectionKey];
另外,我们可以通过以下方式取消队列中(但未启动)的连接:
[connectionManager cancelRequestWithKey:connectionKey];
连接管理器支持暂停连接队列。您可以暂停和重新启动特定的队列或所有队列。当暂停连接队列时,所有当前队列中的连接都会被取消,并在重新启动时重新执行。
要暂停和重新启动特定的连接队列
// Pause
[connectionManager freezeQueueWithIdentifier:@"SOME_IDENTIFIER"];
// Restart
[connectionManager unfreezeQueueWithIdentifier:@"SOME_IDENTIFIER"];
要暂停和重新启动所有连接队列
// Pause
[connectionManager freeze];
// Restart
[connectionManager unfreeze];
连接管理器不支持在多个应用程序执行过程中通过持久连接队列进行冰冻。
版权(c)2013 Joan Martin,[email protected]。
任何人获得此软件及其相关文档文件(“软件”)的副本,免费获得使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许向软件提供方进行此类操作,受以下条件约束
以上版权声明和本许可声明应包含在软件的任何副本或主要部分中。
本软件提供“按原样”为基础,不提供任何形式的明示或暗示保证,包括但不限于适销性、适用于特定目的和不受侵犯的保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他原因引起的,无论这种损害是否与本软件或其使用或其他交易有关。