0

我正在尝试设置一个 NSURLRequest 来下载一个简单的 index.html 及其外部 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

任何帮助将不胜感激。

4

3 回答 3

1

一种或另一种方式,您将不得不提出 2 个请求。即使您直接在网络浏览器中打开网页,浏览器也会对其下载的 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 发出的请求,并对请求执行其他有趣的操作。

于 2012-06-25T02:43:04.737 回答
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 属性,以便我们可以轻松检索与连接关联的请求。

于 2012-06-25T01:35:58.937 回答
0

你知道 .css 文件的名称吗?

如果是这样,我只会发出 2 个请求,否则您将不得不编写一个解析器来查找指向 css 的链接并发出第二个请求。

我还建议研究一个库来处理东西的下载 - 很多很棒的库可以通过高级功能为您完成繁重的工作。

这是我用过的3个:

http://blog.mugunthkumar.com/coding/ios-tutorial-advanced-networking-with-mknetworkkit/

https://github.com/tonymillion/TMHTTPRequest

https://github.com/pokeb/asi-http-request

于 2012-06-25T01:36:20.297 回答