2016-08-04 1 views
-3
NSURL *httpsURL = [NSURL URLWithString:@"https://example.com"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:httpsURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:5.0f]; 
self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
[self.connection start]; 

while(something) { 
    // some code 
} 

を実行していません。この行動の理由は何ですか?この問題を克服する方法は何ですか?私は代表者をバックグラウンドで実行したい。どうすれば達成できますか?NSURLConnectionデリゲート方法はデリゲート(<code>willSendRequestForAuthenticationChallenge</code> EX)は、上記のコードで

ありがとうございます。

+0

NSURLConnectionは使用しないでください。これは推奨されていません。 – matt

+0

'connectionWithRequest:delegate:'が自動的に接続を開始するため、関係はありませんが、 'start'を呼び出さないでください。あなたが 'start'と呼ぶ唯一の時間は' startImmediately'を 'false'にして接続を開始する時です。しかし、あなたは 'NSURLSession'を使うべきであるので、それは疑問です。 – Rob

答えて

1

NSURLConnectionは非推奨です。 NSURLSessionを使用します。実行するときは、セッションのdelegateQueueをバックグラウンドキューに設定します。こうすることで、代理人のメッセージが届く可能性があります。今、あなたは彼らがメインスレッドに到着したいからではないので、到着するのをブロックしています。

しかし、dgatwoodと同じように、メインスレッドをブロックできる何か時間を費やしているのであれば、それも間違っています。あなたのアプリは、あなたがそのようなことをしようとするとWatchDogプロセスによって殺されます。

+0

実行ループを1回だけ実行させるだけでは不十分です。 NSURLConnectionのすべてのコールバックは、接続が開始されたスレッドと同じスレッドで行われるため、同じスレッドで多くの作業を行う場合は、接続のすべての側面を遅延させることになります。ヘッダーの送信、初期応答(ステータスコードとヘッダー)の処理、応答データの読み取り/蓄積、および要求が完了したことをアプリに伝えることもできます。処理している処理を別のスレッドに移動し、メインスレッドをまったくブロックしないようにします。 – dgatwood

+0

@dgatwood良い点は、私の答えを完全に改訂しました。 – matt

+0

nsurlconnectionは、エンタープライズ配布用であるため非推奨ですが、使用できます。主な問題は、この関数がjavascriptコードによって呼び出され、ネイティブ関数が応答を返す必要があるため、応答を取得すると(私は認証を処理している間に同期要求を実行したいと言っている)バック。これがnsurlconnectionで達成できない場合は、NSUrlSessionを使いたいと思います。このタスクを実行する方法を私に示唆してください –

関連する問題