異步處理1
在新線程中執行處理:
問題:應用需要執行非常耗時的任務,但是又希望用戶界面保持響應,不會受到新操作的影響.
- 不開辟一個新線程的做法
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,strong)UIActivityIndicatorView*myActivityIndicator;
@property(nonatomic,strong)UIButton*myButton;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 創建button
self.myButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];
self.myButton.frame=CGRectMake(20, 403, 280, 37);
[self.myButton addTarget:self action:@selector(bigTaskAction) forControlEvents:UIControlEventTouchUpInside];
[self.myButton setTitle:@"do long task" forState:UIControlStateNormal];
[self.view addSubview:_myButton];
//創建indicator
self.myActivityIndicator=[[UIActivityIndicatorView alloc]init];
self.myActivityIndicator.frame=CGRectMake(142, 211, 37, 37);
self.myActivityIndicator.activityIndicatorViewStyle=UIActivityIndicatorViewStyleWhiteLarge ;
self.myActivityIndicator.hidesWhenStopped=NO;
[self.view addSubview:self.myActivityIndicator];
}
-(void)bigTask{
@autoreleasepool {
for (int i=0; i<10000; i++) {
NSString*newString=[NSString stringWithFormat:@"i=%d",i];
NSLog(@"%@ ",newString);
}
[self.myActivityIndicator stopAnimating];
}
}
//沒有開辟新線程
-(void)bigTaskAction{
[self.myActivityIndicator startAnimating];
[self bigTask];
}
@end
- 開辟一個新線程
-(void)bigTaskAction{
[self.myActivityIndicator startAnimating];
//開辟新的線程
[NSThread detachNewThreadSelector:@selector(bigTask) toTarget:self withObject:nil];
}
總結:
一般情況下執行代碼的時候,是一行一行的執行,上一行沒有執行完成會等待,現在進行開辟線程,可同時執行 這里就是: 一邊for循環在處理 ,一邊指示器在界面上響應