2

iCloud同期のプロジェクトがありますが、まったく正しく機能しません。最初に、変更されたオブジェクトの配列を取得し、次にそれらを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: "); 
             }
         }];
    }
}

よろしくお願いします。英語をお詫びします。

4

2 に答える 2

1

@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);

この変更後、問題はありません。

お役に立てれば!(そして私の英語でごめんなさい:>)

于 2012-06-13T13:32:09.550 に答える
1

Dmitry、saveToURL:をオーバーライドする方法は安全ではありません。UIDocument saveToURLのデフォルトの実装では、ファイル調整を使用して、ユビキタスデーモンがディスクに書き込んでいる内容とタイミングを確実に認識します。writeContents:、でファイルを調整している場合を除いて、実装はファイルの調整を行いません(そうすべきではありません)。

次のUIDocumentのsaveToURLドキュメントのディスカッションセクションを参照してください:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDocument_Class/UIDocument/UIDocument.html#//apple_ref/occ/instm/UIDocument/saveToURL: forSaveOperation:completionHandler

于 2013-06-26T19:48:11.483 に答える