3

通常main、 an のメソッドNSOperationが完了すると、op は完了としてマークされ、キューから削除されます。ただし、私の op はネットワーク呼び出しを行い、再試行を処理したいと考えています。削除してもよいと明示的に言うまで、 を保持するNSOperationにはどうすればよいですか?NSOperationQueue

4

1 に答える 1

4

現在のプロジェクトで行った作業の元のソースが見つかりません。

私は NSOperation をサブクラス化し、これを行います...

.m にプライベート プロパティを追加します。

@property (nonatomic) BOOL executing;
@property (nonatomic) BOOL finished;
@property (nonatomic) BOOL completed;

操作を開始します...

- (id)init
{
    self = [super init];
    if (self) {
        _executing = NO;
        _finished = NO;
        _completed = NO;
    }
    return self;
}

プロパティを返す関数を追加します...

- (BOOL)isExecuting { return self.executing; }
- (BOOL)isFinished { return self.finished; }
- (BOOL)isCompleted { return self.completed; }
- (BOOL)isConcurrent { return YES; }

「開始」関数内 (これは operationQueue が呼び出すビットです...

- (void)start
{
    if ([self isCancelled]) {
        [self willChangeValueForKey:@"isFinished"];
        self.finished = YES;
        [self didChangeValueForKey:@"isFinished"];
        return;
    }

    // If the operation is not canceled, begin executing the task.
    [self willChangeValueForKey:@"isExecuting"];
    self.executing = YES;
    [self didChangeValueForKey:@"isExecuting"];

    [NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];
}

次に、主に作業コードを入れます...

- (void)main
{
    @try {
        //this is where your loop would go with your counter and stuff
        //when you want the operationQueue to be notified that the work
        //is done just call...
        [self completeOperation];
    }
    @catch (NSException *exception) {
        NSLog(@"Exception! %@", exception);
        [self completeOperation];
    }
}

completeOperation のコードを記述します...

- (void)completeOperation {
    [self willChangeValueForKey:@"isFinished"];
    [self willChangeValueForKey:@"isExecuting"];

    self.executing = NO;
    self.finished = YES;

    [self didChangeValueForKey:@"isExecuting"];
    [self didChangeValueForKey:@"isFinished"];
}

それでおしまい。

これらがある限り、操作は機能します。

必要に応じて、他の関数やプロパティをいくつでも追加できます。

実際、さまざまなタイプのオブジェクトに対してすべての作業を行う関数があるため、このクラスを実際にサブクラス化しました (これはアップロードのものです)。私は関数を定義しました...

- (void)uploadData
{
    //subclass this method.
}

次に、サブクラスにあるのは、カスタムの「uploadData」メソッドだけです。

いつ操作を終了するかなどを細かく制御できるので、これは本当に便利だと思います...

于 2012-11-30T16:01:24.287 に答える