imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:srcAddres]];ダウンロード後に通知を受け取るには?
jpegを私のimagedataにダウンロードするには、たとえば2秒かかるので、ダウンロードが完了するまでアクティビティインジケータを表示します。ダウンロードが完了したら、どうすればわかりますか?
imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:srcAddres]];ダウンロード後に通知を受け取るには?
jpegを私のimagedataにダウンロードするには、たとえば2秒かかるので、ダウンロードが完了するまでアクティビティインジケータを表示します。ダウンロードが完了したら、どうすればわかりますか?
代わりに非同期URLローディングシステム(iPhone SDKではNSURLConnection
)を使用する必要があります。この作品は、このオブジェクトのデリゲートとして提案し、設定自己(コントローラ)とグラハム・リーとしてNSURLConnectionを使用するコントローラであると仮定すると、
http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html
:ここでは、Appleのドキュメントです。
次に、あなたがあなたのコントローラ(see this link for more information)に次のメソッドを宣言します。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
ロードが完了すると、デリゲートが呼び出されます。ちなみに、ネットワークアクティビティインジケータを表示するには、次のようなコードを使用できます。
UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES; // to stop it, set this to NO
ここでも、さまざまなデリゲートがお手伝いします。
「セレクタ」と呼ばれるものが必要です。
まだ同期呼び出しを使用することをお勧めしますが、別のスレッドで実行してください。これの背後にある理由は、非同期でも、現在のスレッドでデータを転送する場合でも、UIの遅さの問題が発生するためです。グローバルネットワークアクティビティインジケータを使用している場合、これは問題ではありませんが、アプリ(または他の画面再描画)のローカルインジケータがロックされているように見えます。
したがって、ImageDownloader(またはその他のもの)というクラスを作成し、そこに同期ダウンロードコールを配置して画像データを取得します。あなたのクラスのメンバーの一人として、(インターフェースで)宣言:あなたはこのクラスを作成すると
SEL successSelector;
(あなたがURLに渡し、あなたの画像データを取り戻すのinit関数を作成したいと言います下記のフォーム(つまり、SELを取り込み)、および使用してそれを呼び出す:
[ImageDownloader alloc] initWithSelector: @"http://url string" :self : @selector(yourFunction:)
]を
基本的には、ときにその完了コールバックする、オブジェクトを渡す必要があり、そのオブジェクトのメソッド。
「initWithSelector」実装は次のようになります。
-(id) initWithSelector: (NSString*)url :(id)adelegate :(SEL) successSeletor {
self.url = url;
self.delegate = adelegate;
self.sel = successSelector;
}
(「yourFunction」の後のコロンに注意してください - あなたはあなたのコールバック関数が持つパラメータごとにコロンが必要です。
のでyourFunctionためsigは次のようになります(ダウンロードが行われたときに)あなたのImageDownloaderクラスからこれを呼び出すには
-(void) yourFunction: (NSData*)imageData;
、ちょうど使用してセレクターを呼び出します。
[delegate performSelector:sel withObject:imageData];
お楽しみください!