【问题标题】:Objective-c how to update UI depending on background processObjective-c如何根据后台进程更新UI
【发布时间】:2018-06-06 21:38:16
【问题描述】:

我正在开发一款 iPad 应用程序,但遇到了问题。我使用 Reachability 来检查设备是否连接到网络(工作正常),并且我想更新图像视图以在网络断开连接时将其从 wifi 图标传递到无 wifi 图标。所以我发现我可以做一个后台进程来不断检查设备是否像这样连接:

// Allocate a reachability object
Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];

// Set the blocks
reach.reachableBlock = ^(Reachability*reach)
{

    dispatch_async(dispatch_get_main_queue(), ^{
        connectivity = true;
        NSLog(@"REACHABLE!");
    });
};

reach.unreachableBlock = ^(Reachability*reach)
{
    connectivity = false;
    NSLog(@"UNREACHABLE!");
};
// Start the notifier, which will cause the reachability object to retain itself!
[reach startNotifier];

这可行,但我不知道将我的图像修改放在哪里才能使其正常工作,因为如果我把它放在 NSLog() 之前,我会得到“imageView setImage must be used only from main thread”

感谢您的帮助。

【问题讨论】:

    标签: ios objective-c networking reachability


    【解决方案1】:

    您必须在主线程上更新 UI。为此,您应该在检测到 wifi 已连接/断开连接时致电 dispatch_async(dispatch_get_main_queue()),然后相应地更新您的图像。像这样:

    reach.reachableBlock = ^(Reachability*reach)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            connectivity = true;
            NSLog(@"REACHABLE!");
            [yourImage setImage:[UIImage imageNamed:@"withWifi"]];
        });
    };
    
    reach.unreachableBlock = ^(Reachability*reach)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
            connectivity = false;
            NSLog(@"UNREACHABLE!");
            [yourImage setImage:[UIImage imageNamed:@"noWifi"]];
        });
    };
    

    【讨论】:

      【解决方案2】:

      dispatch_async 里面是正确的地方。您需要在unreachableBlock 中添加类似的块。

      正如错误消息所说,您只能从主线程修改 Ui。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2021-10-08
        • 1970-01-01
        • 2013-03-19
        相关资源
        最近更新 更多