2011-02-03 7 views
6

私のモデルクラスはインターネットからデータを取得する必要があります。だから私は別のスレッドで実行することにしたので、UIはフリーズしません。 だからオブジェクトは、それが最初にこのタイプの方法を使用してモデルを要求するいくつかのデータを希望する場合:他のスレッドのメインスレッドでメソッドを実行する

- (void)giveMeSomeData:(id)object withLabel:(id)label { 
objectAsking= object; 
theLabel= label; 
NSThread* thread= [[NSThread alloc] initWithTarget:self selector:@selector(getTheDataFromInternet) object:nil]; 
[thread start]; 
} 

- (void)getTheDataFromInternet { 
//getting data... 

theData= [dataFromInternet retain]; //this is the data the object asked for 
[self returnObjectToAsker]; 
} 

- (void)returnObjectToAsker { 
[objectAsking receiveData:theData withLabel:theLabel]; 
} 

私はまだ初心者だとして、それは良好なパターンだ場合、あなたが私に言うことができますか?

ありがとうございます!

+1

作成したものをメモリ管理規則に従ってリリースすることを忘れないでください。 http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.htmlあなたが示したコードから、あなたは所有していなければなりません。もしGCの下で走っていなければ、 'thread'と'データ。 –

+1

また、 'getTheDataFromInternet'のように同期しているようです。そうしないと、データを取得するのに必要なミリ秒/秒/分/時間/日の間、UIがブロックされます。それがどれほど小さいか、あなた自身のインターネット接続がどれほど素晴らしいかは関係ありません。あなたのユーザーは、データを待っている間あなたのアプリがロックアップしているのを見るでしょう。代わりに非同期的に受信するようにNSURLConnectionを作成(および所有)します。http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/(少なくとも)NSProgressIndicatorを使用して進捗状況を報告します。 –

+0

もちろん、わかりやすくするためにこれらの行を記述しないことにしました; –

答えて

12

あなたの設定はかなり正しいです。メインスレッドでネットワーク接続を開始することは決してありません。

現在のところ、-returnObjectToAskerはバックグラウンドスレッドで実行されます。

あなたはおそらく-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]に興味があります。

それとも、グランドセントラル派遣(iOSの4+、マックOS X 10.6以降)で何かしたい場合は、あなたができる:

#import <dispatch/dispatch.h> 

- (void)giveMeSomeData:(id)object withLabel:(id)label { 
    dispatch_async(dispatch_get_global_queue(0,0), ^{ 
     //this runs on a background thread 
     //get data from the internet 
     dataFromTheInternet = ...; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     [object receiveData:dataFromTheInternet withLabel:label]; 
     //this runs on the main thread. Use theData 
     }); 
    }); 
} 

ブロックは自分の環境をキャプチャしているので、あなたも持っていませんobjectlabelを象牙に保存する。 :)

+0

素早く答えていただきありがとうございます:)あなたはGCDを好むか、NSThreadを使用していますか? –

+1

@Forchita iOS 4またはOS 10.6のみをサポートすることができれば、すべてのロジックを単一の方法で保つことができるので、GCDを使用することをお勧めします。 –

関連する問題