2012-03-05 4 views
0

こんにちは、これは私の最初の投稿となり、Objective-Cの新機能です。私はたくさんの読書をしていて、多くのグーグルと多くの私の答えがこのサイトから来ています。だから、今私は本当に私は専門家に尋ねた時間だと思って立ち往生している。NSURLConnectionからブロッキングなどを使用してデータを取得する

私は基本的には、与えられたURLから生のHTMLデータを取得して、情報として解析できるようにしようとしています。私はすべての解析をソートして、生のHTMLを取得することができますが、私はそれを使用できるように、データがNSURLConnectionから到着している間にプログラムを停止させる方法を理解するのに苦労しています。現在のところ、私のプログラムは接続を騒がし、保持文字列はリクエストの直後まで空のままになります。私は "シンクロナス"接続を使用する必要があると信じていますが、これはUIをフリーズしてリクエストを処理しているので、これは嫌になります。私は、私は私のクラスからit.My現在のコードを解析することができます文字列urlDataに生のHTMLを得ることを望ん

urlData = [getURLClass getURL: @"http://www.google.co.uk"]; 

は下記....

です....このようにそれを呼び出すようにしようとしています
//Create the request 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]]; 

//Open NSURLConnection with 'request' 
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    //If we receive something 
    if (data) { 
     //Pass and decode to string 
     receivedData = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
     NSLog(@"Received HTML: %@", receivedData); 
    } 

    //Something went wrong 
    else { 
     // ToDO: Sort out any errors 

    } 
}]; 

return receivedData; 

ログを実行すると、「受信HTML:nil」と表示され、戻り値も空白ですが、しばらく待ってからクラスを再度呼び出すと、その前回の要求のデータが埋め込まれます。私は、データが

-(void) connectionDidFinishLoading 

にして取得された。しかし、これは私にその私が「復帰」と呼ばれたメソッドからのデータできないという問題を残して別の方法を試してみました。私が言ったように、私はObjective-Cの新機能です。私は ASIHTTPRequestのような中断されたラッパーがあることを知っていますが、他の人のクラスを使用するより簡単な答えがあると確信しています。また、答えを見つけることができるかどうかを学ぶのに役立ちます。クラスが返す前にデータが受信されている間、プログラムを待機させるだけです。私はObj-Cで歩く前に実行しようとしているかもしれませんが、私のプログラムはウェブとやり取りできなければ無意味です。

ありがとうございます。 Plasma

+0

が間違って起こっているのかを確認するだけでなく、エラーオブジェクトをロギングしてみました。 – amattn

+0

私は何がうまくいかないかを知っています、変数が返された後にデータが満たされます。私はこの出来事を止める方法を知りたい。 – Plasma

+0

私は解決策を見つけましたので、上記の[NSURLconnection sendAsynchronousRequestとReplace ... NSData * data = [NSURLConnection sendSynchronousRequest:requestResponse:&response error:&error]; – Plasma

答えて

1

私は、この種の状況に対応するクラスファイルを作成しました。

CAURLDownload.h:
http://localhostr.com/file/vGtIIpO/CAURLDownload.h

CAURLDownload.m:
http://localhostr.com/file/TAieiAE/CAURLDownload.m

基本的に、あなたは
[CAURLDownload downloadURL:URL target:self selector:@selector(finishedSelector: connection:) failSelector:@selector(failureSelector:) userInfo:userInfo];

URLがNSURLあるとのUserInfoはNSDictionaryのある呼びたいです。

基本的に、そのメソッドを適切なパラメータで呼び出し、finishedSelectorで解析を実行します。例:

[CAURLDownload downloadURL:[NSURL URLWithString:@"http://couleeapps.hostei.com"] 
        target:self 
        selector:@selector(downloadFinished:connection:) 
       failSelector:@selector(downloadFailed:) 
        userInfo:nil]; 

および方法:

- (void)downloadFinished:(NSData *)recievedData conneciton:(CAURLDownload *)connection { 
    //Parse recievedData 
    NSString *recievedString = [[[NSString alloc] initWithData:recievedData] autorelease]; 
    //Etc. 
} 

- (void)downloadFailed:(CAURLDownload *)connection { 
    NSLog(@"Download Failed!"); 
    //Do something 
} 

これは必須ポインタ(シングルトン)せずにメモリに優しい、および呼び出し可能であり、UIをロックしない五分五分の両方を有します。

+0

返信とリンクをありがとう、すでに私が試したいくつかの実験でこれを行うことができます。私の問題は、これを何度も再利用したいと思っていて、毎回異なるURLから情報の異なるビットを解析し、これらの異なる解析ルーチンを「downloadFinished」にコーディングすると、「connectionDidFinishLoading」と同じ問題が発生します。 1行のコードでURL変数をString変数に呼び出すことができるようにしたいと考えています。私は必要な情報のためにその変数を解析することができます。別のURLを呼び出します。 – Plasma

+0

私は明白にUIをロックしないことに気をつけていないと思います。URLが読み込まれている間に何らかの入力を受け付けないからです。私はこの例が、アプリケーションで他のものを使用し続けている間に、何かをバックグラウンドでダウンロードするのに良いことが分かります。 – Plasma

0

残念ながら、Appleが提供するSDKには、この超簡単にするための便利機能はありません。 NSURLConnectionを使用して、すべて自分で行う必要があります。私がやることは、NSURLConnectionを実行するラッパークラスを作成し、データが完全に受信されると、それがあなたが提供する完了ブロックを呼び出すことです。

+0

完成ブロックをどのように実装するか説明したり教えてもらえますか? – Plasma

+0

私はこの問題に関するいくつかのコメントを見てきましたが、私が理解している回答は実際には見られませんでした。実行ループや何かの言及がありました! :s明らかに私の経験不足とnoobieの状態をここに示しています!人々に役立つとすれば、私のコードのどこかにzipを投稿しても大丈夫ですが、とにかく私が達成しようとしていることをすべて理解していると思います。 – Plasma

2

あなたはNSStringの機能initWithContentsOfURLであなたがやりたいことができるはずです。また、エンコードのためNSASCIIStringEncodingかもしれない...しかし、どのような場合には、それはあなたを与える

NSError* error; 
NSString* htmlData = [[NSString alloc] initWithContentsOfURL:myURL encoding:NSUTF8StringEncoding error:&error]; 

文字列は同期しています。

EDIT:

修正しスペルinitWithContent * * OfURLは、アロケーション

+0

これをお試しいただきありがとうございました。私はXcodeのエラーでエラーが発生しました...セレクタ "initWithContentOfURL:encoding:error:"の既知のクラスメソッドはありませんが、以来、私の問題に対する答えが見つかりました。私はいつかpuplicly助けを求めて私が何日間働いてきた何かを解決する場合です! – Plasma

+0

おっと...コンテンツの後ろに 's'が付いているinitWithContentsOfURLです - スペルミスで申し訳ありません... – TheEye

+0

私はもう一度試してみましたが、代わりに 'initWithContentsOfURL'と同じエラーが表示されます。 :( – Plasma

関連する問題