0

externa style.cssシートを含む単純なindex.htmlをダウンロードするようにNSURLRequestを設定しようとしていますが、これを行う方法がよくわかりません。リクエストの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

私は常に、このような-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 に答える
1

いずれにせよ、2つのリクエストを行う必要があります。Webブラウザで直接Webページを開いた場合でも、ブラウザはダウンロードしたHTMLで参照されているCSSファイルに対して個別の要求を行います。アプリケーションでHTMLとCSSファイルの両方が必要な場合は、最初にHTMLを取得し、次にCSSファイルを取得するために2つの別々のURLリクエストを作成する必要があります。

さて、2つのリクエストを行う必要があるからといって、それらの2つのリクエストを行うコードを常に記述する必要があるわけではありません。@Sleeが推奨するようなライブラリは、最初のリクエストの結果を自動的に取得して解析し、参照されているCSSファイルをリクエストする可能性があります。私は彼らと一緒に仕事をしたことがないので、彼らが何をサポートしているか、またはライブラリがあなたのためにこれを行うかどうかはわかりません。

検討したいことの1つは、HTMLとCSSをすべて手動で処理するのではなく、UIWebViewを介してロードすることです。UIWebViewは、HTMLファイルをUIコンポーネントにロード、解析、およびレンダリングしようとします。その過程で、参照されているCSSファイルとJavaScriptファイルをロードし、それらをレンダリングに適用します。CSSファイルをロードするために行う呼び出しをインターセプトするなどの特別なことをしたい場合は、UIWebViewDelegateプロトコルを実装し、UIWebViewのデリゲートを設定できます。そのデリゲート内で-webView:shouldStartLoadWithRequest:navigationType:、WebビューがCSSファイルをロードしているときに通知されるメソッドを実装できます。そのメソッドの呼び出しを使用して、CSSに対して発行されている要求を確認し、その要求に対して他の興味深いことを行うことができます。

于 2012-06-25T02:43:04.737 に答える
0

.cssファイルの名前を知っていますか?

もしそうなら、私は2つのリクエストを行うだけです。そうでない場合は、cssへのリンクを探して、とにかく2番目のリクエストを行うパーサーを作成する必要があります。

また、ライブラリを調べて、ダウンラディングを処理することをお勧めします。高度な機能を使用して、手間のかかる作業を実行できる優れたライブラリがたくさんあります。

これが私が使用した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 に答える