iOS: Cómo lograr este código de delegado con el uso de bloque

Yo uso cocos2D para iphone.

Tengo 3 escenas: escena A, escena B y escena C

  1. en la escena C, haz clic para abrir la escena A, pero la escena A todavía no está abierta;
  2. abra la escena B primero, la escena B tiene muchos botones
  3. los usuarios hacen clic en un button en la escena B, luego la escena B descarta y devuelve un valor v a la escena C;
  4. de acuerdo con el valor v, la escena C decide abrir o no abrir la escena A;

Todo lo que necesito es una function de callback, uso el delegado para lograr esto con éxito.

Tengo un protocolo:

@protocol SceneBDelegate <NSObject> @requinetworking - (void)dismissWithValue:(BOOL)value; @end 

En la escena B, cuando se hace clic en un button:

 -(void) clickBtn{ if([self.delegate respondsToSelector:@selector(dismissWithValue:)]){ [self.delegate dismissWithValue: YES]; } [self removeFromParent]; } 

En la escena C,

 -(void) dismissWithValue:(BOOL)value{ if(value){ // do something; } } 

Estos códigos funcionan bien, pero ¿quiero saber cómo lograr esto con bloque?

He leído acerca de la publicación de Jens Ayton, esta es la pregunta, how-to-perform-callbacks-in-objective-c

Él explica cómo usar el locking, pero no puedo descubrir cómo conectar la acción de los usuarios con el locking.

I konw UIViewController tiene una que encontré al usar UIViewController tiene una function:

 (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion NS_AVAILABLE_IOS(5_0); 

es compatible con el bloque.

Pero yo uso cocos2D, no encontré una function similar.

¿Alguien puede darme algunos consejos? ¡Muchas gracias!

Tu escena B probablemente tenga una

@property (nonatomic, weak) id<SceneBDelegate> delegate;

en cambio, puede almacenar un bloque en una propiedad:

@property (copy) void (^ dismissWithValueBlock) (BOOL); // dismissWithValueBlock es el nombre de la variable.

Luego, en su escena B, cuando se presiona el button, usted hace:

 -(void) clickBtn{ if(self.dismissWithBlock){ self.dismissWithBlock(YES) } [self removeFromParent]; } 

Para crear el bloque en su otra class, debe hacer esto:

 __weak typeof (self) weakSelf = self; sceneB.dismissWithBlock = ^(BOOL value) { typeof (self) strongSelf = self; // .... now your code you want to execute when this block is called.. // make sure not to call self.XXX anywhere in here. You should use the strongSelf.XXX insteadd! This is for memory management purposes. You can read up on it by googling 'strongSelf in blocks ios' } 

Yo puedo hacer eso como abajo

 //Define Block As in SceneBDelegate.h typedef void (^onResultBlock)(NSDictionary *DictData, NSError *error); - (void) onDismissWithValue:(onResultBlock) callbackBlock; //Implementaion of Block As in SceneBDelegate.m - (void) onDismissWithValue:(onResultBlock) callbackBlock { NSMutableDictionary *aMutDict = [[NSMutableDictionary alloc] init]; [aMutDict setValue:@"Value" forKey:@"Some Data"]; objCallback(aMutDict, nil); } //Call block from scene bellow SceneBDelegate *aObjVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SceneBDelegate"]; [aObjVC onDismissWithValue:^(NSDictionary *DictData, NSError *error) { }]; 

Intente usar este código:

 @interface YourClass : NSObject { void (^_block)(BOOL *result); } -(void) yourMethod:(NSString *)param1 withAnotherParam:(NSDictionary *)param2 withBlock:(void(^)(BOOL *result))block; @implementation YourClass -(void) yourMethod:(NSString *)param1 withAnotherParam:(NSDictionary *)param2 withBlock:(void(^)(BOOL *result))block { block = [block copy]; //do some stuff block(YES); } 

Y luego, cuando yourMethod a tu yourMethod desde una class diferente, puedes hacer lo siguiente:

 @implementation OtherClass -(void) otherMethod { //do other stuff [yourClassInstance yourMethod:@"hello" withAnotherParam:@{@"hello": @"hello"} withBlock:(void(^)(BOOL *result)){ //do stuff in the block.... }]; } 

Espero que esto ayude.