2011-01-19 20 views
7

Mọi thứ tôi đã đọc về việc sử dụng Dữ liệu cốt lõi trên nhiều chủ đề nói về việc sử dụng nhiều trường hợp NSManagedObjectContext chia sẻ một NSPersistentStoreCoordinator. Điều này được hiểu và tôi đã làm cho nó hoạt động trong một ứng dụng sử dụng dữ liệu lõi trên luồng chính hỗ trợ giao diện người dùng và có thao tác tìm nạp nền có thể mất một lúc để chạy.Nhiều thể hiện NSPersistentStoreCoordinator có được kết nối với cùng một kho lưu trữ SQLite cơ bản không?

Vấn đề là quyền truy cập vào lưu trữ liên tục SQLite nằm dưới được tuần tự hóa bởi NSPersistentStoreCoordinator, vì vậy vẫn có những trường hợp giao diện người dùng bị chặn bởi thao tác tìm nạp nền.

Thao tác tìm nạp nền sẽ không bao giờ cập nhật dữ liệu, chỉ đọc từ đó. Tôi có thể thiết lập ngăn xếp Dữ liệu cốt lõi hoàn toàn song song (NSManagedObjectContext, NSManagedPersistentStoreCoordinatorNSManagedObjectModel) trên luồng nền được kết nối với cùng một lưu trữ SQLite cơ bản không? Có vẻ như điều này sẽ cho đồng thời hoàn toàn giữa chuỗi giao diện người dùng và thao tác tìm nạp nền.

Trả lời

6

Câu trả lời dự kiến ​​của riêng tôi cho điều này là .

Tôi khởi tạo hoạt động nền của mình bằng cách chuyển cho trường hợp NSPersistentStore. Trên sợi nền, các thuộc tính của cửa hàng này, bao gồm URL, được dùng để tạo ra một dữ liệu hoàn toàn mới Lõi ngăn xếp như thế này:

// create managed object model 
    NSURL *modelUrl = [[NSBundle bundleForClass:[self class]] URLForResource:@"..." withExtension:@"..."]; 
    NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl]; 

    // create persistent store coordinator 
    NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]; 
    NSError *error = nil; 
    [persistentStoreCoordinator addPersistentStoreWithType:[store type] 
              configuration:[store configurationName] 
                 URL:[store URL] 
                options:[store options] 
                error:&error]; 

    // create managed object context 
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init]; 
    [context setPersistentStoreCoordinator:persistentStoreCoordinator]; 
    [persistentStoreCoordinator release]; 
    [managedObjectModel release]; 

sau đó tôi thực hiện nền lấy bằng mới được tạo ra NSManagedObjectContext trường hợp này.

Mọi thứ có vẻ hoạt động tốt. Tuy nhiên, tôi vẫn chưa chấp nhận câu trả lời của chính mình, vì tôi rất muốn có ai đó cung cấp hỗ trợ hoặc mâu thuẫn với bằng chứng cho những phát hiện của tôi.

+0

Xin chào GB, điều này vẫn hoạt động tốt cho bạn? Tôi cần phải làm một cái gì đó giống như thế này nhưng tôi không tìm thấy bất kỳ câu trả lời trực tuyến. – jasongregori

+0

Tôi vẫn chưa có bất kỳ vấn đề với phương pháp này cho đến nay. – GBegen

+0

Theo tôi hiểu, SQLite hỗ trợ nhiều độc giả đồng thời và một người viết đơn lẻ. Mỗi NSPersistentStoreCoordinator sau đó sẽ là một người đọc, vì vậy đó là hoàn toàn có thể. –

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