下ProのiPadのアプリをフリーズ:NSRunLoopは、私はこのようになりますカスタム動作の内部同期要求を得たiOS10
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession* session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *_data, NSURLResponse *_response, NSError *_error)
{
self->data = [_data retain];
self->tempResponse = _response;
self->tempError = [_error retain];
self->done = true;
}];
[task resume];
// wait until the connection has finished downloading the data or the operation gets cancelled
while (!self->done && !self.isCancelled)
{
[[NSRunLoop currentRunLoop] run];
}
このコードはかなり古いですが、いくつかのiOSのバージョンによって働いている(一部だけでNSURLConnectionを置き換えますポイント)。今iPad ProのiOS 10の下でこのコードは私のアプリをフリーズします。私は、バックグラウンドにアプリを入れて、それを再び開くと、それは再び実行されます。また、私が[task resume]
とself->data = [_data retain];
にブレークポイントを置くと、フリーズはまったく起こりません。
私は実行ループへのNSLogを追加することで、コード内でそれを修正する1つの方法を見つけ:
while (!self->done && !self.isCancelled)
{
NSLog(@"BLAH!");
[[NSRunLoop currentRunLoop] run];
}
これはかなりのパフォーマンスを食べると、すべてのNSLogsが除去されるので、長期的に役立つことはありませんリリース構成用。
このバグを修正する方法が必要です。コードが古すぎるかもしれないし、新しい方法があるかもしれませんが、私は分かりません。どんな助けもありがとうございます。
... – Volker
私はrunUntilを試してみました:とRUNMODE:beforeDate:すでに、何も仕事をしたん:(一般に –
、あなたがdispatch_semaphoreまたはディスパッチグループを使用してオフにおそらく優れています –