iphone - Métodos asincrónicos en NSOperation
asynchronous fbconnect (2)
A continuación se muestra un ejemplo completo. En su subclase, después de que se complete su método asincrónico, llame a [self completeOperation]
para pasar al estado finalizado.
@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
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
ponga sus llamadas FBConnect
en '' start
'', no '' main
'', y administre las isFinished
'' isFinished
'' '' isExecuting
''. (y devuelve YES
para '' isConcurrent
'')
Para obtener más detalles, consulte la documentación de Apple sobre cómo escribir NSOperations concurrentes .