2012-06-09 27 views
5

Tôi đang sử dụng RestKit 0.10.1 với Dữ liệu cốt lõi trên mục tiêu triển khai iOS 5.0 để xây dựng ứng dụng giao tiếp với API RESTFul tùy chỉnh. Vì kết nối ngoại tuyến rất quan trọng, tôi duy trì bộ nhớ cache dữ liệu của người dùng trong cơ sở dữ liệu CoreData cục bộ trên thiết bị.RestKit + CoreData: Cách lưu đối tượng cục bộ chỉ sau khi lưu từ xa thành công?

Bây giờ, RestKit khá tuyệt vời và nó đã được khá dễ dàng để thiết lập một RKFetchResultsTableController để dễ dàng hiển thị và duy trì dữ liệu của tôi. Tuy nhiên, có một hành vi của RestKit mà không có vẻ lý tưởng và tôi không thể tìm ra cách thay đổi.

Tôi có một kiểu gọi là 'Ghi âm'. Để tạo Bản ghi mới, tôi đang thực hiện như sau:

Recording *r = [NSEntityDescription insertNewObjectForEntityForName:@"Recording" inManagedObjectContext:[[RKObjectManager sharedManager].objectStore managedObjectContextForCurrentThread]]; 

r.name = newName; 

[[RKObjectManager sharedManager] sendObject:r toResourcePath:@"/recordings" usingBlock:^(RKObjectLoader *loader){ 
     loader.delegate = self; 
     loader.method = RKRequestMethodPOST; 
     loader.serializationMIMEType = RKMIMETypeJSON; 

     loader.serializationMapping = [RKObjectMapping serializationMappingUsingBlock:^(RKObjectMapping *serializationMapping){ 
      [serializationMapping mapAttributes:@"name", nil]; 

     }]; 

     RBMappingProvider *mappings = (RBMappingProvider *)[[RKObjectManager sharedManager] mappingProvider]; 
     loader.objectMapping = [mappings recordingObjectMapping]; 

    }]; 

Điều này tạo ra một thực thể mới của loại 'Ghi âm' và sau đó gửi thực thể đến máy chủ trong yêu cầu POST. Trong một trường hợp thành công, công trình này rất tuyệt.

Tuy nhiên, vấn đề là đôi khi máy chủ từ chối những điều này tạo ra hợp pháp. Những gì tôi tìm thấy trong những tình huống này là đã có một bản sao cục bộ của thực thể trong cơ sở dữ liệu lõi dữ liệu với một id là 0 (id là khóa chính được thiết lập bởi máy chủ).

Cách duy nhất để xóa thực thể cục bộ là bắt buộc làm mới dữ liệu cục bộ từ máy chủ.

Có cách nào để duy trì đối tượng cục bộ chỉ khi máy chủ phản hồi bằng 2xx? Cách khác, là có một cách để hoàn tác các thay đổi nếu máy chủ phản ứng với bất cứ điều gì nhưng một 2xx?

Cảm ơn,

+0

FWIW, tạo ra thực thể với Recording * r = [Ghi đối tượng] theo quy định tại các tài liệu RestKit không thay đổi hành vi ở tất cả. – apurva

+0

Bạn không có phương thức gọi lại trong RK với phản hồi của máy chủ chưa? Giữ một tham chiếu đến đối tượng và xóa nó nếu tải lên bị từ chối. – Mundi

+0

@mundi Đó là một cách tiếp cận, và nó thậm chí có thể là một phương pháp hấp dẫn hơn. Tuy nhiên, tôi đã tự hỏi nếu nó có thể tồn tại trạng thái cục bộ chỉ sau khi máy chủ chấp nhận tải trọng. Điều này sẽ dẫn đến ít mã dự phòng hơn rất nhiều. – apurva

Trả lời

0

Thật không may, vì Bản ghi là NSManagedObject, ngay cả trường hợp tạm thời của bạn cũng cần được chèn vào bối cảnh đối tượng được quản lý. @ Mundi của giải pháp duy trì các tài liệu tham khảo và xóa nó khỏi bối cảnh sau khi lỗi là giải pháp tôi sẽ sử dụng. Một chút mã bổ sung đánh bại một làm mới đầy đủ từ máy chủ.

Nâng cấp lên 0,20.x sẽ giúp việc này trở nên dễ dàng hơn. Các khối thành công và thất bại được sử dụng khi gửi một yêu cầu làm cho nó rất dễ dàng để giữ tham chiếu này và xóa nó trên thất bại. Ví dụ:

[_objectManager postObject:aMessage 
         path:@"message" 
       parameters:parameters 
        success:^(RKObjectRequestOperation * operation, RKMappingResult * mappingResult){ 
        // Success code here 
        } 
        failure:^(RKObjectRequestOperation * operation, NSError * error){ 
        [_managedObjectContext deleteObject:aMessage]; 
        [_managedObjectContext save:nil]; 
        }]; 
Các vấn đề liên quan