2015-09-22 13 views
10

Utilizzo di CritterCism con alcuni beta tester Sto vedendo apparire un errore più volte che non ho mai sperimentato me stesso e non riesco a replicare.NSInternalInconsistencyException accesso a _cachedSystemAnimationFence richiede il thread principale

Crittercism mi dice: NSInternalInconsistencyException accesso _cachedSystemAnimationFence presupponga il thread principale

E la linea che sta puntando è:

[picker dismissViewControllerAnimated:YES completion:^{ 

Facendo qualche lettura sulla StackOverflow sembra che tutto il codice di interfaccia utente dovrebbe essere riceve un il thread principale. L'errore che sto riscontrando è stato eseguito su un thread in background per respingereViewControllerAnimated?

Curioso perché questo errore è relativamente casuale (ad esempio non riesco a riprodurlo) e anche come lo risolvo.

- (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]; 

      }]; 

     }]; 
    }]; 

} 

risposta

4

ho paura che non ho una soluzione, ma posso offrire i dettagli di un app che si blocca allo stesso modo. Stiamo usando la piattaforma Cordova per costruire la nostra app. Questo crash sembra avvenire solo su iOS9 (su un iPhone 6 nel nostro caso) e solo quando l'utente ha installato la tastiera Swype. Vediamo il crash quando si apre/chiude la tastiera per digitare un campo di testo visualizzato attraverso il plugin InAppBrowser di Cordova, e solo qualche volta. L'eliminazione dell'applicazione Swype fa scomparire il bug. Sfortunatamente, dal momento che non abbiamo scritto nessuno degli oggetti coinvolti nell'app, stiamo avendo un debugging molto difficile. In bocca al lupo!

+0

Hai mai risolto questo problema? O qualche soluzione che puoi offrire? –

+0

È necessario il codice che sta tentando di manipolare l'interfaccia utente su un thread in background. Avvia la manipolazione dell'interfaccia utente nello snippet di codice che l'utente "iOS" ha pubblicato sopra – jungledev

24

Se è necessario chiamare qualsiasi operazione relativa all'interfaccia utente all'interno del blocco, utilizzare dispatch. Tutto ciò che interagisce con l'interfaccia utente deve essere eseguito sul thread principale. È possibile eseguire altre attività che non riguardano l'interfaccia utente all'esterno del thread principale per aumentare le prestazioni.

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

Questo è un primo approccio molto ragionevole per tentare di risolvere il problema. È noto che gli aggiornamenti dell'interfaccia utente devono sempre essere eseguiti sul thread principale. –

1

Verificare che il completamentoHandler venga effettivamente richiamato sul thread principale e non su un altro thread. Questo è in genere la causa di questo particolare problema.

+0

Buona idea darò un'occhiata – nwkeeley

1

Per Swift 3

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

Per me questa soluzione fissato quando si cerca di aprire PDFViewer quando in modalità orizzontale.

Problemi correlati