2011-10-25 50 views
12

Tôi nhận được lỗi sau đây trong ứng dụng của tôi:Core Data: tuyên bố là vẫn còn hoạt động

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. statement is still active with userInfo (null)

Tất cả những gì mà tôi có thể tìm thấy dường như chỉ ra tôi có thể gặp phải các vấn đề multi-threading với đối tượng dữ liệu cốt lõi của tôi quản lý bối cảnh, nhưng tôi dường như không thể tìm thấy bất cứ nơi nào trong ứng dụng của tôi, nơi đây sẽ là trường hợp. Tôi đang truy cập và quản lý ngữ cảnh đối tượng được quản lý trên một chuỗi nền. Ngữ cảnh chỉ tìm nạp và thao tác các đối tượng trên một luồng nền đó. Khi tôi phát hiện lưu vào ngữ cảnh đó thông qua NSManagedObjectContextObjectsDidSaveNotification, tôi đang hợp nhất các thay đổi vào một ngữ cảnh khác mà tôi chỉ truy cập vào chuỗi chính của mình. Khi tôi thực hiện cuộc gọi để hợp nhất các thay đổi, lỗi được ném. Rất hiếm khi điều này xảy ra, ngay cả với cùng một tập hợp dữ liệu.

Tôi đọc ở đâu đó rằng có thể 'bật xác nhận đa luồng' bằng '-com.apple.CoreData.ThreadingDebug 3', nhưng tôi chưa thể làm việc này được. Có ai biết nếu điều này là có thể? Tôi đã hy vọng điều này có thể bật một số khẳng định sẽ giúp tôi tìm thấy nơi tôi đang chơi với bối cảnh trên các chủ đề sai hoặc một cái gì đó.

Bất kỳ manh mối nào khác về những gì có thể xảy ra hoặc cách theo dõi loại vấn đề này xuống?

+1

câu trả lời của tôi có giúp được không? –

+0

Bạn đọc điều đó trong [TN2124: Mac OS X Debugging Magic] (https://developer.apple.com/library/ios/#technotes/tn2004/tn2124.html#SECCOREDATA). Bit chính là "Tính năng này yêu cầu biến thể gỡ lỗi của khung công tác". Nếu bạn có biến thể đó, bạn có thể đặt biến môi trường 'DYLD_IMAGE_SUFFIX = _debug' và nó sẽ tải' CoreData_debug' thay vì 'CoreData' cho khung công tác. Thật không may, những biến thể dường như chỉ tồn tại cho OS X 10.5.x. :( –

Trả lời

13

Tôi gặp sự cố tương tự và đã tìm ra cách để giải quyết.

Tôi đã tạo cơ chế tạo ngữ cảnh khác nhau dựa trên tên luồng (1 chủ đề = 1 ngữ cảnh).

#include <pthread.h> 
... 

    mach_port_t threadID = pthread_mach_thread_np(pthread_self()); 
    NSString *threadName = [NSString stringWithFormat:@"%x", threadID]; 
    NSManagedObjectContext *context = [singleton.threadsContexts objectForKey:threadName]; 
    if (!context) { 
     NSLog(@"Creating managed context for thread named '%@'", threadName); 
     context = [[NSManagedObjectContext alloc] init]; 
     [context setPersistentStoreCoordinator:[singleton.managedObjectContext persistentStoreCoordinator]]; 

     //initialize dictionary in your singleton if it as not been yet 
     if(!singleton.threadsContexts) 
     { 
      singleton.threadsContexts = [NSMutableDictionary new]; 
     } 
     [singleton.threadsContexts setObject:context forKey:threadName]; 
    } 

    return result; 

và sau đó, khi tôi cần một phiên bản đầy đủ của một đối tượng được quản lý trong một thread nền, tôi nhận được một bản sao của đối tượng dành riêng cho chủ đề này:

NSManagedObjectModel *myNewObject = [myBackgroundContext objectWithID:[myObject objectID]]; 

Hope câu trả lời này sẽ giúp.

+1

[[NSThread currentThread] name] trả về "" cho tôi trên iOS 7. [Câu trả lời này] (http://stackoverflow.com/a/15523049/1571490) đã cho tôi một Chuỗi chính xác. Bên cạnh đó, nó hoạt động hoàn hảo và trông giống như tất cả các vấn đề luồng dữ liệu cốt lõi của tôi đã được sửa. Cảm ơn! – fifarunnerr

+0

Hoạt động tuyệt vời! Tôi chưa thấy sự cố của mình vì tôi đã sử dụng mã này! Tôi cũng phải sử dụng kỹ thuật của fifa để lấy tên luồng. t quên khởi tạo NSMutableDictionary trong singleton của bạn ... Tôi chạy vòng quanh một chút cho đến khi tôi nhận ra rằng :: DUH :: – RyanG

+1

Đây là một câu trả lời khá cũ và cho các dự án mới hơn, tôi đang sử dụng Magical Record đã được xây dựng Hỗ trợ cho dữ liệu lõi đa luồng, tài liệu không tuyệt vời nhưng nó tiết kiệm rất nhiều thời gian khi bạn biết cách sử dụng thư viện này https://github.com/magicalpanda/MagicalRecord –

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