开发者社区> 问答> 正文

block+Gcd 异步请求 在block回调里 刷新UI 为什么实现不了 ?报错

界面中模拟   点button  异步请求    再block回调中 拿到请求数据       赋给上面的lable   模拟刷新UI  

代码:   点击事件中

- (IBAction)Request:(id)sender {
    
block_Interface *bi=[[block_Interface alloc] init];  
    __block
    ViewController *mySelf=self;
    
[bi getdate:self block:^(id data){
   NSLog(@"%@",@"拿到数据  异步刷新界面");
     NSLog(@"回调拿到的数据>>>>>>>>>%@",data);
    if (data) {
        NSLog(@"回调拿到的数据>>>>>>>>>%@",data);
        //下面只要一操作   slef的成员  就蹦了
        
        
        dispatch_async(dispatch_get_main_queue(), ^(void){

            
             if([NSThread isMainThread])
                 NSLog(@"当前再主线程下.....");
            
            
            mySelf.lable.text=(NSString *)data;
            //mySelf.t=@"测试,block里能访问到self 的属性 并赋值";
       });
     
    }
    NSLog(@"完成");
    }];
}
我再  dispatch_async(dispatch_get_main_queue(), ^(void){  

[NSThread isMainThread]

判断是否是再主线程下
里面只要一操作  myself的成员 就崩了...
请各位 指正下...(数剧可以再 block回调中得到,也能打印,只要我一操作myself 或它的成员lable  赋值或取值   都会报错....)


  错误信息:

展开
收起
爱吃鱼的程序员 2020-06-22 22:38:56 422 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    遇到同样的问题,请问楼主有没有解决?

    已解决:

    原因是我在 .h文件中声明block变量时

    @property(nomaric,assign)定义的block类型 变量名;

    中你可以看到我用了assign,导致我在调用的可能已经被释放掉。

    你可以查查在使用block做属性申明时,。最好使用copy  但使用retain也是可以的。。 

    希望能帮到你

    2020-06-22 22:39:13
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用TensorFlow搭建智能开发系统自劢生成App UI代码 立即下载
Fusion Design - 企业级UI解决方案揭秘 立即下载
使用TensorFlow搭建智能开发系统自动生成App UI 立即下载