Предотвратить выполнение `executeSelectorInBackground:` дважды? - PullRequest
4 голосов
/ 09 октября 2011

Так что я использую performSelectorInBackground:@selector(loadStuff) для загрузки вещей в фоновом режиме. Это займет некоторое время.

Пользователь может захотеть перезагрузить элементы, пока вышеописанный метод работает в фоновом режиме. Если я performSelectorInBackground:@selector(loadStuff) снова, пока другой метод уже запущен, я получаю все виды ошибок.

Есть ли простой способ справиться с этой ситуацией?

Я бы хотел остановить уже работающий в фоновом режиме метод, а затем запустить новый. (Или, если есть лучший способ достижения конечной цели, это тоже подойдет).

1 Ответ

2 голосов
/ 09 октября 2011

Если вы хотите начать все сначала, вы можете отменить соединение и создать новое.Поскольку вы собираетесь запускать этот метод в фоновом потоке, вам необходимо убедиться, что только один поток может одновременно обращаться к связанным переменным экземпляра:флаг для обозначения занятого состояния.Например, если вы хотите просто вернуть, если длительный метод уже обрабатывается в другом потоке, вы можете сделать это:

- (void)loadStuff
{
    @synchronized(self) {
        if (loadingStuff == YES)
            return;
        }
        loadingStuff = YES;
    }

    NSURLRequest *request = ...
    NSURLResponse *response;
    NSError *error;
    [NSURLConnection sendSynchronousRequest:request returningReseponse:&response error:&error];

    @synchronized(self) {
        loadingStuff = NO;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...