34

Facebook Connect から (FBConnect Objective-C 2.0 フレームワークを使用して) データを取得していますが、そのすべてを NSOperation で実行しています。同様に実行される他のいくつかの操作があり、これはそれらの1つであるため、NSOperationにあります。

問題は、すべての FBConnect 呼び出しが非同期であることです。このため、NSOperation のメイン メソッドはすぐに終了し、操作は完了としてマークされます。

これを克服する方法はありますか?FBConnect には同期オプションがないようです。

どうもありがとう、

マイク

4

4 に答える 4

27

以下は完全な例です。サブクラスでは、非同期メソッドが完了した後、呼び出し[self completeOperation]て終了状態に遷移します。

@interface AsynchronousOperation()
// 'executing' and 'finished' exist in NSOperation, but are readonly
@property (atomic, assign) BOOL _executing;
@property (atomic, assign) BOOL _finished;
@end

@implementation AsynchronousOperation

- (void) start;
{
    if ([self isCancelled])
    {
        // Move the operation to the finished state if it is canceled.
        [self willChangeValueForKey:@"isFinished"];
        self._finished = YES;
        [self didChangeValueForKey:@"isFinished"];
        return;
    }

    // If the operation is not canceled, begin executing the task.
    [self willChangeValueForKey:@"isExecuting"];
    [NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];
    self._executing = YES;
    [self didChangeValueForKey:@"isExecuting"];

}

- (void) main;
{
    if ([self isCancelled]) {
        return;
    }

}

- (BOOL) isAsynchronous;
{
    return YES;
}

- (BOOL)isExecuting {
    return self._executing;
}

- (BOOL)isFinished {
    return self._finished;
}

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

    self._executing = NO;
    self._finished = YES;

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

@end
于 2015-11-05T21:58:33.270 に答える
6

FBConnect呼び出しを ' start' ではなく ' ' に入れて、' ' ' ' プロパティmainを管理してください。(そして' 'に戻ります)isFinishedisExecutingYESisConcurrent

詳細については、並行 NSOperationsの記述に関する Apple のドキュメントを参照してください。

于 2011-07-12T22:35:16.297 に答える