Загрузка автономных данных и данных, которые не удалось загрузить - PullRequest
2 голосов
/ 14 декабря 2011

Я размещаю данные на сервере (изображения и строковые данные).У меня есть атрибут в основных данных, называемый «статус» для каждого объекта, который я хочу загрузить.Я ввел в этот атрибут 3 статуса, чтобы указать статус загрузки: загрузка ожидает (загрузка еще не предпринята или предыдущая попытка не удалась), обработка загрузки (загрузка в данный момент) и загрузка завершена (загрузка завершена, успех).У меня есть таймер, который проверяет БД на загрузку всех ожидающих данных.

Это правильный способ обработки загрузки ошибочных данных и автономных данных?

Если это правильный путь, явозникла проблема с изменением статуса загрузки с «обработки загрузки» на «ожидание загрузки» или «загрузка завершена», когда загрузка выполняется, но пользователь выходит из приложения или по истечении времени ожидания запроса.Кто-нибудь знает, как справиться с этими ситуациями?

Кстати, я использую ASIHTTPRequest в качестве основы для отправки запросов к серверу.

Подробное описание того, как сделать это наилучшим образомполучит награду:)

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Идея таймера будет работать. Вызывайте uploadOutstandingObjects вашего класса менеджера данных через таймер с некоторым интервалом, который подходит для вашего приложения

Скажем, у вас есть сущность 'Foo', которую нужно загрузить. Вы можете выполнить следующее в своем классе менеджера данных ...

- (void)uploadOutstandingObjects {
     // I use the great MagicalRecord class for Core Data fetching
     // https://github.com/magicalpanda/MagicalRecord
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == pending"]
     NSArray *outstandingObjects = [Foo MR_findAllWithPredicate:predicate];
     for (Foo *foo in outstandingObjects) {
          [foo uploadToServer];
     }

Один из способов сделать это - использовать уведомления. Всякий раз, когда вы начинаете загрузку, вы заставляете этот объект слушать уведомление «uploadsStopped». После завершения загрузки загружаемый объект перестанет слушать.

Класс Foo:

- (void)uploadFailed {
    // change status to upload pending in the database for this 'foo' object
}
- (void)uploadComplete {
    // change status to upload complete in the database for this 'foo' object
}
-(void)uploadToServer {
   [[NSNotificationCenter defaultCenter] addObserver:self
                                            selector:@selector(uploadFailed:)
                                                name:@"uploadsStoppedNotification"
                                              object:nil ];

   // perform upload. If you are doing this synchronously...
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:<url here>];
   [request startSynchronously];
   if (![request error]) {
       [self uploadSucceeded];
       // stop listening to global upload notifications as upload attempt is over
       [NSNotificationCenter removeObserver:self];
   }
   else {
       [self uploadFailed];
       // stop listening to global upload notifications as upload attempt is over
       [NSNotificationCenter removeObserver:self];
}

Если ваше приложение закрывается, вы можете справиться с изменением статуса объектов «загрузки», которые еще не завершены.

- (void)applicationDidEnterBackground:(UIApplication *)application {
     // this will fire to any objects which are listening to
     // the "uploadsStoppedNotification"
     [[NSNotificationCenter defaultCenter]
           postNotificationName:@"uploadsStoppedNotification"
                         object:nil ]; 
0 голосов
/ 07 мая 2013

В качестве альтернативы для людей, которые приходят с этим вопросом / ответом, RestKit, кажется, делает это из коробки.

http://mobile.tutsplus.com/tutorials/iphone/advanced-restkit-development_iphone-sdk/

...