Ios: блоки очереди в фоновом режиме и выполняются, когда сеть становится доступной

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

Я думал использовать GCD с приостановкой/возобновлением, когда сеть становится доступной/недоступной. Мне было интересно, есть ли лучшие варианты? Будет ли это работать, если приложение будет помещено в фоновом режиме? Дело здесь в том, что пользователь сохраняет некоторые данные, когда сеть недоступна (которая попадает в очередь), а затем помещает приложение в фоновом режиме. Теперь, когда сеть становится доступной, возможно ли автоматическое сохранение в фоновом режиме?

Ответы

Ответ 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
}]; 

Приостановка очереди только предотвратит запуск операций - она ​​не приостанавливает выполняемую операцию. Всегда существует вероятность того, что вы потеряете сеть во время выполнения операции, поэтому вам следует учитывать ее в своей работе.

Ответ 2

Отъезд - [PFObject saveEventually]. Это должно делать то, что вы пытаетесь сделать автоматически, и имеет дополнительное преимущество - быть устойчивым к завершению приложения.

Ответ 3

Вы рассмотрели использование библиотеки AFNetworking? Я считаю, что он имеет крючки в Reachabiltiy и может вести себя точно так, как вы хотите.

Ответ 4

Я большой поклонник GCD и Blocks, но для этого я бы построил решение, используя NSOperationQueue. GCD, на мой взгляд, больше подходит для материала низкого уровня. С помощью NSOperationQueue у вас есть возможность отменить определенные операции. Также вы можете выражать зависимости от других операций (если это необходимо в вашем приложении).