2013-07-23 35 views
5

Tôi đã đọc một số bài viết về NSIncrementalStore và tôi vẫn còn bối rối về toàn bộ khái niệm. Trong post này chúng ta có thể đọc thấy rằng:NSIncrementalStore - Sử dụng dữ liệu cục bộ và từ xa

Về cơ bản bây giờ bạn có thể tạo một lớp con tùy chỉnh của NSPersistentStore, để thay vì bạn NSFetchRequest đánh một địa phương cơ sở dữ liệu SQLite , nó chạy một phương pháp bạn xác định rằng có thể làm điều gì đó tùy ý để trả lại kết quả (như thực hiện yêu cầu mạng).

Tính đến thời điểm này, tôi nghĩ rằng NSIncrementalStore là một giải pháp hoàn hảo cho việc truy cập dữ liệu từ xa và tiết kiệm/bộ nhớ đệm nó tại địa phương. Bây giờ, tôi suy ra rằng đó là một giải pháp chỉ để truy cập dữ liệu từ xa.

Nếu tôi đúng, tôi sẽ biết ơn đối với bất kỳ lời khuyên nào về một số công việc xung quanh. Nếu tôi sai, đâu là phép thuật và cách thực hiện nó? Mỗi bài viết/bài viết/hướng dẫn về NSIncrementalStore cho thấy cách dễ dàng là để kéo dữ liệu từ máy chủ nhưng không ai trong số họ đã đưa ra ngay cả một đầu mối duy nhất về bộ nhớ đệm những thứ để xem ngoại tuyến.

Trả lời, hãy xem xét một tình huống phổ biến mà ứng dụng được cho là tải xuống một số dữ liệu từ Internet, hiển thị và lưu cục bộ để người dùng có thể sử dụng ứng dụng ngoại tuyến.

Ngoài ra, tôi không cam kết sử dụng NSIncrementalStore hoặc gì đó. Tôi chỉ đang tìm giải pháp tốt nhất và lớp này được mô tả là một trong những chuyên gia giỏi nhất trong lĩnh vực này.

Trả lời

0

Tôi cũng bối rối trong khoảng 4 hoặc 5 giờ :) Vì vậy, Lớp NSPersistentStore kế thừa của bạn là "đại diện" của bộ nhớ dữ liệu từ xa của bạn.

Vì vậy, cho truy cập dữ liệu từ xa và tiết kiệm/bộ nhớ đệm nó tại địa phương bạn cần phải làm như sau

1) Tạo lớp con của NSPersistentStore và cài đặt nó.

Giống như rằng:

YOURIncrementalStore *incrementalStore = [coordinator addPersistentStoreWithType:[YOURIncrementalStore type] configuration:nil URL:nil options:nil error:&error];

nơi điều phối NSPersistentStoreCoordinator chính của bạn

2) Sau đó, bạn cần NSPersistentStoreCoordinator khác, mà sẽ "phối hợp đại diện địa phương (incrementalStore) và bối cảnh của việc lưu trữ bên ngoài" và cung cấp đại diện lưu trữ cục bộ của bạn (như URL DB SQLite) cho nó:

[incrementalStore.backingPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]

Nhưng đừng quên rằng cửa hàng bền vững mới của bạn phải biết tất cả trước đó trạng thái cục bộ trước đó của bạn. Vì vậy, lựa chọn dict sẽ là:

NSDictionary *options = @{ NSInferMappingModelAutomaticallyOption : @YES, NSMigratePersistentStoresAutomaticallyOption:@YES }

Vì vậy, IMHO, tôi hiểu tất cả các công việc nội bộ theo cách này:

Bạn yêu cầu một số dữ liệu từ API bên ngoài. Phân tích cú pháp nó, sau đó lưu vào ngữ cảnh của trình sao lưuPersistentStoreCoordinator của bạn, sau đó nhập vào chính tệp.Vì vậy, các trạng thái của tất cả các bối cảnh sẽ bằng nhau.

Tất cả văn bản trước đó dựa trên công việc với giải pháp AFIncrementalStore.

Mã của tôi để thực hiện AFIncrementalStore với MagicalRecord:

- (void)addMRAndAFIS { 
    [MagicalRecord setupCoreDataStack]; 

    NSURL *storeURL = [NSPersistentStore urlForStoreName:[MagicalRecord defaultStoreName]]; 
    NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator defaultStoreCoordinator]; 
    NSError *error = nil; 
    NSArray *arr = coordinator.persistentStores; 
    AFIncrementalStore *incrementalStore = (AFIncrementalStore*)[coordinator addPersistentStoreWithType:[PTIncrementalStore type] configuration:nil URL:nil options:nil error:&error]; 

    NSDictionary *options = @{ NSInferMappingModelAutomaticallyOption : @YES, 
         NSMigratePersistentStoresAutomaticallyOption:@YES }; 
    arr = coordinator.persistentStores; 
    if (![incrementalStore.backingPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
    } 

Nếu chúng ta cần phải thảo luận về Cách đơn giản nhất, bạn không cần chỉ phân lớp NSIncrementalStore, thiết lập một cách chính xác (như tôi đã viết), phân tích dữ liệu, sau đó tạo ra một số bối cảnh, lưu ngày vào nó, sau đó lưu nó và hợp nhất với bối cảnh cha mẹ.

Vì vậy, bạn sẽ có 2 Cửa hàng và 2 bối cảnh và 1 StoreCoordinator.

Nếu tôi đã phạm sai lầm ở đâu đó, vui lòng tham khảo.

CSONG, hãy thử: https://gist.github.com/stevederico/5316737

+0

Tôi đã bắt đầu triển khai lớp con của riêng mình. Tôi sẽ đăng nó sớm như là mã nguồn mở, hãy theo dõi. : D – wczekalski

+1

Vì vậy, những gì? Bạn có nhận được những gì bạn muốn? –

+0

Tôi vẫn đang làm nhưng tôi sẽ sớm kết thúc. Nó sẽ có sẵn trên github của tôi - github.com/wczekalski – wczekalski

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