您的位置:首页 > 移动开发 > IOS开发

IOS 中的 handler

2016-03-25 11:14 441 查看
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回到主线程。

这样就完整了来了一次请求和接受数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: