具有单例的多个 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% 确定这有效。)