web-dev-qa-db-ja.com

Objective-CでNSOperationとNSOperationQueueを使用するにはどうすればよいですか?

私はカスタムカメラアプリケーションを開発しています。私がしているのは、カメラを使用して写真を撮り、それらを同じVC画面の下部に表示することです。

画像をローカル辞書とNSDocumentディレクトリパスに保存しています。画像がローカル辞書にある場合はローカル辞書から取得し、そうでない場合はNSDocumentディレクトリパスから取得します。

メモリ警告を受け取った後、辞書をゼロにするだけなので、NSDocumentディレクトリパスから画像を取得します。

両方を使用すると、遅いプロセスで画像が表示されます。私のUIは、画像の表示にそれほど適していません。

そこで、NSOperationを使用してNSDocumentディレクトリパスに画像を保存したいと思います。

NSOperationについてはあまり知識がありません。 Googleで検索しましたが、Objective Cでヘルプが必要なときに、Swiftチュートリアルを取得しています。

では、NSOperationNSOperationQueueを例を挙げて説明してもらえますか?

8
kavi

各作品にこれを適用します:

        // Allocated here for succinctness.
        NSOperationQueue *q = [[NSOperationQueue alloc] init];

        /* Data to process */
        NSData *data = [@"Hello, I'm a Block!" dataUsingEncoding: NSUTF8StringEncoding];

        /* Push an expensive computation to the operation queue, and then
         * display the response to the user on the main thread. */
        [q addOperationWithBlock: ^{
            /* Perform expensive processing with data on our background thread */
            NSString *string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];



            /* Inform the user of the result on the main thread, where it's safe to play with the UI. */

            /* We don't need to hold a string reference anymore */

        }];

また、NSOperationQueueなしで申請することもできます。

       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            // Your Background work

            dispatch_async(dispatch_get_main_queue(), ^{
                // Update your UI


            });
        });

これらをもっと試してください:

  1. NSOperationQueue addOperationWithBlockはmainQueueの操作の順序に戻ります

  2. http://landonf.org/code/iphone/Using_Blocks_1.20090704.html

  3. https://videos.raywenderlich.com/courses/introducing-concurrency/lessons/7

6
Jamshed Alam

Swift3操作キューを作成する

lazy var imgSaveQueue: OperationQueue = {
    var queue = OperationQueue()
    queue.name = "Image Save Queue"
    queue.maxConcurrentOperationCount = 1
    return queue
}()

それに操作を追加します

imgSaveQueue.addOperation(BlockOperation(block: { 
       //your image saving code here 
    }))

Objective Cの場合:

[[NSOperationQueue new] addOperationWithBlock:^{ 

      //code here 

}];
1
Hunaid Hassan