Ответ 1
Я делаю именно то, что вы пытаетесь использовать NSOperationQueue
. Сначала создайте последовательную очередь и приостановите ее по умолчанию:
self.operationQueue = [[[NSOperationQueue alloc] init] autorelease];
self.operationQueue.maxConcurrentOperationCount = 1;
[self.operationQueue setSuspended:YES];
Затем создайте экземпляр Reachability и зарегистрируйтесь для kReachabilityChangedNotification
:
[[NSNotificationCenter defaultCenter] addObserver:manager
selector:@selector(handleNetworkChange:)
name:kReachabilityChangedNotification
object:nil];
[self setReachability:[Reachability reachabilityWithHostName:@"your.host.com"]];
[self.reachability startNotifier];
Теперь начните и остановите свою очередь при изменении состояния сети:
-(void)handleNetworkChange:(NSNotification *)sender {
NetworkStatus remoteHostStatus = [self.reachability currentReachabilityStatus];
if (remoteHostStatus == NotReachable) {
[self.operationQueue setSuspended:YES];
}
else {
[self.operationQueue setSuspended:NO];
}
}
Вы можете поставить в очередь свои блоки:
[self.operationQueue addOperationWithBlock:^{
// do something requiring network access
}];
Приостановка очереди только предотвратит запуск операций - она не приостанавливает выполняемую операцию. Всегда существует вероятность того, что вы потеряете сеть во время выполнения операции, поэтому вам следует учитывать ее в своей работе.