進程與線程,進程線程
主線程裡面執行耗時操作會導致介面阻塞,所以一般把耗時操作放到子線程執行,例如網路請求、線程睡眠、負載檔案、大量運算。1、不要把耗時操作放到主線程。2、不要把修改頁面的代碼放到子線程(子線程修改頁面不會等到及時更新)
第一種開啟子線程的方法NSThread //開啟一個子線程 [NSThread detachNewThreadSelector:@selector(createMouse)toTarget:selfwithObject:nil];
//返回主線程 [selfperformSelectorOnMainThread:@selector(updateUI:)withObject:self.mousewaitUntilDone:NO];
第二種開啟子線程的方法GCDGrand Central Dispatch (GCD)是Apple開發的一個多核編程的解決方案,自己建立的線程隊列為串列隊列,擷取系統提供的線程隊列為並行隊列。 //開啟一個子線程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
NSData *data = [NSDatadataWithContentsOfURL:[NSURLURLWithString:self.imagaPaths[indexPath.row]]];
UIImage *image = [UIImageimageWithData:data];
//返回主線程
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image= image;
[cell setNeedsLayout];
}); });
第三種開啟子線程的方法NSOperation建立出來的線程隊列預設為並行隊列。- (void)viewDidLoad
{
[super viewDidLoad];
//方式一開啟一個線程
NSOperation *op1 = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(newThreadAction)object:nil];
//方式二開啟一個線程
NSOperation *op2 = [NSBlockOperationblockOperationWithBlock:^{
for (int i=0; i<5; i++) {
[NSThread sleepForTimeInterval:.5];
NSLog(@"線程2--%d",i);
}
}];
//建立線程隊列,預設建立出來的線程隊列為並行隊列
NSOperationQueue *myQueue = [[NSOperationQueuealloc]init];
//設定最大同時執行的線程數量
[myQueue setMaxConcurrentOperationCount:1];
//給op1添加一個依賴依賴op2
[op1 addDependency:op2];
//將線程添加到隊列,線程添加到隊列後才會執行
[myQueue addOperation:op1];
[myQueue addOperation:op2];
}
- (void)newThreadAction{
for (int i=0; i<5; i++) {
[NSThread sleepForTimeInterval:.5];
NSLog(@"線程1--%d",i);
}}
GCD與NSOperation的區別1、GCD,代碼更簡潔,使用更加方便,GCD更加高效,因為屬於C語言的文法,更底層。2、NSOperation,靈活控制線程之間的關係,可以設定同時執行的線程數量。 //設定最大同時執行的線程數量,如果設定為1,則相當於線程串列執行 [myQueue setMaxConcurrentOperationCount:1]; //給op1添加一個依賴依賴op2,先執行op2,再執行op1 [op1 addDependency:op2];