具有单例的多个 NSURLConnection sendAsynchronous 请求 class
Multiple NSURLConnection sendAsynchronous requests with a singleton class
我正在使用主从控制器。在主列表中有 5 个项目。选择每个项目时,都会进行异步调用。
有一个 SingleTon class,它处理所有网络调用。
[[MyNetwokCommunication connectionInstance]
makeRequest:"url1" delegate:self];
[[MyNetwokCommunication connectionInstance] makeRequest:"url2" delegate:self];
makeRequest:delegate:
中的实际实现是 [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediatley:YES]
。
那么,这是处理单例网络连接的正确方法吗class,因为它可能会覆盖另一个请求的数据部分。
我不会那样做。
iOS 上序列化事物的最佳范例是 NSOperationQueue。您可以创建一个并发为 1 的队列,然后将您的 NSURLConnection 或 NSURLSession 子级作为 NSOperations 排队。
这使您可以做一些巧妙的事情,例如创建依赖于其他操作成功的操作。
这里是队列的创建:
@property (strong, nonatomic) NSOperationQueue *queue;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_queue = [[NSOperationQueue alloc] init];
[_queue setMaxConcurrentOperationCount:1];
});
然后创建网络操作:
// HTTPOperation.h
#import <Foundation/Foundation.h>
@interface HTTPOperation : NSOperation
@end
//
// HTTPOperation.m
//
#import "HTTPOperation.h"
@implementation HTTPOperation
- (void) main
{
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];
if (error == nil)
{
// Parse data here
NSLog(@"Completed successfully");
}
}
@end
执行操作:
- (IBAction)queueHTTP {
HTTPOperation *op = [HTTPOperation new];
[self.queue addOperation:op];
}
您可以从任何地方将任意数量的队列排队,它们将连续执行。我推荐观看关于 Advanced NSOperations 的 WWDC 视频:
https://developer.apple.com/videos/wwdc/2015/?id=226
信息量很大。
有很多方法可以处理它。不幸的是,NSURLConnection 不能用作字典中的键这一事实让生活变得特别悲惨。
假设您仍然不需要支持 iOS 6 及更早版本(或 OS X v10.8 或更早版本),最好的办法是放弃 NSURLConnection 以使用 NSURLSession。然后使用基于块的调用来发出请求并处理响应。与 NSURLConnection 对象不同,您可以将 NSURLSessionTask 对象用作字典键,这使得跟踪哪些数据来自哪个请求变得容易,并存储其他对象或与该请求关联的其他数据(例如存储 UI 单元格数据应该放在哪里)。
如果您必须使用 NSURLConnection 来支持较旧的操作系统,您可以考虑子类化 NSURLRequest 并添加额外的数据。请注意,这种替代方法 not 与 NSURLSession 一起工作,并且您需要提供自己的重定向处理程序,否则无论何时发生重定向,您最终都会返回通用的 NSURLRequest 对象, IIRC。或者您可以在连接对象上添加 Objective-C 关联对象。 (至少我 99% 确定这有效。)
我正在使用主从控制器。在主列表中有 5 个项目。选择每个项目时,都会进行异步调用。
有一个 SingleTon class,它处理所有网络调用。
[[MyNetwokCommunication connectionInstance]
makeRequest:"url1" delegate:self];
[[MyNetwokCommunication connectionInstance] makeRequest:"url2" delegate:self];
makeRequest:delegate:
中的实际实现是 [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediatley:YES]
。
那么,这是处理单例网络连接的正确方法吗class,因为它可能会覆盖另一个请求的数据部分。
我不会那样做。
iOS 上序列化事物的最佳范例是 NSOperationQueue。您可以创建一个并发为 1 的队列,然后将您的 NSURLConnection 或 NSURLSession 子级作为 NSOperations 排队。
这使您可以做一些巧妙的事情,例如创建依赖于其他操作成功的操作。
这里是队列的创建:
@property (strong, nonatomic) NSOperationQueue *queue;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_queue = [[NSOperationQueue alloc] init];
[_queue setMaxConcurrentOperationCount:1];
});
然后创建网络操作:
// HTTPOperation.h
#import <Foundation/Foundation.h>
@interface HTTPOperation : NSOperation
@end
//
// HTTPOperation.m
//
#import "HTTPOperation.h"
@implementation HTTPOperation
- (void) main
{
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];
if (error == nil)
{
// Parse data here
NSLog(@"Completed successfully");
}
}
@end
执行操作:
- (IBAction)queueHTTP {
HTTPOperation *op = [HTTPOperation new];
[self.queue addOperation:op];
}
您可以从任何地方将任意数量的队列排队,它们将连续执行。我推荐观看关于 Advanced NSOperations 的 WWDC 视频:
https://developer.apple.com/videos/wwdc/2015/?id=226
信息量很大。
有很多方法可以处理它。不幸的是,NSURLConnection 不能用作字典中的键这一事实让生活变得特别悲惨。
假设您仍然不需要支持 iOS 6 及更早版本(或 OS X v10.8 或更早版本),最好的办法是放弃 NSURLConnection 以使用 NSURLSession。然后使用基于块的调用来发出请求并处理响应。与 NSURLConnection 对象不同,您可以将 NSURLSessionTask 对象用作字典键,这使得跟踪哪些数据来自哪个请求变得容易,并存储其他对象或与该请求关联的其他数据(例如存储 UI 单元格数据应该放在哪里)。
如果您必须使用 NSURLConnection 来支持较旧的操作系统,您可以考虑子类化 NSURLRequest 并添加额外的数据。请注意,这种替代方法 not 与 NSURLSession 一起工作,并且您需要提供自己的重定向处理程序,否则无论何时发生重定向,您最终都会返回通用的 NSURLRequest 对象, IIRC。或者您可以在连接对象上添加 Objective-C 关联对象。 (至少我 99% 确定这有效。)