Detecta el final de performSelectorInBackground: withObject:

Tengo una request de server asíncrona en mi aplicación iOS:

[self performSelectorInBackground:@selector(doSomething) withObject:nil]; 

¿Cómo puedo detectar el final de esta operación?

Pon una llamada al final del método doSomething ?!

 - (void)doSomething { // Thread starts here // Do something // Thread ends here [self performSelectorOnMainThread:@selector(doSomethingDone) withObject:nil waitUntilDone:NO]; } 

Si solo quieres saber cuándo está terminado (y no quieres devolver muchos datos, en este punto, recomendaría un delegado), simplemente puedes publicar una notificación en el centro de notifications.

 [[NSNotificationCenter defaultCenter] postNotificationName:kYourFinishedNotificationName object:nil]; 

dentro de la vista de los controlleres ver el método DidLoad agregar:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(yourNotificationListenerMethod:) name:kYourFinishedNotificationName object:nil]; 

y dentro de dealloc, agrega:

 [[NSNotificationCenter defaultCenter] removeObserver:self]; 

Es posible que desee que su selector doSomething vuelva cuando se haya completado. Lo que ocurre en performSelectorInBackground es interno a la API y, si desea más control, puede usar performSelector:onThread:withObject:waitUntilDone: y compruebe periódicamente isFinished en el subprocess pasado. Estoy seguro de que estás más preocupado por hacer algo más que el hilo real, así que solo publica desde allí.

Tengo un manejador de background general que creé que resuelve este problema. Solo el primer método es público, por lo que se puede usar en todo momento. Tenga en count que se requieren todos los parameters.

 +(void) Run: (SEL)sel inBackground: (id)target withState: (id)state withCompletion: (void(^)(id state))completionHandler // public { [(id)self performSelectorInBackground: @selector(RunSelector:) withObject: @[target, NSStringFromSelector(sel), state, completionHandler]]; } +(void) RunSelector: (NSArray*)args { id target = [args objectAtIndex: 0]; SEL sel = NSSelectorFromString([args objectAtIndex: 1]); id state = [args objectAtIndex: 2]; void (^completionHandler)(id state) = [args objectAtIndex: 3]; [target performSelector: sel withObject: state]; [(id)self performSelectorOnMainThread: @selector(RunCompletion:) withObject: @[completionHandler, state] waitUntilDone: true]; } +(void) RunCompletion: (NSArray*)args { void (^completionHandler)(id state) = [args objectAtIndex: 0]; id state = [args objectAtIndex: 1]; completionHandler(state); } 

Aquí hay un ejemplo de cómo se llama:

 NSMutableDictionary* dic = [[NSMutableDictionary alloc] init]; __block BOOL done = false; [Utility Run: @selector(RunSomething:) inBackground: self withState: dic withCompletion:^(id state) { done = true; }]; 
    Intereting Posts