在completionblock中无法更改UILabel文本

时间:2016-04-19 12:47:57

标签: ios objective-c iphone

在调用performpost之前,notifyDownloadInfo可以正常工作,但在completionHandler setTextForDownloadInfo调用中,但标签没有更新。

performpost是一个使用AFNetworking发出请求的异步函数。

Aclass.m

       +(void)downloadAinformation{
          [self performPost:....... completionHandler:^() {

            [ClassUtil notifyDownloadInfo:@"string"];
            });
        }
        +(void)notifyDownloadInfo:(NSString*)str{

            NSDictionary* userInfo = @{@"text": str};
            [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationDownloadInfoText object:self userInfo:userInfo];

        }

Bclass.m

    - (void)viewDidAppear:(BOOL)animated{

        [super viewDidAppear:animated];


        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(setTextForDownloadInfo:)
                                                     name:kNotificationDownloadInfoText
                                                   object:nil];
        [self downloadData];
    }

    - (void)setTextForDownloadInfo:(NSNotification*)notification{
        NSString *str = notification.userInfo.allValues.firstObject;
        dispatch_async(dispatch_get_main_queue(), ^{
           self.downloadInfoLabel.text = str;
        });
        NSLog(@"%@",str);
    }

   -(void)downloadData{
      [Bclass downloadAinformation];
    }

我试图将setTextForDownloadInfo放在其中,但它没有进入它内部:

dispatch_async(dispatch_get_main_queue(), ^{

我也performSelectorOnMainthread并且没有调用选择器方法。

在从函数获得响应后如何更改完成块中的文本?谢谢。

3 个答案:

答案 0 :(得分:1)

@ e.ozmen,

self.downloadInfoLabel.text = str; 

有用吗?

如果是这样,也许在IB中没有连接downloadInfoLabel?

如果没有,可能是发布通知时出现问题,请尝试将其更改为

[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationDownloadInfoText 
                                                    object:nil 
                                                  userInfo:userInfo];

参数'object'为零。

希望有所帮助:)

答案 1 :(得分:0)

我要检查的第一件事是确保str的内容是否正确。在创建单元格后立即使用NSLog(@"%@", str)。如果内容是正确的并且您有疑问,可能会在后台线程中触发该方法,那么您应该尝试使用__block NSString *string = @"Hello World!"来确保字符串在主线程中有效。

如果标签正确坐好,我会确保第二件事。如果使用的是界面构建器,请仔细检查是否正确提供了界面构建器项与类之间的连接。更重要的是,你应该检查标签是否有正确的框架,没有其他项目覆盖它。由于某种原因,可能未将子视图添加到主内容视图中。

答案 2 :(得分:0)

我从link

获得帮助

这是我的代码:

+(void)downloadAinformation{
  [self performPost:....... completionHandler:^() {

     dispatch_queue_t newQueue = dispatch_queue_create("newQueue", nil);
     dispatch_async(newQueue, ^{
                  [ClassUtil notifyDownloadInfo:@"string"];  
      });
  });
}



- (void)setTextForDownloadInfo:(NSNotification*)notification{
    NSString *str = notification.userInfo.allValues.firstObject;
    [self performSelectorOnMainThread:@selector(updateLabel:) withObject:str waitUntilDone:YES];
}

- (void)updateLabel:(NSString*)str{
    self.downloadInfoLabel.text = str;
}