2011-12-07 58 views
7

Tôi có một ứng dụng đơn giản relativley mà vẫn lưu trữ dữ liệu vào tệp plist nằm trong thư mục tài liệu. Các dữ liệu tải vào một UITableView lúc khởi động. Sau đó, người dùng có thể chỉnh sửa, xóa hoặc thêm bản ghi và mọi thay đổi sẽ được lưu lại vào tệp plist.Chia sẻ tệp plist bằng iCloud

Bây giờ tôi muốn chia sẻ dữ liệu này (tệp plist) trên các thiết bị sử dụng iCloud. Tôi đã xem tài liệu và sự hiểu biết của tôi là tôi cần tạo một UIDocument để "quản lý" tệp plist.

Tôi đã xem một số hướng dẫn iCloud tuy nhiên tất cả chúng đều lưu trữ một chuỗi đơn giản trong một thuộc tính trong lớp UIDocument, chứ không phải toàn bộ tệp (như một plist).

Làm cách nào để chia sẻ tệp plist của tôi (hoặc bất kỳ tệp nào khác, cho vấn đề đó) với iCloud bằng cách sử dụng đối tượng UIDocument?

Tôi có thể chuyển đổi nội dung tệp plist thành NSData không, sau đó lưu nội dung đó vào thuộc tính trong UIDocument? Tôi có nên sử dụng NsFileWrapper để thay thế không?

Tôi dường như đang gặp khó khăn khi gói đầu quanh bản sắp xếp UIDocument/iCloud. Tôi có thể làm điều này phức tạp hơn sau đó nó thực sự là.

+0

Bạn có tìm thấy câu trả lời cho điều này không? Tôi đang xem xét điều tương tự và ứng dụng của tôi có vẻ rất giống với ứng dụng của bạn. Xin vui lòng cho tôi biết nếu bạn tìm thấy một hướng dẫn tốt. – Jackson

+0

Tôi cũng đang cố gắng thực hiện điều này.Tôi đã được sửa đổi các hướng dẫn với NSString, nhưng tôi không thể có được thiết bị thứ hai để xem dữ liệu. – zambono

+0

ditto. +1 để áp phích – autodidakto

Trả lời

1

Để sử dụng plist với UIDocument, bạn có thể phân lớp UIDocument và ghi đè lên 2 phương thức sau với self.myDictionary (plist của bạn) được khai báo là NSMutableDictionary.

- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError 
{  
    if ([contents length] > 0) 
    { 
     NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:(NSData *)contents]; 
     NSMutableDictionary *dataDictionary = [unarchiver decodeObjectForKey:@"data"]; 

     self.myDictionary = dataDictionary; 
     [unarchiver finishDecoding]; 
     [unarchiver release]; 
    } 
    else 
    { 
     self.myDictionary = [NSMutableDictionary dictionary]; 
    } 

    return YES;  
} 

- (id)contentsForType:(NSString *)typeName error:(NSError **)outError 
{ 
    NSMutableData *data = [[[NSMutableData alloc] init] autorelease]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
    if(!self.myDictionary) 
    { 
     self.myDictionary = [NSMutableDictionary dictionary]; 
    } 
    [archiver encodeObject:self.myDictionary forKey:@"data"]; 

    [archiver finishEncoding]; 
    [archiver release]; 
    return data; 
} 
+0

Điều này không tạo ra một plist từ điển nó tạo ra một plist lưu trữ nhưng là đủ gần. Để tạo ra một plist thực sự sử dụng NSPropertyListSerialization và bạn có thể chọn xml hoặc đầu ra nhị phân. – malhal

+0

Cũng lưu trữ plists không tương thích giữa Mac và iOS. – malhal

7

Không chắc chắn nếu bất kỳ ai vẫn cần giải pháp cho điều đó nhưng tôi đã tìm thấy cách tốt để làm việc này.

Vì UIDocument chỉ chấp nhận Dữ liệu dưới dạng NSData hoặc NSFilewrapper, trước tiên tôi đã tạo một Danh mục cho Lớp NSDictionary trả về một NSDictionary từ NSData. Dưới đây là hai tập tin cho Thể loại:

NSDictionary + DictFromData.h:

#import <Foundation/Foundation.h> 

@interface NSDictionary (DictFromData) 
+ (id)dictionaryWithData:(NSData *)data; 
- (id)initWithData:(NSData *)data; 
@end 

và NSDictionary + DictFromData.m

#import "NSDictionary+DictFromData.h" 
@implementation NSDictionary (DictFromData) 

+ (id)dictionaryWithData:(NSData *)data { 
    return [[[NSDictionary alloc] initWithData:data] autorelease]; 
} 

- (id)initWithData:(NSData *)data { 
    NSString *tmp = nil; 

    self = (NSDictionary *)[NSPropertyListSerialization 
          propertyListFromData:data 
          mutabilityOption:NSPropertyListImmutable 
          format:NULL 
          errorDescription:&tmp]; 

    NSAssert1(tmp == nil,@"Error in plist: %@",tmp); 
    return [self retain]; 
} 
@end 

(source)

Nếu bây giờ bạn nhập khẩu Danh mục này trong Lớp con UIDocument của bạn, bạn có thể dễ dàng tải và lưu Tệp Plist của mình vào vùng chứa iCloud của mình.

Để tải Plist của bạn từ iCloud thêm video này vào lớp con UIDocument của bạn (Nội dung tài sản là một NSDictionary):

- (BOOL)loadFromContents:(id)contents 
        ofType:(NSString *) 
     typeName error:(NSError **)outError { 

    if ([contents length] > 0){ 
     self.contents = [NSDictionary dictionaryWithData:contents]; 
    } else { 
     self.contents = nil; 
    } 

    // call some Methods to handle the incoming NSDictionary 
    // maybe overwrite the old Plist file with the new NSDictionary 

    return YES; 
} 

Đối với tiết kiệm dữ liệu của bạn trở lại với iCloud thêm này:

- (id)contentsForType:(NSString *)typeName error:(NSError **)outError { 
    NSData * plistData = [[[NSData alloc]initWithContentsOfFile:YOUR_PLIST_FILE]autorelease]; 
    return plistData; 
} 

Nếu bây giờ bạn gọi:

[myUIDocument updateChangeCount:UIDocumentChangeDone]; 

YOUR_PLIST_FILE sẽ được đồng bộ hóa. Hãy nhớ rằng phải mất khoảng 10-15 giây cho iCloud Container của bạn để cập nhật.

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