一个iOS应用程序的最佳体系结构,使许多networking请求?
我正在重新思考我正在开发的一个大型应用程序的请求架构的方法。 我目前正在使用ASIHTTPRequest来实际发出请求,但由于我在不同的视图控制器中采取了许多不同的操作,因此我需要许多不同types的请求,所以我正在尝试制定组织这些请求的最佳系统。
我目前正在构build由应用程序委托保留的单身“请求者”,并围绕收听需要发出请求的NSNotifications进行聆听。 他们提出请求,收听响应,并发送一个新的NSNotification与响应数据。 这解决了我的大部分问题,但并不优雅地处理失败的请求或同时请求到同一个单身人士请求。
任何人都有成功的devise一个清晰的面向对象的架构,用于在iOS应用程序中进行多种不同types的请求?
在尝试了几种方法之后,这是一个给我优秀结果,容易logging,理解,维护和扩展的架构:
- 我有一个单一的对象来照顾networking连接,我们称之为“networkingpipe理器”。 通常这个对象是一个单例(使用Matt Gallagher的cocoa单例macros创build )。
- 由于您使用ASIHTTPRequest(我总是这样做,美妙的API),我添加一个ASINetworkQueue伊娃在我的networkingpipe理器。 我使networkingpipe理员成为该队列的代表。
- 我为我的应用程序需要的每种networking请求(通常为每个后端REST交互或SOAP端点)创buildASIHTTPRequest的子类。 这有另一个好处(详情见下文:)
- 每当我的一个控制器需要一些数据(刷新,viewDidAppear等)时,networkingpipe理器创build所需的ASIHTTPRequest子类的实例,然后将其添加到队列中。
- ASINworkworkQueue负责带宽问题(取决于您是否在3G,EDGE或GPRS或Wifi,您有更多的带宽,并且可以处理更多的请求等)。 这是由排队,这是很酷的(至less,这是我明白这个队列的事情之一,我希望我没有错误:)。
- 每当请求完成或失败,networkingpipe理器被调用(记住,networkingpipe理器是队列的委托)。
- networkingpipe理员不知道如何处理每个请求的结果; 因此,它只是在请求中调用一个方法! 请记住,请求是ASIHTTPRequest的子类,因此您可以放置pipe理请求结果的代码(通常是将JSON或XML反序列化为实际对象,触发其他networking连接,更新Core Data存储库等)。 把代码放到每个单独的请求子类中,使用一个具有通用名称的多态方法跨请求类,使得debugging和pipe理IMHO非常容易。
- 最后,我使用通知通知上面的控制器关于有趣的事件。 使用委托协议并不是一个好主意,因为在你的应用程序中,通常有许多控制器和你的networkingpipe理器交谈,然后通知变得更加灵活(你可以有多个控制器响应相同的通知等等)。
无论如何,这是我已经做了一段时间,坦率地说,它工作得很好。 我可以水平扩展系统,添加更多的ASIHTTPRequest子类,因为我需要它们,networkingpipe理器的核心保持不变。
希望能帮助到你!
这是我通常如何做的。 我也有一个单身人士的对象用于提出networking请求。 对于必须经常进行的请求,我有一个接受AFHTTPRequestOperations(或AFJSONRequestOperations)的NSOperationQueue,因为我通常使用AFNetworking进行请求。 对于这些,在请求成功或失败时会执行一个completionBlock和failureBlock属性。 在我的单例对象上,我将有一个方法来启动一个特定的networking请求,并作为该方法的参数,我会包括一个成功和失败块,可以传递到方法中定义的块。 这样,整个应用程序就可以发出一个networking请求,并且该点处的应用程序的范围可以被传递给该方法的块中的单例使用。 例如…(使用ARC)
@implementation NetworkManager -(void)makeRequestWithSuccess:(void(^)(void))successBlock failure:(void(^)(NSError *error))failureBlock { NSURL *url = [NSURL URLWithString:@"some URL"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { [responseObject doSomething]; if (successBlock) dispatch_async(dispatch_get_main_queue(), successBlock); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (failureBlock) dispatch_async(dispatch_get_main_queue(), ^{ failureBlock(error); }); }]; [self.operationQueue addOperation:op]; } @end
而且,你总是可以让成功模块采取任何你需要传递的参数。
满载的项目是一个很好的阅读。
试用STNetTaskQueue ,它可以使你的请求可重用和可维护。