Objective-c, как обновить пользовательский интерфейс в зависимости от фонового процесса - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над приложением для iPad и столкнулся с проблемой. Я использую Reachability, чтобы проверить, подключено ли устройство к сети (что работает нормально), и я хочу обновить представление изображения, чтобы передать его из значка wifi в значок no 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 должен использоваться только из основного потока"

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы должны обновить пользовательский интерфейс в главном потоке. Для этого вам следует позвонить dispatch_async(dispatch_get_main_queue()), когда вы обнаружите, что Wi-Fi был подключен / отключен, а затем обновить свое изображение соответствующим образом. Вот так:

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"]];
    });
};
0 голосов
/ 27 апреля 2018

внутри dispatch_async это правильное место. Вам необходимо добавить аналогичный блок в unreachableBlock.

Как говорится в сообщении об ошибке, вы можете изменять интерфейс только из основного потока.

...