Tôi đang xây dựng ứng dụng iOS đầu tiên của mình, lý thuyết nên khá đơn giản nhưng tôi gặp khó khăn khi làm cho nó đủ khả năng chống đạn để tôi cảm thấy tự tin khi gửi ứng dụng vào App Store.Sử dụng dữ liệu cốt lõi đồng thời và đáng tin cậy
Một thời gian ngắn, màn hình chính có chế độ xem bảng, khi chọn một hàng, nó sẽ chuyển sang chế độ xem bảng khác hiển thị thông tin liên quan đến hàng đã chọn theo kiểu chi tiết chính. Dữ liệu cơ bản được lấy ra dưới dạng dữ liệu JSON từ một dịch vụ web một lần một ngày và sau đó được lưu trữ trong một kho lưu trữ dữ liệu lõi. Dữ liệu trước đó cho đến ngày đó sẽ bị xóa để ngăn chặn tệp cơ sở dữ liệu SQLite phát triển vô thời hạn. Tất cả các hoạt động liên tục dữ liệu được thực hiện bằng cách sử dụng Dữ liệu cốt lõi, với một số NSFetchedResultsController
làm cơ sở cho chế độ xem bảng chi tiết.
Sự cố tôi thấy là nếu bạn chuyển nhanh giữa màn hình chính và màn hình chi tiết nhiều lần trong khi dữ liệu mới đang được truy xuất, phân tích cú pháp và lưu, ứng dụng bị treo hoặc treo hoàn toàn. Dường như có một số loại điều kiện chủng tộc, có thể do dữ liệu Core nhập dữ liệu trong nền trong khi luồng chính đang cố thực hiện tìm nạp, nhưng tôi đang suy đoán. Tôi đã gặp sự cố khi chụp bất kỳ thông tin sự cố có ý nghĩa nào, thường là SIGSEGV sâu trong ngăn xếp Dữ liệu chính.
Bảng dưới đây cho thấy thứ tự thực tế của các sự kiện đó xảy ra khi các chi tiết xem bảng điều khiển được nạp:
Main Thread Background Thread viewDidLoad Get JSON data (using AFNetworking) Create child NSManagedObjectContext (MOC) Parse JSON data Insert managed objects in child MOC Save child MOC Post import completion notification Receive import completion notification Save parent MOC Perform fetch and reload table view Delete old managed objects in child MOC Save child MOC Post deletion completion notification Receive deletion completion notification Save parent MOC
Khi khối hoàn AFNetworking được kích hoạt khi dữ liệu JSON đã đến, một lồng nhau NSManagedObjectContext
được tạo ra và chuyển đến đối tượng "nhà nhập khẩu" phân tích dữ liệu JSON và lưu các đối tượng vào kho dữ liệu lõi. Các nhà nhập khẩu thực hiện bằng cách sử dụng phương pháp performBlock
mới được giới thiệu trong iOS 5:
NSManagedObjectContext *child = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:self.managedObjectContext];
[child performBlock:^{
// Create importer instance, passing it the child MOC...
}];
Đối tượng nhập khẩu quan sát MOC riêng của nó NSManagedObjectContextDidSaveNotification
và sau đó đăng tải thông báo riêng của mình mà được quan sát bởi bộ điều khiển chi tiết bảng điểm. Khi thông báo này được đăng, bộ điều khiển xem bảng thực hiện lưu trên MOC (mẹ) của chính nó.
Tôi sử dụng cùng một mẫu cơ bản với đối tượng "deleter" để xóa dữ liệu cũ sau khi dữ liệu mới cho ngày đã được nhập. Điều này xảy ra không đồng bộ sau khi dữ liệu mới được tìm nạp bởi bộ điều khiển kết quả được tìm nạp và khung nhìn chi tiết của bảng đã được tải lại.
Một điều tôi không làm là quan sát bất kỳ thông báo hợp nhất nào hoặc khóa bất kỳ ngữ cảnh đối tượng được quản lý hoặc điều phối viên lưu trữ liên tục nào. Đây có phải là điều tôi nên làm không? Tôi là một chút không chắc chắn làm thế nào để kiến trúc sư này tất cả một cách chính xác như vậy sẽ đánh giá cao bất kỳ lời khuyên.
Tôi thích ý tưởng này, tôi thích nó ** rất nhiều **. Nó cũng có lợi thế là việc xóa tập tin SQLite sẽ nhanh hơn rất nhiều so với việc Core Data xóa các đối tượng được quản lý trong đồ thị đối tượng, mặc dù dĩ nhiên hiệu năng xóa không quan trọng vì một cửa hàng liên tục khác sẽ vẫn được sử dụng. Tôi sẽ đưa ra cách tiếp cận này vào cuối tuần này. –