2012-03-12 15 views
13

Tôi đang sử dụng 's startDownloadingUbiquitousItemAtURL để tải xuống tệp từ iCloud xuống bản sao cục bộ (địa phương chưa có bản sao của tệp trong trường hợp này). Tôi dường như không thể tìm thấy cuộc gọi lại cho quá trình này. Tôi cần gọi lại để thông báo cho ứng dụng của tôi rằng tệp được yêu cầu đã được tải xuống xong (bản sao cục bộ) để tác vụ khác có thể bắt đầu đọc nội dung của tệp và thực hiện nội dung.iCloud: Gọi lại cho NSFileManager's startDownloadingUbiquitousItemAtURL?

Tôi có thể kiểm tra xem tệp có được tải xuống hay không. Nhưng nó sẽ liên quan đến việc bỏ phiếu liên tục. Có cách nào để làm điều này mà không cần thiết lập một bộ đếm thời gian để thăm dò ý kiến ​​cho điều này?

Trả lời

28

Tôi tin rằng phương pháp này được dự định sẽ được sử dụng kết hợp với các điều phối viên tập tin dựa trên Apple's documentation. Vì vậy, bạn sẽ cần phải sử dụng một điều phối tập tin như vậy:

NSURL *itemURL = nil; // this is the URL you want to read from 

__block NSData *data = nil; 
NSError *error = nil; 
NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil]; 
[coordinator coordinateReadingItemAtURL:itemURL options:0 error:&error byAccessor:^(NSURL *newURL) { 
    data = [NSData dataWithContentsOfURL:newURL]; 
}]; 

này sẽ được đồng bộ, tuy nhiên, vì vậy nếu bạn muốn làm một cái gì đó không đồng bộ, bạn có thể sử dụng các khối như vậy:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // read info from the URL using the code above 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // handle data read from the URL 
    }); 
}); 
+1

Phương pháp trong NSFileCoordinator hoạt động đẹp trong chế độ đồng bộ. Tôi cũng cần phiên bản async trong giai đoạn sau của dự án của tôi - bỏ phiếu cho điều đó! Cảm ơn bạn. – user523234

+0

@SpaceDog Bạn là 100% đúng. Tôi đã đối phó với các API này và thẳng thắn, các suck. – mattsven

+3

Các API do Apple tạo ra có thể được chia thành hai loại: 1) những thứ được hút, bị nhầm lẫn là địa ngục, mơ hồ, không đầy đủ và xấu được ghi lại và 2) những người có thể vượt qua được. Không có API nào được thiết kế tốt. Đừng đưa tôi sai. Tôi yêu các sản phẩm của Apple nhưng Apple giao dịch với các nhà phát triển và API không phải là Apple với những tiêu chuẩn cao mà mọi người biết. Ngược lại. – SpaceDog

-1

Để tải lên một cách chính xác để iCloud bạn cũng sẽ cần một cái gì đó như thế này (bất cứ điều gì khác đã không làm việc: |)

NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 

    NSString *FileNS = @"myfile.dat"; 
    NSURL *FileURL = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:FileNS ]; 


    BYTE *data = NULL;//Put your file data in here 
    int FileSize = 0;//replace with your file size 
    NSData *myData = [[NSData alloc] initWithBytes:data length:FileSize]; 
    [myData writeToFile:[FileURL path] atomically:YES]; 
+0

op được yêu cầu tải xuống, không tải lên – SpaceDog