2015-09-22 23 views
10

Sử dụng chủ nghĩa Crittercism với một số người thử nghiệm beta Tôi thấy một lỗi xuất hiện nhiều lần mà tôi chưa bao giờ trải nghiệm bản thân và tôi không thể tái tạo.NSInternalInconsistencyTruy cập truy cập _cachedSystemAnimationFence yêu cầu chủ đề chính

Crittercism nói với tôi: NSInternalInconsistencyException truy cập _cachedSystemAnimationFence đòi hỏi các chủ đề chính

Và dòng nó được trỏ đến là:

[picker dismissViewControllerAnimated:YES completion:^{ 

Làm một số đọc trên StackOverflow có vẻ như bất kỳ mã UI nên được chạy trên chủ đề chính. Là lỗi tôi đang gặp phải vì các dismissViewControllerAnimated đã được chạy trên một chủ đề nền?

Tò mò tại sao lỗi này tương đối ngẫu nhiên (nghĩa là tôi không thể tạo lại) và cũng làm cách nào để khắc phục lỗi này.

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

      }]; 

     }]; 
    }]; 

} 

Trả lời

4

Tôi sợ tôi không có giải pháp nhưng tôi có thể cung cấp chi tiết về ứng dụng bị lỗi theo cùng một cách. Chúng tôi đang sử dụng nền tảng Cordova để xây dựng ứng dụng của mình. Sự cố này dường như chỉ xảy ra trong iOS9 (trên iPhone 6 trong trường hợp của chúng tôi) và chỉ khi người dùng đã cài đặt bàn phím Swype. Chúng tôi thấy sự cố khi mở/đóng bàn phím để nhập vào trường văn bản được hiển thị thông qua plugin InAppBrowser của Cordova và đôi khi chỉ. Xóa ứng dụng Swype làm cho lỗi biến mất. Thật không may, kể từ khi chúng tôi không viết bất kỳ objc tham gia vào các ứng dụng, chúng tôi đang có một thời gian khó khăn gỡ lỗi. Chúc may mắn!

+0

Bạn đã bao giờ sửa lỗi này chưa? Hoặc bất kỳ giải pháp mà bạn có thể cung cấp? –

+0

Bạn phải có mã đang cố gắng điều khiển giao diện người dùng trên một chuỗi nền. Quấn bất kỳ thao tác giao diện người dùng nào trong đoạn mã mà người dùng 'iOS' đăng ở trên – jungledev

24

Nếu chúng ta cần gọi bất kỳ giao diện người dùng nào Hoạt động liên quan bên trong công văn sử dụng khối. Mọi thứ tương tác với giao diện người dùng phải được chạy trên luồng chính. Bạn có thể chạy các tác vụ khác không liên quan đến giao diện người dùng bên ngoài chuỗi chính để tăng hiệu suất.

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

Đây là phương pháp tiếp cận đầu tiên rất hợp lý để cố gắng khắc phục sự cố. Nó được biết đến rộng rãi rằng cập nhật giao diện người dùng nên luôn luôn được thực hiện trên các chủ đề chính. –

1

Kiểm tra để đảm bảo rằng trình hoàn thànhHandler của bạn thực sự được gọi lại trên chuỗi chính chứ không phải một chuỗi khác. Đó thường là nguyên nhân cho vấn đề cụ thể này.

+0

Ý tưởng hay, tôi sẽ xem xét – nwkeeley

1

Đối Swift 3

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

Đối với tôi giải pháp này cố định khi cố gắng mở pdfViewer khi ở chế độ nằm ngang.

Các vấn đề liên quan