我正在尝试设置NSURLRequest来下载一个简单的index.html及其externa style.css表,但我不太清楚如何做到这一点..我只是将请求的URL格式化为我想要的文件..但这必须略有不同,我找不到我想要做的好例子。
到目前为止,这是我的代码:
#pragma mark - NSURLConnection methods
- (void)htmlRequest
{
// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.mywebsite.com/index.html"]
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
// Create the NSMutableData to hold the received data.
// receivedData is an instance variable declared elsewhere.
receivedData = [NSMutableData data];
} else {
// Inform the user that the connection failed.
NSLog(@"Connection Fail");
}
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// This method is called when the server has determined that it
// has enough information to create the NSURLResponse.
// It can be called multiple times, for example in the case of a
// redirect, so each time we reset the data.
// receivedData is an instance variable declared elsewhere.
[receivedData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
// inform the developer of error type
}
// This method uses methodName to determin which Initalizer method to send the response data to in EngineResponses.m
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// EngineResponses *engineResponses = [EngineResponses sharedManager];
// [engineResponses GetManufacturers:receivedData];
NSString *myString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
NSLog(@"%@", myString);
}
你可以看到我直接调用index.html ..我想知道如何格式化我的请求所以我得到了index.html以及style.css
任何帮助将不胜感激。
答案 0 :(得分:1)
我总是创建一个新的数据结构,它具有-connection属性和-request属性,就像这样
@interface connectionWrapper : NSObject
@property(retain) NSURLRequest *request
@property(retain) NSURLConnection *connection
通过将此数据结构保留在可变数组中,您可以通过迭代数组来区分回调方法中的连接,并将每个connectionWrapper实例的-connection属性与回调方法的connection
参数进行比较(如果它们匹配) (指向同一个对象),然后您可以检索connectionWrapper实例的-request属性,然后检索NSURLRequest实例的-url属性。
由于我不是母语为英语的人,我认为代码是一个更好的导师。
-(NSURLRequest*)getRequestByConnection:(NSURLConnection*)connection
{
for(connectionWrapper *w in theArrayContainingAllConnectionWrappers)
{
if(w == connection)
return w.request;
}
}
在回调方法中:
-(void)connection:(NSURLConnection*)connection didReceiveResponse(NSURLResponse*)response
{
NSURLRequest *request = [self getRequestByConnection:connection];
NSURL *url = [request url];
/*apply different approach to different url/*
}
PS:非常难过NSURLConnection没有-request属性,因此我们可以轻松检索与连接相关的请求。
答案 1 :(得分:1)
无论如何,您必须提出2个请求。即使您直接在Web浏览器中打开网页,浏览器也会对其下载的HTML中引用的CSS文件单独发出请求。如果您的应用程序需要HTML和CSS文件,那么您希望它发出2个单独的URL请求,首先获取HTML然后获取CSS文件。
现在,仅仅因为需要进行2次请求,这并不意味着您将始终需要编写发出这2个请求的代码。可能是像@Slee推荐的那些库自动获取第一个请求的结果,将它们解析出来,并对任何引用的CSS文件发出请求。我没有和他们合作过,所以我不确定他们支持什么,或者是否有任何图书馆会为你做这件事。
您可能想要考虑的一件事是通过UIWebView加载HTML和CSS,而不是手动处理它。 UIWebView将尝试将HTML文件加载,解析和呈现到UI组件中。在此过程中,它将加载引用的CSS和JavaScript文件并将其应用于其渲染。如果你想做一些特别的事情,比如拦截它加载CSS文件的调用,你可以实现UIWebViewDelegate
协议并设置UIWebView的委托。在该委托中,您可以实现-webView:shouldStartLoadWithRequest:navigationType:
方法,以便在Web视图加载CSS文件时收到通知。您可以使用对该方法的调用来查看为CSS发出的请求,并对请求执行其他有趣的操作。
答案 2 :(得分:0)
如果是这样的话,我只会发出2个请求,否则你将不得不编写一个解析器来查找到css的链接并反正发出第二个请求。
我还建议调查一个库来处理这些东西的下载 - 很多很棒的库,可以通过高级功能为您提供繁重的工作。
这是我用过的3个:
http://blog.mugunthkumar.com/coding/ios-tutorial-advanced-networking-with-mknetworkkit/