NSThread和dispatch_async用法和区别

来源:互联网 发布:淘宝上的优衣库代购 编辑:程序博客网 时间:2024/05/22 14:50

//启动线程     [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:ImageURL];          dispatch_queue_t newThread = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);     dispatch_async(newThread, ^{         [self downloadImage:ImageURL];     }); 



1、你使用global队列可能会导致分派时间过长。由于global队列中可能会含有较多的系统队列。   
2、dispatch_async调度本身是有开销的,因此你把[activity startAnimating];放在最上面是不妥的。最好的方式是用一个标志,等待download这个函数所处的核被激活后调。   
3、NSThread的方式或许能做更快的切换,因为ARMv6或更高版本的处理器都提供了非常强大的线程切换机制。但是NSThread不会采取多核的分派,因为这个系统接口首先要保证的是用户线程的可靠性。   
而Grand Central Dispatch显式地利用分派队列来做多核分派调度,因此如果是在多核处理器上的话用G_C_D更快。   

如果你的处理器是单核心的话,那么可以使用切换更快的NSThread。


-(void)GetdataAndReloadData:(int) CurrentPageIndex{    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    dispatch_async(queue, ^(void){      //如果用dispatch_sync的话不能看到点击后cell.textlabel.text变成(正在加载。。。。)        [JsonParse GetModelList:CurrentPageIndex OnFinsh:^(NSMutableArray *dic)         {             SubjectModelList=dic;             dic=nil;             dispatch_queue_t main=dispatch_get_main_queue();             dispatch_async(main, ^(void){                 [_SubjectList reloadData];                 [_SubjectList scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]  atScrollPosition:UITableViewScrollPositionTop animated:NO];             });         }];            });}//delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{    if (indexPath.row==0)    {        if(PageIndex==1)//第一页无法加载上一页            return;        UITableViewCell *cell=[_SubjectList cellForRowAtIndexPath:indexPath];       cell.textLabel.text=@"正在加载...";        [self GetdataAndReloadData:--PageIndex];                return;    }    if(indexPath.row==SubjectModelList.count+1)    {        UITableViewCell *cell=[_SubjectList cellForRowAtIndexPath:indexPath];        cell.textLabel.text=@"正在加载...";        [self GetdataAndReloadData:++PageIndex];                return;    }    ContentViewController *content=[[ContentViewController alloc] init:[SubjectModelList objectAtIndex:indexPath.row-1] ];    [self.navigationController pushViewController:content animated:YES];    content=nil; }
async是异步执行,sync是同步执行

原创粉丝点击