2015-09-22 6 views
10

一部のベータテスターでCrittercismを使用しています私は自分自身を経験したことがなく、複製できないエラーが数回現れています。NSInternalInconsistencyException _cachedSystemAnimationFenceにアクセスするにはメインスレッドが必要

Crittercismが私に語った:NSInternalInconsistencyExceptionは_cachedSystemAnimationFenceにアクセスすると、メインスレッド

を必要とし、それが指している行がある:

[picker dismissViewControllerAnimated:YES completion:^{ 

StackOverflowの上でいくつかの読書を行うには、任意のUIコードは上の実行されなければならないことが表示されますメインスレッドdismissViewControllerAnimatedがバックグラウンドスレッドで実行されたために発生したエラーですか?

このエラーが比較的ランダムである(つまり再現できない)と、それを修正する方法が不思議です。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

    __block PHObjectPlaceholder *assetPlaceholder; 

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 

     PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"]]; 

     assetPlaceholder = changeRequest.placeholderForCreatedAsset; 

    } completionHandler:^(BOOL success, NSError *error) { 

     NSArray *photos = [[NSArray alloc] initWithObjects:assetPlaceholder.localIdentifier, nil]; 
     PHFetchResult *savedPhotos = [PHAsset fetchAssetsWithLocalIdentifiers:photos options:nil]; 

     [savedPhotos enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) { 

      NSMutableArray *images = self.event.eventAttachments; 
      if (images) { 
       [images addObject:asset]; 
      } else { 
       images = [[NSMutableArray alloc]init]; 
       [images addObject:asset]; 
      } 

      self.event.eventAttachments = images; 

      [picker dismissViewControllerAnimated:YES completion:^{ 

       NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:4]; 
       NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; 

       [self.tblChildrenNotes beginUpdates]; 
       [self.tblChildrenNotes reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; 
       [self.tblChildrenNotes endUpdates]; 

      }]; 

     }]; 
    }]; 

} 

答えて

4

私は解決策がありませんが、私は同じようにクラッシュするアプリの詳細を提供することができます。私たちはCordovaプラットフォームを使ってアプリを開発しています。このクラッシュはiOS9(このケースではiPhone 6)でのみ発生し、Swypeキーボードがインストールされている場合にのみ発生します。キーボードを開いたり閉じたりして、CordovaのInAppBrowserプラグインで表示されるテキストフィールドに入力するときにクラッシュすることがあります。 Swypeアプリケーションを削除すると、バグが消えてしまいます。残念ながら、私たちはアプリケーションに関係するobjcを書きませんでしたので、私たちはデバッグに苦労しています。がんばろう!

+0

この問題は修正されましたか?または、あなたが提供できるソリューション? –

+0

バックグラウンドスレッドでUIを操作しようとするコードが必要です。ユーザー 'iOS'が投稿したコードスニペットにUI操作をラップする – jungledev

24

すべてのUIを呼び出す必要がある場合は、ブロック内の関連操作でディスパッチを使用します。 UIとやりとりするものはすべて、メインスレッド上で実行する必要があります。メインスレッド以外のUIに関連しない他のタスクを実行してパフォーマンスを向上させることができます。

dispatch_async(dispatch_get_main_queue(), ^{ 
    // Call UI related operations 
}); 
+0

これは問題を解決するための非常に合理的な最初のアプローチです。 UI更新は常にメインスレッド上で実行されるべきであることは広く知られている。 –

1

あなたのcompletionHandlerが他のスレッドではなくメインスレッドで実際にコールバックされていることを確認します。これは、通常、この特定の問題の原因です。私にとって

+0

良いアイデアを見てみましょう – nwkeeley

1

スウィフト3については

DispatchQueue.main.async(execute: { 
     //UI Related Function 
    }); 

時に風景モードでpdfViewerを開こうとすると、固定このソリューション。

関連する問題