在调用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
并且没有调用选择器方法。
在从函数获得响应后如何更改完成块中的文本?谢谢。
答案 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;
}