android和ios一样,都是说UI线程不能处理子线程,这点对android我不就想解释了 要是在android上面,activity的UI线程5秒没响应就会出现NAR,广播是10秒。
ios的处理,我知道有2种,一种是缓存区, 一种是GCD,和android的handler很想的 这里你需要了解的是block机制,
(这里我有个疑问,我们都是知道耗时操作是不好的UI体验,但是我发现为什么在ios子线程上处理UI没异常呢,好奇,求高手指教一下) 下面是我的代码, 在 ViewController的 viewDidLoad 写的
// NSThread *me=[[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod) object:nil];
// [me start];
-(void)myThreadMainMethod{
// NSURL * url = [NSURL URLWithString:@"http://www.2cto.com/uploadfile/2012/0926/20120926092632207.png"];
// NSData * data = [[NSData alloc]initWithContentsOfURL:url];
// UIImage *image = [[UIImage alloc]initWithData:data];
// uibutton.backgroundColor= [[UIColor alloc] initWithPatternImage:image];
}
我实现即时在dispatch上做试验也是木有错误,暴异常。所以对我我这菜鸟,我只能表示无赖了。求大师赐教,
为保险起,还是按照子不能处理UI的来写。即时不报错。
下面是一个帖子上的,不好意思哈,复制过来之后,删除了。很不好依稀哈
首先在interface中用dispatch——queue来处理请求,然后通过block进行回调,
再在调用的时候处理block回调回来的数据就行了,非常的简洁,代码量减少很多,且效率极高,嘿嘿。
第一步定义要回调的block
typedef void (^getCommentList)(id data,BOOL succeed);
data就是回调时传过去的服务器数据,succeed表示是否成功,当然也可以定义其它参数了
第二步用dispatch来创建队列请求数据
dispatch_queue_t queue = dispatch_queue_create("GetCommentList", NULL);
dispatch_async(queue, ^(){
NSURL *url=[NSURL URLWithString:URL_GetComments];
ASIFormDataRequest *request=[[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
[request setPostValue:uid forKey:UnloginView_id];
[request start];
NSMutableArray *content =[[request responseString] JSONValue];
block(content,YES);
});
dispatch_release(queue);
content就是请求回来的数据,经过解析后用block();回调。
第三步在需要创建请求的类里面实现这个方法
[MP_InterfaceShare getCommentList:str_mid block:^(id data, BOOL succeed) {
self.arr_objects = (NSMutableArray *)data;
dispatch_async(dispatch_get_main_queue(), ^(){
[self initWithControl];
[self stopTheHoldFire];
});
}];
这里的data就是刚才的content,如果需要处理UI更新的话就使用dispatch_get_main_queue回到主线程。
这样就完整了来了一次请求和接受数据