打开WithCompletionHandler未在我的设备上返回

时间:2012-06-02 14:19:37

标签: iphone objective-c ipad icloud uidocument

当我尝试从使用其他设备创建的iCloud打开UIDocument时,我遇到了奇怪的行为。当我打电话给 openWithCompletionHandler 时,它永远不会完成。

以下是我重现行为的方法:

  1. 我在iPad上创建了一个新的UIDocument并将其存储在iCloud
  2. 然后我删除了相同的应用程序,但是从iPhone
  3. 我从iPhone上的XCode运行应用程序
  4. 到目前为止,iPhone是干净的,因为该应用已被移除
  5. 当应用程序首次在iPhone上运行时,它会调用 openWithCompletionHandler 方法,该方法会挂起并且不会发生任何事情。在 openWithCompletionHandler 操作结束后,它没有到达要执行代码的块。
  6. 仅当我创建一个新的UIDocument并将其存储在iPhone的iCloud中时,它才有效。然后,如果我执行相同的步骤(1-5),但在iPad上遇到类似的行为。

    以下是我的源代码:

    if ([query resultCount] == 1)
    {
        NSMetadataItem *item = [query resultAtIndex:0];
        NSURL *url = [item valueForAttribute:NSMetadataItemURLKey];
    
        _progressDoc = [[ProgressDocument alloc] initWithFileURL:url];
    
        [_progressDoc openWithCompletionHandler:^(BOOL success) {
            if (success)
            {
                [[NSNotificationCenter defaultCenter] 
                 addObserver:self 
                 selector:@selector(progressDocumentHasChanged:) 
                 name:UIDocumentStateChangedNotification 
                 object:nil];
    
                NSLog(@"Progress Document opened from iCloud");
            }
            else {
                NSLog(@"failed to open Progress Document from iCloud");
            }
        }];
    }
    

    有没有人遇到过类似的问题?

    我也尝试使用下面的方法手动下载文件,但仍有相同的行为...

    - (BOOL)downloadFileIfNotAvailable:(NSURL*)file {
        NSNumber*  isIniCloud = nil;
    
        if ([file getResourceValue:&isIniCloud forKey:NSURLIsUbiquitousItemKey error:nil]) {
            // If the item is in iCloud, see if it is downloaded.
            if ([isIniCloud boolValue]) {
                NSNumber*  isDownloaded = nil;
                if ([file getResourceValue:&isDownloaded forKey:NSURLUbiquitousItemIsDownloadedKey error:nil]) {
                    if ([isDownloaded boolValue])
                        return YES;
    
                    // Download the file.
                    NSError *error;
                    NSFileManager*  fm = [NSFileManager defaultManager];
                    BOOL success = [fm startDownloadingUbiquitousItemAtURL:file error:&error];
                    if (success) {
                        NSLog(@"Started download at URL: %@", file);
                    } else {
                        NSLog(@"Failed to start download at URL: %@: %@", file, error.localizedDescription); 
                    }                 
                    return NO;
                }
            }
        }
    
        // Return YES as long as an explicit download was not started.
        return YES;
    }
    

    非常感谢!

0 个答案:

没有答案