IOS线程的使用 performSelectorOnMainThread

时间:2022-02-11 17:31:09

·使用线程可以把占据时间长的程序中的任务放到后台去处理 ·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 ·程序的运行速度可能加快 ·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。


performSelectorOnMainThread 方法。

NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];

[self performSelectorOnMainThread:@selector(RefreshCellForLiveId:)

withObject:userinfo

waitUntilDone:YES];

[pool release];


该方法的作用是在主线程中,执行制定的方法(代码块)。

参数:

@selector(RefreshCellForLiveId:)就是,要定义我们要执行的方法。

withObject:userinfo

定义了,我们执行RefreshCellForLiveId:方法时,传入的参数对象。类型是id。(我们可以传入任何参数)

waitUntilDone:YES];

指定,当前线程是否要被阻塞,直到主线程将我们制定的代码块(RefreshCellForLiveId:方法)执行完。


注意:

1.当前线程为主线程的时候,waitUntilDone:YES参数无效。

2.该方法,没有返回值

3.<span style="color:#FF0000;">该方法主要用来用主线程来修改页面UI的状态。例如跟新tableview

[self performSelectorOnMainThread:@selector(reloadtableview) withObject:nil waitUntilDone:YES];
</span>
程序开发中可以使用performselectorinbackground 来进行数据的获取,在performSelectorOnMainThread中进行UI的修改。

例如使用HUD展示界面 后后面采用performselectorinbackground获取网络数据最后使用performSelectorOnMainThread 显示结果。


例如

 if (HUD!=nil) {
[HUD release];
}
HUD = [[MBProgressHUD alloc] initWithView:self.view];
[self.view addSubview:HUD];

HUD.delegate = self;
HUD.labelText = @"正在发送信息...";
HUD.detailsLabelText = @"请稍候";
HUD.square = YES;
[HUD showWhileExecuting:@selector(SendBackProcess) onTarget:self withObject:nil animated:YES];
注意此时在返回主线程是最好将HUD关闭,执行[self hudWasHidden]函数

- (void)hudWasHidden {
// Remove HUD from screen when the HUD was hidded
[HUD removeFromSuperview];
[HUD release];
HUD=nil;

}



-(void)SendBackProcess ///////点赞
{

NSString *httpurl=[NSString stringWithFormat:@"%@/praisetopic",CMMUNITYURL];

int ret= [self SendActionData:httpurl];
if (ret!=0) {

[self hudWasHidden];
[self performSelectorOnMainThread:@selector(reloadtableview) withObject:nil waitUntilDone:YES];
// [DataTableView reloadData];
}
else
{
// [self LoadData];

[self hudWasHidden];
[self showAlert:@"网络错误。"];
}

// [self performSelectorOnMainThread:@selector(reloadtableview) withObject:nil waitUntilDone:YES];
}