このアプリケーションでは、NSURLConnection sendSynchronousRequest
というかなりの場所で、処理を完了するために余分なデータを必要とするバックグラウンドスレッドで何らかの処理が行われているなどの理由でこの問題が発生しました。このような何か:
// do some processing
NSData * data = someCachedData;
if (data = nil) {
data = [NSURLConnection sendSynchronousRequest....]
someCachedData = data;
}
// Use data for further processing
あなたは十分な大きさのコードベースを持っている場合は、別の関数にそれを壊すことはなんとか望ましい(または単にないではないかもしれない、それを行うと同じ流れで3つの別の場所のようなものを持っている場合)。
SSL証明書のピン割り当てを行うために、私たちは接続の代理人を必要としました。私はソリューションのためにインターネットを動かしていました。すべての形式は次のようなものでした。「単に非同期を使用し、フレームワーク! "
ここケースでは誰もが、私が行ったように見てくる投稿
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse *__autoreleasing *)response error:(NSError *__autoreleasing *)error
{
static NSOperationQueue * requestsQueue;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
requestsQueue = [[NSOperationQueue alloc] init];
requestsQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;
});
NSCondition * waitLock = [NSCondition new];
[waitLock lock];
__block NSError * returnedError;
__block NSURLResponse * returnedResponse;
__block NSData * returnedData;
__block BOOL done = NO;
[NSURLConnection sendAsynchronousRequest:request
queue:requestsQueue
completionHandler:^(NSURLResponse * response, NSData * data, NSError * connectionError){
returnedError = connectionError;
returnedResponse = response;
returnedData = data;
[waitLock lock];
done = YES;
[waitLock signal];
[waitLock unlock];
}];
if (!done) {
[waitLock wait];
}
[waitLock unlock];
*response = returnedResponse;
*error = returnedError;
return returnedData;
}
:まあ、sendSynchronousRequest
はこれが基本となる非同期接続でそれを再現する方法である理由のために存在します。
NSURLConnection sendAsynchrounousRequest
は、代理人などでNSURLConnection
オブジェクトを作成するなど、非同期要求の送信に使用する方法に置き換えることができます。
こんにちは、 よろしいですか。しかし、私が取り組んでいるビットは、要求が完了するまで他のスレッドで待つ/ブロックする方法です。 ありがとうございます。 – denton
@dentonあなたはブロックしたくありません。要求が完了すると、メイン(または他の)スレッドに通知します。 NSNotificationCenterは1つの方法です。 –