2012-07-01 28 views
5

Tôi đang sử dụng iCloud với dữ liệu cốt lõi để đồng bộ hóa dữ liệu của Ứng dụng của tôi.Làm cách nào để buộc iCloud với dữ liệu chính để đồng bộ hóa?

Tôi đã thử mọi thứ và cuối cùng Nó hoạt động hoàn hảo.

nhưng tôi có một câu hỏi.

Có cách nào mà nói với iCloud để đồng bộ?

Đồng bộ hóa khi ứng dụng bắt đầu, nhưng lần khác. Có vẻ như nó đồng bộ một cách ngẫu nhiên. Tôi không thể tìm ra cách để tự mình xử lý nó.

trợ giúp nào?

Cảm ơn.

+0

Câu hỏi tương tự .. Tôi cũng muốn buộc đồng bộ hóa –

Trả lời

0

Bạn phải ép buộc bất kỳ mục NSURL để được lưu trữ trong iCloud với phương pháp này:

- (BOOL)addBackupAttributeToItemAtURL:(NSURL *)URL 
{ 
    NSLog(@"URL: %@", URL); 
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); 

    NSError *error = nil; 
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: NO] 
            forKey: NSURLIsExcludedFromBackupKey error: &error]; 
    return success; 
} 

bạn cần phải khởi động phương pháp này trên tất cả các thư mục và tập tin bạn đang tải/tạo trong Documents hoặc Thư viện danh mục.

0

Tôi không tin rằng bạn có bất cứ quyền kiểm soát khi đồng bộ hóa sẽ xảy ra khi sử dụng iCloud và lõi dữ liệu. Với UIDocument và iCloud tôi đã sử dụng startDownloadingUbiquitousItemAtURL với các mức độ thành công khác nhau nhưng đối với dữ liệu lõi tôi không nghĩ rằng có bất kỳ tương đương nào - tôi rất muốn nghe ai đó nói với tôi theo cách khác ...

1

Tôi đã tìm ra cách để buộc một kho dữ liệu cốt lõi đồng bộ hóa với iCloud. Bạn chỉ cần "chạm" bất kỳ tập tin biên nhận nào trong thư mục Dữ liệu trong hệ thống tập tin Ubiquity. Mã dưới đây sẽ làm điều này. Để buộc đồng bộ hóa, hãy gọi phương thức syncCloud. Đối với mỗi "nhận" tập tin nó tìm thấy, nó sẽ cập nhật các tập tin tem thời gian sửa đổi cho thời gian hiện tại, về cơ bản làm một "liên lạc" trên tập tin. Ngay khi điều này xảy ra, iCloud sẽ kiểm tra và đồng bộ hóa bất kỳ tệp dữ liệu cốt lõi nào cần đồng bộ hóa trong iCloud. Gần như tôi có thể nói, đây là cách trình mô phỏng hoặc Xcode thực hiện khi bạn chọn tùy chọn "Kích hoạt iCloud Sync".

@property (strong, nonatomic) NSMetadataQuery *query; 

-(void) init 
{ 
    self.query = [[NSMetadataQuery alloc] init]; 

    [[NSNotificationCenter defaultCenter] addObserver: self 
              selector: @selector(didFinishMetadataQuery) 
               name: NSMetadataQueryDidFinishGatheringNotification 
               object: self.query]; 
} 

-(void) didFinishMetadataQuery 
{ 
    // Query completed so mark it as completed 
    [self.query stopQuery]; 

    // For each receipt, set the modification date to now to force an iCloud sync 
    for(NSMetadataItem *item in self.query.results) 
    { 
     [[NSFileManager defaultManager] setAttributes: @{NSFileModificationDate:[NSDate date]} 
             ofItemAtPath: [[item valueForAttribute: NSMetadataItemURLKey] path] 
               error: nil]; 
    } 
} 

-(void) syncCloud 
{ 
    // Look for files in the ubiquity container data folders 
    [self.query setSearchScopes:@[NSMetadataQueryUbiquitousDataScope]]; 

    // Look for any files named "receipt*" 
    [self.query setPredicate:[NSPredicate predicateWithFormat:@"%K like 'receipt*'", NSMetadataItemFSNameKey]]; 

    // Start the query on the main thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     BOOL startedQuery = [self.query startQuery]; 
     if (!startedQuery) 
     { 
      NSLog(@"Failed to start query.\n"); 
      return; 
     } 
    }); 
} 
Các vấn đề liên quan