3

isCancelledスレッドをキャンセルしていないので、以下のメソッドを正しく実装しているかどうか疑問に思います。スケーリングしている画像があり、スケーリングが完了すると、このメソッドが呼び出されて画像が更新されます。したがって、ユーザーがボタンから指を離すと、これが呼び出されます。これが完了する前に彼らがボタンをもう一度押そうとすると、私cancelAllOperationsはキューを呼び出しますが、それは機能していません。cancelAllOperationsがフラグをトリガーするかどうか、または結果を得るためにそれを呼び出し続ける必要があるかどうかさえわかりません。誰かがこれについて何か洞察を持っていますか?

- (void) refreshImage
{
    NSBlockOperation *operation = [[NSBlockOperation alloc] init];
    __unsafe_unretained NSBlockOperation *weakOperation = operation;

    [operation addExecutionBlock:
     ^{
         UIImage *image = [[self.graphicLayer imageForSize:self.size] retain];
         if (![weakOperation isCancelled])
         {
             [[NSOperationQueue mainQueue] addOperationWithBlock:
              ^{
                  self.image = image;
                  [image release];
              }];
         }
         else
         {
             [image release];
             return;
         }
     }];

    [self.queue addOperation: operation];
    [operation release];
}
4

1 に答える 1

1

問題が見つかりました。交換する必要があります。

__unsafe_unretained NSBlockOperation *weakOperation = operation;

と:

__block NSBlockOperation *weakOperation = operation;

ところで、興味のある人には、並行性に関する優れたビデオがあります。特に、別のスレッドで描画し、NSOperationQueueiOSでの並行ユーザーインターフェイスの構築と呼ばれるWWDC2012でのを使用しています。

于 2013-01-23T15:40:31.273 に答える