我有一个带有iCloud sync的项目,但是它根本无法正常工作。首先,我得到了一组更改后的对象,然后将它们转换为CSV字符串(这将是云中UIDocuments的内容),然后将它们上传到iCLoud。如果我的对象少于400个,则一切正常,但如果我的对象更多,则应用程序挂起。

我尝试使用本地自动释放池,将大型阵列拆分为较小的阵列。但这没有帮助。

将大量UIDocument上传到iCloud的最佳方法是什么?
我的上传方法:

- (void)pushChangesToCloud:(NSArray *)changedObjects {

    for (ObjectClass *someObject in changedObjects) {
        NSURL *pathToSyncDoc = [[self urlForDocumentsFolderIniCloud] URLByAppendingPathComponent:someObject.name];

        CustomUIDocument *syncDoc = [[[CustomUIDocument alloc] initWithFileURL:pathToSyncDoc] autorelease];
        //   converting object to CSV string
        NSString *csvContents = [SomeClass convertObjectToCSV:someObject];
        syncDoc.documentContent = csvContents;

        [syncDoc saveToURL:[syncDoc fileURL]
          forSaveOperation:UIDocumentSaveForCreating
         completionHandler:^(BOOL success) {
             if (success) {
                 NSLog(@"YAY!");
             } else {
                 NSLog(@" D: ");
             }
         }];
    }
}

在此先感谢您,感谢您的英语。

最佳答案

感谢@Eimantas的帮助,我终于解决了我的问题。他对队列超载是正确的。由于“saveToUrl:forSaveOperation:completionHandler:”是I / O操作,因此队列创建了很多线程(对于每个UIDocument),并且应用程序挂起。

我在自定义UIDocument中重载了“saveToUrl:forSaveOperation:completionHandler:”方法(以避免将文档保存在并发线程中):

- (void)saveToURL:(NSURL *)url forSaveOperation:(UIDocumentSaveOperation)saveOperation completionHandler:(void (^)(BOOL))completionHandler {
NSError *contentsError = nil;
NSError *attributesError = nil;
NSError *savingError = nil;

[self writeContents:[self contentsForType:self.fileType error:&contentsError] andAttributes:[self fileAttributesToWriteToURL:url forSaveOperation:saveOperation error:&attributesError] safelyToURL:url forSaveOperation:saveOperation error:&savingError];

NSLog(@"SAVING ERRORS: contents error - %@, attributes error - %@, saving error - %@",[contentsError localizedDescription],  [attributesError localizedDescription], [savingError localizedDescription]);
}

然后,我使用自己的串行队列执行所有保存操作。
首先,您需要像iVar一样添加它:
dispatch_queue_t mySerialQueue;

然后在init方法中创建它:
myCustomQueue = dispatch_queue_create("com.whatever.MyAwesomeQueue", DISPATCH_QUEUE_SERIAL);

用它来保存:
dispatch_async(mySyncQueue, ^{
    // do saving stuff
});

然后在dealloc中释放它:
dispatch_release(mySyncQueue);

更改之后,我对此没有任何问题。

希望这可以帮助! (对不起我的英语:>)

10-08 09:46