【问题标题】:Updating view iOS更新视图 iOS
【发布时间】:2024-01-21 07:47:01
【问题描述】:

我正在编写一个监听 NSOperation 中的套接字的 iOS 应用程序。当在套接字上读取某些内容时,我通过调用 UIViewController 的方法来更改视图的内容(只是更改某些标签的隐藏参数)。问题是视图不会立即刷新。为什么会这样,我该如何解决这个问题?

在我的 UIViewController 的 viewDidLoad 中:

_broadcastQueue = [[NSOperationQueue alloc] init];
_broadcastQueue.name = @"broadcastPairing";
PairingDevice *broadcast = [[PairingDevice alloc] initWithCode:_code andDelegate:self];
[_broadcastQueue addOperation:broadcast];

当监听器接收到数据时,我调用:

[self.delegate setClientConnectedWithSocket:sockTCP andIP:[NSString stringWithUTF8String:inet_ntoa(sin.sin_addr)] andHostname:[NSString stringWithUTF8String:data.machineName]];

在我做的 UIViewController 的那个方法中(现在):

    _codeLabel.hidden = YES;
    _infoText.hidden = YES;

    _hostLabel.hidden = NO;
    _ipLabel.hidden = NO;
    _ipLabel.text = ip;
    _hostLabel.text = hostname;

【问题讨论】:

  • 代码很多..我会尝试通过编辑我的帖子来重新使用它

标签: ios uiview refresh nsoperation


【解决方案1】:

确保您在应用程序的主线程上执行该代码。
这只是一个假设,但我猜您的网络调用是在后台线程中执行的(如预期的那样),因此您需要在主线程中完成所有 UI 工作:

dispatch_async(dispatch_get_main_queue(), ^{
// Your UI code
});

【讨论】:

    【解决方案2】:

    可能你的套接字不在主线程中监听。
    尝试使用操作主队列扭曲委托调用,如下所示:

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
       [self.delegate setClientConnectedWithSocket:sockTCP andIP:[NSString stringWithUTF8String:inet_ntoa(sin.sin_addr)] andHostname:[NSString stringWithUTF8String:data.machineName]];
    }];
    

    此外,在给他打电话之前检查代表是否回复了@selectore

    【讨论】:

    • 这解决了问题。但我有一个问题:队列之间不共享内存?