天天看点

IOS 中的 handler

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回到主线程。

这样就完整了来了一次请求和接受数据

iOS