2016-12-08 4 views
0

我々は今奇妙な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); 
     } 
    } 
} 

答えて

3

ため

は、ここでは、コードです。それは-applicationDidBecomeActive:メソッド自体ではありません。コンパイラが-applicationDidBecomeActive:メソッドに表示されるブロックに対して生成した関数の名前です。

ブロック機能は、メインキュー以外のキューにディスパッチするため、バックグラウンドスレッドに表示されます。それは問題ではなく、単なる説明です。

あなたのアプリがアクティブになり、アクティブになった後、再び有効になったため、おそらく複数回表示されます。アクティブになるたびに、-applicationDidBecomeActive:がメインスレッド上で呼び出されます。これは、ブロックをグローバルな並行キューに提出し、使用可能なCPUコアと他のシステムリソースがあると仮定すると、バックグラウンドスレッドで実行されます。

短時間で完了するのではなく、クラッシュが発生したときにブロックがまだ実行されている理由は未解決です。 -[OutputManager reloadCloudDestinations]のコードは表示されないので、知るのは難しいです。明らかに、セマフォの数がゼロ以下になるのを待つ。

+0

ああ、意味があります。私は自分の投稿を編集してコードを組み込んだ。ネットワーク要求が完了するまでセマフォを使用してネットワーク要求が破棄されるようなネットワークリクエストを送信するようです。 ネットワークリクエストに時間がかかり、その時間内にアプリケーションが2回アクティブになると問題が発生しますか? –

+0

そのような状況に固有の問題はありません。それは単にそれらのスレッドがまだ存在する理由です。あなたのコードが潜在的に同時に進行中の2つの要求に対処し、同時に終了する可能性があるかどうかは、私がここで知ることのできる範囲を超えています。ネットワークの要求が非常に遅いため、完了する前に切り替えて戻すことができますか?補完ブロックが決して呼び出されない '-destinationsWithActions:completionBlock:'にコードパスがある可能性が高くなります。 –

関連する問題