2012-02-07 10 views
1

私は、ユーザーがiPadからクラウド上にファイルやフォルダを作成することができるアプリを開発中です。 ファイルが削除されると、アプリケーションは自動的にクラウド上に「ごみ箱」フォルダを作成し、そのファイルをその中に入れます。すべての操作でNSOperationQueueを作成しました。つまり、フォルダ作成用に別のキューがあり、ファイルアップロード用に別のキューがあります。私が直面している問題は、フォルダの作成操作が完了する前にファイルのアップロード操作が実行され、ファイルが正常にアップロードされないということです。NSOperationを同期させる

誰も私にはフォルダ作成動作の同期を作るのを助けることができますか?

私は、次のコード

[create_folder_queue addOperations:[NSArray arrayWithObject:folderOperation] waitUntilFinished:YES]; 

を試してみましたが、それは操作を実行しません。

ありがとうございます。

+0

私たちにもっとコードを教えてください(どこからaddOperationsを呼び出すのですか?folderOperationのタイプはどれですか) – Danra

答えて

0

は、なぜあなたは、2つのキューを持っていますか? 1つしかできない場合は、依存関係を使って問題を解決します(documentationを参照)。

+0

2つのキューを持つ理由は、1つの操作が進行中のときにユーザーがアイドル状態にしないようにするためです。私は1つのキューを持っている、その後、ユーザーが大きなファイルをアップロードする場合、彼/彼女は他の操作(フォルダの作成、ファイルのダウンロードなど)を実行するためにファイルがアップロードされるまで待つ必要があります。 – Musti

12

同期キューを使用する場合は、操作キューで-setMaxConcurrentOperationCount:メソッドを実行して、1に設定します。

このプロパティを設定した後、あなただけの別の完了後に一つのタスクのみ次の同期キュー、多かれ少なかれ定義されたキューの時間、で実行されている最大で1つの操作を持つことになります。

+0

こんにちは、アレックス、お返事のおかげで、私は、2つの別々のキュー、ファイルアップロード用フォルダの作成用と他を持っている、と彼らはあなたが、その後読みたいかもしれません。..文句を言わないくらいの違いを作る1に – Musti

+0

を同時動作をsimultaneously..setting実行Appleの*同時実行性の管理*ドキュメント、依存関係について特に部品:同期することでhttps://developer.apple.com/cocoa/managingconcurrency.html –

+0

、あなたがスレッドが順次(次々と)上で動作するかで実行されている意味していますメインスレッド? – mr5

1

これはあなたの問題を解決する必要があります。setMaxConcurrentOperationCountとともに

[create_folder_queue addOperation:folderOperation]; 
[create_folder_queue waitUntilAllOperationsAreFinished]; 

// ... now start file upload ... 
+0

助けてくれてありがとう。私はこれを試しましたが、これを行うことで、操作は実行されません。私はどこが間違っているのか分かりません。 – Musti

+0

'[create_folder_queue waitUntilAllOperationsAreFinished];の前後にあるfolderOperationの実行ステータスは何ですか?isCancelled'、' isExecuting'、 'isFinished'および' isReady'は何を返しますか? – Felix

1

を、あなたのNSOperationサブクラス に:

- (void)main 
{  
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    [pool release]; 
} 

- (BOOL)isConcurrent { 
    return FALSE; 
} 

今では完全にシリアルシーケンスモードであります。

3

私の知る限りでは1つのNSOperationオブジェクトは、他に依存することができ、それらを同じ操作キューで実行されることは必須ではありません。したがって、次に行うことができます:

// create queues 
NSOperationQueue *folder_creation_queue = [[NSOperationQueue alloc] init]; 
NSOperationQueue *file_uploading_queue = [[NSOperationQueue alloc] init]; 
// create operations 
NSInvocationOperation *folder_creation_operation = [[NSInvocationOperation alloc] 
                initWithTarget:aFolderTarget 
                selector:@selector(folderCreation) 
                object:aFolderObject]; 
NSInvocationOperation *file_uploading_operation = [[NSInvocationOperation alloc] 
                initWithTarget:aFileTarget 
                selector:@selector(fileUpload) 
                object:aFileObject]; 
// Set dependency for the folder_uploading_operation. 
// It prevents this operation begin executing before 
// folder_creation_operation finished. 
[file_uploading_operation addDependency:folder_creation_operation]; 
// Execute these operations 
[folder_creation_queue addOperation:folder_creation_operation]; 
[file_uploading_queue addOperation:file_uploading_operation]; 

この例では、メモリ管理がないので注意してください。

+0

このコードを「サーバーからデータを取得するget操作のような」通常のメソッドに適用できますか。私はデータを引き出す必要があり、リレーションを健全に保つためには、引っ張り操作は連続的でなければなりません。 –

関連する問題