Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to name a block of code and call it in a different method?

I use Grand Central Dispatch methods to do some executions of my app in a queue. I decide the frames for buttons in a calculation on that queue. I want my app to re-draw its scren and calculate new frames after rotation. Here is some pseudo code explanation from what i do:

 CGFloat a=123, b=24;
     dispatch_async(drawingQue, ^{
        //needed loops to get the total button count-how many ones will be drawn et..
        for(int x=0;x<someCount<x++){
           for(int y=0;y<anotherCount;y++){

        //needed frame&name ect assingments

        button.frame= CGRectMake(x+y, x-y, a, b);
        [button setTitle:@"abc"];}}
        };

Here what i want is, how can i give this block a name and re-use it in the

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
} 

delegate method? For instance, if the rotation is landscape, i want to use a=234 instead of 123.. Any help please. Thanks in advance..

like image 656
ilhnctn Avatar asked Mar 30 '12 08:03

ilhnctn


2 Answers

Declare an instance variable of block type and use Block_copy to keep the block:

@interface My {
    void (^myBlock)(void);
}
@end

myBlock = Block_copy(^{
    ...block code...
});

// later call it
myBlock();

// don't forget to release it in dealloc

It is important to copy the block before storing it outside of the scope of its literal (^{...}), because the original block is stored on stack and will die when the scope exits.

like image 200
hamstergene Avatar answered Nov 14 '22 21:11

hamstergene


Just make a @property that's a block, store it, and use it again later:

typedef void (^MyBlock)(CGFloat, CGFloat);
...
@property(readwrite, copy) MyBlock buttonFramesBlock;
...
@synthesize buttonFramesBlock;
...
self.buttonFramesBlock = ^(CGFloat a, CGFloat b){
    //needed loops to get the total button count-how many ones will be drawn et..
    for(int x=0;x<someCount<x++){
       for(int y=0;y<anotherCount;y++){

    //needed frame&name ect assingments

    button.frame= CGRectMake(x+y, x-y, a, b);
    [button setTitle:@"abc"];}}
};
...
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    dispatch_async(drawingQue, ^{
        self.buttonFramesBlock(234,someOtherInt);
    });
} 
like image 35
yuji Avatar answered Nov 14 '22 23:11

yuji