Pregunta Métodos asincrónicos en NSOperation


Estoy obteniendo algunos datos de Facebook Connect (usando el framework FBConnect Objective-C 2.0) y estoy haciendo todo eso en una NSOperation. Está en NSOperation porque tengo varias otras operaciones que también funcionan y esta es una de ellas.

El problema es que todas las llamadas FBConnect son asincrónicas. Debido a esto, el método principal de NSOperation termina rápidamente y la operación se marca como completada.

¿Hay alguna forma de superar esto? ¡Parece que no hay opciones síncronas en FBConnect!

Muchas gracias,

Micro


32
2017-10-20 17:33


origen


Respuestas:


A continuación se muestra un ejemplo completo. En tu subclase, después de que se complete tu método asíncrono, llama [self completeOperation] para pasar al estado final.

@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

23
2017-11-05 21:58



ponga su FBConnect llama a 'start', no'main', y administrar el'isFinished''isExecuting'propiedades. (y volver YES para 'isConcurrent')

Para más detalles, ver la documentación de Apple sobre escritura operaciones concurrentes de NSO.


6
2017-07-12 22:35