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..
First, never change UI outside of the main thread. So your should modify your code into something like:
Second, never change UI inside the method
shouldAutorotateToInterfaceOrientation
. All you have to do inside that method is return whether the view should rotate or not. For instance, in some cases where you have a view controller hierarchy, the view might not get rotated even if you returnYES
inshouldAutorotateToInterfaceOrientation
.So, you should call your code inside the method:
This can be achieved in many ways. The simplest (and the one I recommend) is to use a standard Objective-C method:
You don't really need to call the block itself from multiple places. But if you still want to do that, there are many answers here that show you how to do that.
Just make a
@property
that's a block, store it, and use it again later:Declare an instance variable of block type and use
Block_copy
to keep the block: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.