我需要向服务器发送一组带有一些数据的请求。后续请求中的数据将根据先前请求中的服务器响应来确定。我不想对NSURLConnection
类使用同步方法,因为它非常有限(例如,对于其中一个请求,我需要防止重定向。根据Apple Dev文档,这只能通过Delegate实现来完成)。
根据链中的哪个请求,我需要做不同的事情(向不同的类发送不同的消息)。
我现在看到的方式是,我必须为每个请求创建n个委托,或者创建一个initWithFlag
委托,然后用不同的标志创建该委托的实例,或者我需要使用类似工厂模式的东西,这与第二种工具模式非常相似。
我根本不想实现委托,我想发送尽可能少编码的请求。 我也没有看任何框架(ASIHTTPRequest等),我想用本机类做。
最好的方法是什么?
答案 0 :(得分:0)
我知道你说你不想使用第三方框架,但我真的建议AFNetworking。话虽如此,你不需要AFNetworking或任何第三方图书馆,它只会让你的生活更轻松恕我直言。
所以,我在类似场景中所做的主要是使用命令模式。当我想发送其中一个复杂的“请求”时,我初始化一个命令对象,设置所有必要的参数,然后调用execute
。我的命令对象有完成和失败处理程序/块,execute
是异步调用。
在命令中,我有不同的“步骤”,它们是有效同步的并且相互依赖。假设请求A依赖于B而B取决于C,该命令的第一步是在其自己的队列上执行A(我正在使用带有私有队列的GCD)并等待它完成。一旦A完成(成功),我继续到B并将我需要的任何结果从A传递到B.同样对于B-> C.如果任何中间请求在整个过程中失败,我可以执行failure
块并从我执行命令的位置(消费者端)处理它。如果全部成功完成,我执行success
块。
我更喜欢这种方法的封装,因为它很容易在整个项目中重复使用,所有复杂的东西都隐藏在命令的实现中。
哦,我使用回调/块的事实我不需要实现任何委托。在您使用NSURL类的情况下,您的命令对象将是任何这些实例的委托。
答案 1 :(得分:0)
毕竟我已经决定实施委托了。 绊倒我的关键事情是:
NSURLConnection
initWithRequest
方法中初始化,也可以作为父类的属性保存,没有区别。 initWithFlag
。因此,最好在初始化连接时创建委托。代表的工作时间足以在ARC下执行完整的数据传输。取消重定向的最便捷方式来自Apple的开发人员库:
-(NSURLRequest *)connection:(NSURLConnection *)connection
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse
{
NSURLRequest *newRequest = request;
if (redirectResponse)
{
newRequest = nil;
}
return newRequest;
}
请注意,由于未公开的原因,在连接有效期内会多次发送此消息。但是,如果回复不是实际重定向,则redirectResponse
将为nil
。
将请求设置为nil
将取消重定向,但NSURLConnection
将完成处理原始数据(即,将发送connectionDidFinishLoading
消息)。
您可以通过发送此消息来取消此行为:
[connection cancel];
我发现NSNotifications
是将结果传递给父类的最佳方法。