他に何もない場合はstart
、 と一緒に呼び出さないでくださいinitWithRequest:delegate:
。これにより、リクエストがすでに開始されているため、手動で を呼び出すstart
と、2 回目の開始が試行され、多くの場合、非生産的な結果が生じます。
その 3 番目のパラメーターで呼び出したstart
場合にのみ呼び出す必要があります。initWithRequest:delegate:startImmediately:
NO
また、この接続がメイン スレッド以外のキューで呼び出された場合、NSURLConnectionDelegate
およびNSURLConnectionDataDelegate
メソッドが呼び出されないこともあります。ただし、繰り返しますが、バックグラウンド スレッドでも UI を更新するべきではないため、バックグラウンド スレッドでこれを実行しようとしているわけではないと思います。
したがって、バックグラウンド スレッドからこれを行う場合は、次のようにします。
// dispatch this because UI updates always take place on the main queue
dispatch_async(dispatch_get_main_queue(), ^{
[UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
});
// now create and start the connection (making sure to start the connection on a queue with a run loop)
NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:video_link1]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[connection start];
上を使って[NSRunLoop mainRunLoop]
います。一部の実装 (AFNetworking など) では、アプリが別の実行ループを明示的に開始した別のスレッドを使用します。ただし、主なポイントは、start
と組み合わせてのみ使用し、現在のスレッドの実行ループ以外で実行する場合startImmediately:NO
にのみ使用することです。startImmediately:NO
すでにメイン キューからこれを実行している場合は、次のようになります。
[UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:video_link1]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
// [connection start]; // don't use this unless using startImmediately:NO for above line