AFNetworking同步 1.1.0

AFNetworking同步 1.1.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2017年3月

Paul Melnikow 维护。



  • Paul Melnikow

一个最小化类别,它扩展了AFNetworking以支持同步请求。

It's synchronous

使用方法

3.x

  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);

2.x

  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。

1.x

  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有很多优点

  • 当您在主线程上开始一个操作时,您会立即将控制权交还给运行循环,这样您的UI就可以保持响应。长时间阻塞主线程绝对不是一个明智之举。苹果在OS X用户体验指南中敦促我们“保持响应”。异步网络操作允许您这样做。
  • AFNetworking使得异步代码易于编写和阅读。有基于块的成败处理程序的函数,您不需要实现委托协议或提供回调的选择器。
  • AFNetworking和Grand Central Dispatch为您处理线程,因此您的代码不需要管理线程、在后台运行选择器或调用dispatch_async。您的完成块将在主线程上执行(除非您以其他方式配置操作)。
  • 您可以在等待响应时提供更好的用户体验。网络是不可靠的,尤其是对于移动用户,服务器可能会过载。如果您的用户设计为慢速连接,这一点只有异步才能做到,那么您的用户的体验会更好。

然而,在某些情况下,同步响应更好,例如当文档架构或其他框架在为您处理多线程,并期望同步结果时。此代码尝试提供一种安全可靠的方式来同步使用框架。

虽然它覆盖了默认的成功和失败队列以避免死锁,但它无法预测所有可能的情况。特别是,您不应将调用队列设置为处理队列,这会导致死锁。

主线程

您不应从主线程调用这些方法。在iOS中,如果您在主线程上运行这些方法时应用程序进入后台,可能会导致死锁,并可能使您的应用程序终止。

AFImageRequestOperation的processingBlock和自定义操作子类

此类适合AFNetworking内构建的大多数请求操作子类,它们同步处理响应对象。

如果您正在使用AFImageRequestOperation上的processingBlock,该Block在完成处理程序中包含基本处理,或您的子类在完成处理程序中执行其他异步处理,请使用using-completion-blocks分支中的版本。

所有自定义子类必须覆盖-responseObject。有关更多信息,请参阅AFHTTPRequestOperation+ResponseObject.h

开发

此项目包括集成测试,使用令人愉快的httpbin服务。要运行它们,请在TestProject文件夹中运行pod install,然后加载工作区并执行测试操作。

鸣谢

许可

此项目受MIT许可协议的许可。