IOS上的多线程应用程序开发需要使用到Block,Block就是类似于C++中的函数指针的概念。
Block的主要用途在于多线程操作的情况。正常情况下流程如下:
可以看到,在没有多线程处理的情况下,我们点击sleep按钮之后,在wake up之前是不能点击generate按钮的,所以需要多线程处理。代码修改为:
Block的主要用途在于多线程操作的情况。正常情况下流程如下:
- 创建一个queue;dispatch_queue_create
- 添加block到queue;dispatch_async
我们的界面中有两个button,两个label,事件处理代码如下:
- (IBAction)generateNumber:(id)sender {
NSString *str = [[NSString alloc] initWithFormat:@"Generate Number is %d.", arc4random()];
[randomNumber setText: str];
}
- (IBAction)sleep:(id)sender {
[sleepText setText: @"Now I'm going to sleep."];
[NSThread sleepForTimeInterval:5];
[sleepText setText: @"Now I wake up!"];
}
可以看到,在没有多线程处理的情况下,我们点击sleep按钮之后,在wake up之前是不能点击generate按钮的,所以需要多线程处理。代码修改为:
- (IBAction)generateNumber:(id)sender {
NSString *str = [[NSString alloc] initWithFormat:@"Generate Number is %d.", arc4random()];
[randomNumber setText: str];
}
- (IBAction)sleep:(id)sender {
queue = dispatch_queue_create("my working queue", NULL);
// 工作线程在后台异步工作
dispatch_async(queue, ^(void){
[self workingBackground];
});
}
- (void)workingBackground
{
// 模拟后台工作
[NSThread sleepForTimeInterval:5];
// 通知前台刷新
dispatch_async(dispatch_get_main_queue(), ^(void){
[self refreshForground];
});
}
- (void)refreshForground
{
[sleepText setText:@"Now I wake up!"];
}