Chúng tôi đã cố gắng gỡ lỗi một vấn đề đa ngữ cảnh/luồng dữ liệu lõi trong đó hợp nhất thông báo lưu dữ liệu lõi vào chủ đề chính NSManagedObjectContext
của chúng tôi là gián đoạn ứng dụng. Điều này đang giảm ~ 2% số phiên ứng dụng của chúng tôi và chúng tôi đang thua lỗ về cách giải quyết vấn đề này. Chúng tôi thực sự đánh giá cao bất kỳ hướng dẫn hoặc lời khuyên chung nào về những gì có thể gây ra sự cố này.EXC_BAD_ACCESS khi hợp nhấtThay đổiFromContextDidSaveNotification
Chúng tôi có một thiết lập Core Data trông như thế này:
N.B. Đây là mặc định ngăn xếp Core Data trong Magical Ghi v2.3 tạo từ [MagicalRecord setupAutoMigratingCoreDataStack]
Đây là kịch bản mà ứng dụng của chúng tôi là đâm:
- yêu cầu HTTP trả về JSON
- JSON được phân tách vào
NSManagedObject
s (một số thực thể mới, một số đơn vị cập nhật) trên gốc Saving Context - gốc Saving Context tiết kiệm đến cửa hàng khăng khăng
NSManagedObjectContextDidSaveNotification
được phát bởi Dữ liệu cốt lõi. Ngữ cảnh mặc định trên hàng đợi chính quan sát điều này và gọimergeChangesFromContextDidSaveNotification:
với các thay đổi về chủ đề chính củaNSDictionary
.- Lỗi treo khi
objectID
được gửi tới một đối tượng không hợp lệ (rất có thể làNSManagedObject
đã được deallocated).
này đang xảy ra bên trong việc thực hiện riêng của NSManagedObjectContext
mergeChangesFromContextDidSaveNotification:
vì vậy không thể cho chúng tôi để xem những gì đã thực sự đi sai ở đây; tất cả những gì chúng ta có thể nói tại thời điểm này là một vật thể nên tồn tại, thì không.
này chỉ xảy ra trên một phần trăm nhỏ của Core dữ liệu tiết kiệm, chỉ ra rằng có thể không phải là một lỗi cơ bản trong Core Data → API chồng của chúng tôi. Hơn nữa, không có dấu hiệu cho thấy kích thước hoặc loại thay đổi (chèn/cập nhật/xóa) trong bối cảnh thay đổi có ảnh hưởng đến khả năng xảy ra sự cố.
Loại MOC nào đồng thời sử dụng? Và bạn đang sử dụng 'performBlock:' hoặc 'performBlockAndWait:' khi hợp nhất các thay đổi? –
MoC mặc định sử dụng loại đồng thời hàng đợi chính và MoC lưu gốc sử dụng loại đồng thời hàng đợi riêng tư. Bất kỳ sự tương tác nào với bất kỳ hàng đợi riêng nào trong ứng dụng đều sử dụng performBlock hoặc performBlockAndWait. Theo Tài liệu của Apple, chúng tôi không tương tác với bối cảnh Mặc định thông qua khối thực hiện, tuy nhiên chúng tôi đảm bảo rằng chúng tôi không bao giờ tương tác với nó khi chúng tôi không nằm trong chuỗi chính. – JConway
Chỉ cần 2ct của tôi; Tôi đã có một vấn đề như vậy một lần trong khi làm tất cả mọi thứ bởi cuốn sách, và nó được gây ra bởi một 'NSLog()' của đối tượng 'NSNotification' (hoặc thuộc tính' userInfo' của nó). Kể từ đó, tôi chỉ làm 'mergeChangesFromContextDidSaveNotification:' ngay lập tức theo sau là 'save' trên ngữ cảnh, không chạm vào thông báo theo bất kỳ cách nào khác. Kể từ đó tôi chưa bao giờ thấy nó segfault một lần nữa. – mvds