HomeViewController.h
#import "DataParser.h"
@interface HomeViewController : UIViewController <DataParserDelegate>
{
UILabel *theLabel;
}
HomeViewController.m
#import "HomeViewController.h"
@implementation HomeViewController
-(void)viewDidLoad
{
theLabel = [[UILabel alloc] initWithFrame:CGRectMake(200, 200, 100, 30)];
theLabel.text = @"Bob";
theLabel.font = [UIFont italicSystemFontOfSize:20.0];
theLabel.textColor = [UIColor whiteColor];
theLabel.backgroundColor = [UIColor blueColor];
[self.view addSubview:theLabel];
UIButton *theButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[theButton addTarget:self action:@selector(clicked:) forControlEvents:UIControlEventTouchUpInside];
[theButton setTitle:@"Big Button" forState:UIControlStateNormal];
theButton.frame = CGRectMake(100,100,200,50);
[self.view addSubview:theButton];
}
-(void)clicked:(id)sender
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0),
^{
DataParser *data = [[DataParser alloc] init];
data.delegate = self;
[data loadSomething];
dispatch_async(dispatch_get_main_queue(),
^{
NSLog(@"Thread done");
});
});
}
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
theLabel.frame = CGRectMake(250,250,100,30);
theLabel.text = @"This message displays fine";
}
-(void)loadMessage:(NSString *)message
{
NSLog(@"Received message: %@", message);
theLabel.frame = CGRectMake(300,300,100,30);
theLabel.text = @"This message won't display";
}
@end
DataParser.h
@protocol DataParserDelegate;
@interface DataParser : NSObject
@property (weak, nonatomic) id <DataParserDelegate> delegate;
-(void)loadSomething;
@end
@protocol DataParserDelegate <NSObject>
-(void)loadMessage:(NSString *)message;
@end
DataParser.m
#import "DataParser.h"
@implementation DataParser
@synthesize delegate=_delegate;
-(void)loadSomething
{
[[self delegate] loadMessage:@"ASDF"];
}
@end
-=-=-=-=-=-=-=-=-=-=-=-=-=-
Basically, I create a label and add it to the screen. At this point you can clearly see a Blue button with white text saying “Bob” on it. When you rotate the screen, the button changes text and position just fine. However, if I click the button, it creates a dataParser object, sets the delegate to self, and calls “loadSomething”. Within the dataParser object, “loadSomething” merely calls the delegate method “loadMessage”.
The question is, when “loadMessage” gets called, the NSLog statement prints correctly (“Received message: ASDF”), however, theLabel doesn’t move and doesn’t change its text. Why is this? And how do I fix this issue?
Try this code :
It should run it on the main thread.