2012-03-20 5 views
-1

以下は、UIActivityIndi​​catorを表示しているときにサーバーからデータを取得するために使用しているメソッドです。私は、これらのメソッドをアプリケーションデリゲートに入れて、他のクラスから呼び出しようとしていますが、JSONDataを返す方法はわかりません。誰でもこれを助けることができますか?objective-c:サーバーからデータを返す

-(void)startProcess:(NSString *)buildURL{ 


UIActivityIndicatorView *aInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActionSheetStyleBlackTranslucent]; 

[aInd setFrame:CGRectMake(0, 0, 50, 50)]; 
[aInd startAnimating]; 

// then call the timeCOnsumingmethod in separate thread. 
[NSThread detachNewThreadSelector:@selector(getData:) toTarget:self withObject:buildURL]; 
} 

- (void)getData:(NSString *)buildURL{ 


NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

// Query our database for a restaurant's menus 
NSURL *url = [NSURL URLWithString:buildURL]; 
NSError *e; 
NSString *jsonreturn = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&e]; 

NSData *jsonData = [jsonreturn dataUsingEncoding:NSUTF32BigEndianStringEncoding]; 
// NSError *error = nil; 

[self performSelectorOnMainThread:@selector(endProcess:) withObject:jsonData waitUntilDone:YES]; 
[pool release]; 

//return jsonData; 
} 

- (IBAction)endProcess:(NSData *)jsonData{ 
// ?????????? 
return jsonData; 
} 
+0

Hmm ...畳み込まれた 'detachNewThreadSelector:toTarget:withObject:ではなく' performSelector ... 'を前後に実行するよりはるかに理にかなっています。 NSURLRequestやサードパーティのネットワーキングライブラリを非同期的に使用する例をいくつか紹介します。 [ここにある](http://mobileorchard.com/tutorial-jsonover-http-on-the-iphone/) – FluffulousChimp

+0

このチュートリアルは素晴らしいですが、私は別のクラスにこれらのメソッドを実装するように変更する方法を教えてください? – Apollo

答えて

4

あなたのアプローチが間違っている理由は分かりません。ここではあなたが何をしたいです:非同期NSDictionaryのかNSArrayの

  • に受け取ったJSONをデコードするデータ
  • 使用NSJSONSerializationを取得するためにUIActivityIndi​​catorView
  • 使用NSURLConnectionを

    • 追加UIActivityIndi​​catorView
    を削除します

    これはデリゲートオブジェクトをとる別のクラスとして実装するのが最善の方法です。デリゲートが「開始されたネットワークアクティビティ」(デリゲートがスピナービューを追加するために使用できる)や「受信データ」(デコードされたオブジェクトをデリゲートに渡す - デリゲートが削除する可能性があるスピナー)。

    このアプローチの利点の1つは、オブジェクトが解放されたときに接続/要求がキャンセルされるように簡単に設定できることです。次に、リクエストオブジェクトをデリゲートのプロパティとして格納します。デリゲートがなくなると、要求がキャンセルされ、正しくキャンセルされます。

  • +0

    大丈夫です。これらのメソッドを使用して独自のデリゲートを作成する方法に関するチュートリアルはありますか?このデリゲートを取るサンプルプロトコルを提供できますか?どうもありがとう! – Apollo

    +1

    @jsdが参照しているものの目安として、Cocoaの使い慣れたデリゲートプロトコルの一部を見てください。例えば、 'UITableViewDelegate'です。デリゲートへの参照を保持する別のダウンローダクラス(ビューコントローラなど)を作成します。そのデリゲートは、ダウンローダクラスインターフェイスファイルまたは別のファイルとして宣言するプロトコルに準拠しています。あなたのプロトコルメソッドには ' - (void)downloaderDidBeginDownload:(id)downloader'などのものが含まれます。 – FluffulousChimp

    +0

    これはプロトコルを必要とするmodalviewを表示する方法と似ていますか? – Apollo

    関連する問題