0

を起動したときに、次の 2 つのメソッドが呼び出されていませんNSURLConnection

-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

これは、作成NSURLConnectionviewDidLoadたときに機能しましたが、別の関数からこれを呼び出したときに、呼び出されたことがわかりませんcanAuthenticateAgainstProtectionSpace。これが私の作成方法ですNSURLConnection

[UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:video_link1]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
4

1 に答える 1

0

他に何もない場合は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
于 2013-09-23T04:53:26.307 に答える