一个最小化类别,它扩展了AFNetworking以支持同步请求。
pod 'AFNetworking', '~> 3.0'
pod 'AFNetworking-Synchronous/3.x'
#import <AFNetworking.h>
#import <AFHTTPSessionManager+Synchronous.h>
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSError *error = nil;
NSData *result = [manager syncGET:@"/document/123"
parameters:paramDict
task:NULL
error:&error];
如果您的同步请求是在会话管理器的完成队列上分发的,它将永远不会返回。
您在iOS上主线程上执行同步网络请求是非常不推荐的,因为它很可能在调试器外部运行时导致崩溃。在OS X上也不推荐这样做,因为它很可能导致UI延迟。
如果必须这样做,请为完成处理程序创建一个单独的队列
manager.completionQueue = dispatch_queue_create("AFNetworking+Synchronous", NULL);
pod 'AFNetworking', '~> 2.0'
pod 'AFNetworking-Synchronous/2.x'
#import <AFNetworking.h>
#import <AFHTTPRequestOperationManager+Synchronous.h>
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSError *error = nil;
NSData *result = [manager syncGET:@"/document/123"
parameters:paramDict
operation:NULL
error:&error];
目前不支持AFHTTPSessionManager。
pod 'AFNetworking', '~> 1.0'
pod 'AFNetworking-Synchronous/1.x'
#import <AFNetworking.h>
#import <AFHTTPRequestOperationManager+Synchronous.h>
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:...];
NSError *error = nil;
NSData *result = [client synchronouslyGetPath:@"/document/123"
parameters:paramDict
operation:NULL
error:&error];
在您决定使用此类别之前,考虑是否可以采用异步设计。如@mattt所写,异步是一个难以理解的概念,但它很值得精神上的投入。而不是创建获取并返回网络数据的方法,请使用块或代理方法在数据可用时调用回调。
使用异步API有很多优点
然而,在某些情况下,同步响应更好,例如当文档架构或其他框架在为您处理多线程,并期望同步结果时。此代码尝试提供一种安全可靠的方式来同步使用框架。
虽然它覆盖了默认的成功和失败队列以避免死锁,但它无法预测所有可能的情况。特别是,您不应将调用队列设置为处理队列,这会导致死锁。
您不应从主线程调用这些方法。在iOS中,如果您在主线程上运行这些方法时应用程序进入后台,可能会导致死锁,并可能使您的应用程序终止。
此类适合AFNetworking内构建的大多数请求操作子类,它们同步处理响应对象。
如果您正在使用AFImageRequestOperation上的processingBlock,该Block在完成处理程序中包含基本处理,或您的子类在完成处理程序中执行其他异步处理,请使用using-completion-blocks分支中的版本。
所有自定义子类必须覆盖-responseObject
。有关更多信息,请参阅AFHTTPRequestOperation+ResponseObject.h
。
此项目包括集成测试,使用令人愉快的httpbin服务。要运行它们,请在TestProject
文件夹中运行pod install
,然后加载工作区并执行测试操作。
此项目受MIT许可协议的许可。