Search code examples
objective-cipadxcode4objective-c-blocks

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..


Solution

  • 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.