我々は今奇妙なcrash--を抱えている私は今、それを引き起こしているものと確信しているが、私は気づいた1奇妙なことは、すべてのクラッシュログは、2つの別々のバックグラウンドスレッド`-applicationDidBecomeActive`を2つの別々のバックグラウンドスレッドで同時にディスパッチすることは可能でしょうか?
Thread 5:
0 libsystem_kernel.dylib 0x00007fffaebac456 semaphore_wait_trap + 10
1 MyApp 0x0000000107389da1 -[OutputManager(TechSmithCloud) reloadCloudDestinations] (OutputManager+TechSmithCloud.m:59)
2 MyApp 0x000000010728c4b4 __44-[AppController applicationDidBecomeActive:]_block_invoke (AppController.m:696)
3 libdispatch.dylib 0x00007fffaea57f5f _dispatch_call_block_and_release + 12
4 libdispatch.dylib 0x00007fffaea4f128 _dispatch_client_callout + 8
5 libdispatch.dylib 0x00007fffaea51099 _dispatch_root_queue_drain + 917
6 libdispatch.dylib 0x00007fffaea50cb7 _dispatch_worker_thread3 + 99
7 libsystem_pthread.dylib 0x00007fffaec9b746 _pthread_wqthread + 1299
8 libsystem_pthread.dylib 0x00007fffaec9b221 start_wqthread + 13
Thread 13:
0 libsystem_kernel.dylib 0x00007fffaebac456 semaphore_wait_trap + 10
1 MyApp 0x0000000107389da1 -[OutputManager(TechSmithCloud) reloadCloudDestinations] (OutputManager+TechSmithCloud.m:59)
2 MyApp 0x000000010728c4b4 __44-[AppController applicationDidBecomeActive:]_block_invoke (AppController.m:696)
3 libdispatch.dylib 0x00007fffaea57f5f _dispatch_call_block_and_release + 12
4 libdispatch.dylib 0x00007fffaea4f128 _dispatch_client_callout + 8
5 libdispatch.dylib 0x00007fffaea51099 _dispatch_root_queue_drain + 917
6 libdispatch.dylib 0x00007fffaea50cb7 _dispatch_worker_thread3 + 99
7 libsystem_pthread.dylib 0x00007fffaec9b746 _pthread_wqthread + 1299
8 libsystem_pthread.dylib 0x00007fffaec9b221 start_wqthread + 13
に-applicationDidBecomeActive
を持っているということで、私はそれをREPROすることはできません
ので、私はそれが可能だかわからないか、それは実際の問題だ場合
たぶん(私は-applicationDidBecomeActive
で声明をログアウトし、それは今までの時間に一度ログアウト)セマフォー関連のことですか?
- (void)applicationDidBecomeActive:(NSNotification *)aNotification
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^
{
[[OutputManager sharedOutputManager] reloadCloudDestinations];
});
}
EDIT: コードバックトレースがシンボル__44-[AppController applicationDidBecomeActive:]_block_invoke
を持って-reloadCloudDestinations
-(void) reloadCloudDestinations
{
[self setupCloudLibrary];
TSCAccount* account = [TSCCloudServices activeAccount];
if(account.status == TSCAccount_SignedIn)
{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
__weak __typeof(self) weakSelf = self;
@try
{
AFHTTPSessionManager *test = (AFHTTPSessionManager*)[(TSCAccountHTTPSession*)[self.libraryCore valueForKey:@"sessionManager"] valueForKey:@"httpClient"];
NSLog(@"%@", test);
[self.libraryCore destinationsWithActions:NEVER_TRANSLATE(@"publish,list") completionBlock:^(NSArray *destinations, NSError *error) {
@try
{
if(error == nil)
{
[weakSelf createButtonsForNewDestinationsNotAlreadyPresent:destinations];
}
else
{
NSLog(@"destinationsWithBlock error: %@", error);
}
}
@catch (NSException* exception)
{
NSLog(@"reloadCloudDestinations - destinationWithBlock completion - An exception was thrown %@", exception);
}
@finally
{
dispatch_semaphore_signal(semaphore);
}
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
@catch (NSException* exception)
{
NSLog(@"reloadCloudDestinations - An exception was thrown %@", exception);
dispatch_semaphore_signal(semaphore);
}
}
}
ああ、意味があります。私は自分の投稿を編集してコードを組み込んだ。ネットワーク要求が完了するまでセマフォを使用してネットワーク要求が破棄されるようなネットワークリクエストを送信するようです。 ネットワークリクエストに時間がかかり、その時間内にアプリケーションが2回アクティブになると問題が発生しますか? –
そのような状況に固有の問題はありません。それは単にそれらのスレッドがまだ存在する理由です。あなたのコードが潜在的に同時に進行中の2つの要求に対処し、同時に終了する可能性があるかどうかは、私がここで知ることのできる範囲を超えています。ネットワークの要求が非常に遅いため、完了する前に切り替えて戻すことができますか?補完ブロックが決して呼び出されない '-destinationsWithActions:completionBlock:'にコードパスがある可能性が高くなります。 –