2014-02-18 3 views
1

Я хочу, чтобы приложение iOS загрузило некоторую информацию о продукте с сервера в фоновом режиме. Он должен работать при активном и неактивном режиме приложения.Задача данных NSURLSession - Полученные данные процесса

Использование NSURLSessionDataTask Я мог бы получить данные. Но не удалось обработать данные в неактивном режиме.

Не могли бы вы направить меня, если я могу обработать данные, когда приложение находится в фоновом режиме/неактивном состоянии? Или любое другое предложение.

Смотрите мой код ниже:

NSURLSessionConfiguration *sessionConfig=[NSURLSessionConfiguration defaultSessionConfiguration]; 
NSURLSession *session=[NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; 
NSURLSessionDataTask *sessinURLResData = [session dataTaskWithURL:urlIs completionHandler:^(NSData * dataa,NSURLResponse *response,NSError * error){ 
    responseData = dataa;// process the data and save in local DB 
}]; 
[sessinURLResData resume]; 
+0

Я наблюдал то же самое с NSURLSessionDownloadTask. Как работает NSSessionURL? Пожалуйста, предложите. – user1278228

+0

Спасибо, Роб. Я хочу получить данные даже в приложении в фоновом режиме. Сохраняя код, загружающий данные, но не достигая завершения. Handler, пока приложение не появится на переднем плане.NSURLSessionConfiguration * sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession * session = [NSURLSession sessionWithConfiguration: sessionConfig delegate: self delegateQueue: nil]; NSURLSessionDataTask * sessinURLResData = [session dataTaskWithURL: urlIs completeHandler:^(NSData * dataa, NSURLResponse * response, NSError * error) {responseData = dataa; // обрабатывать данные и сохранять в локальном БД}]; [sessinURLResData resume]; – user1278228

ответ

4

Есть по крайней мере два типа фона выбирает:

  1. Если вы хотите, чтобы ваше приложение, чтобы периодически проверять данные, пока не работает на переднем плане, вы можете включить «фоновая выборка» в «возможностях» приложения, а затем делегат приложения выполнит эту выборку в performFetchWithCompletionHandler. Вы можете выполнять только быстрые (30 секунд или меньше) сетевые запросы. Но ваше приложение будет делать запрос сети и вызвать соответствующий код обработчика завершения из приложения делегата, сообщая либо отказ, наличие новых данных, или отсутствие новых данных:

    - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
    { 
        NSURL *url = [NSURL URLWithString:@"..."]; 
        NSURLSession *session = [NSURLSession sharedSession]; 
        NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
         if (error) { 
          completionHandler(UIBackgroundFetchResultFailed); 
          return; 
         } 
    
         BOOL foundNewData; 
    
         // parse the data; setting `foundNewData` as appropriate 
    
         if (foundNewData) { 
          completionHandler(UIBackgroundFetchResultNewData); 
         } else { 
          completionHandler(UIBackgroundFetchResultNoData); 
         } 
        }]; 
    
        [task resume]; 
    } 
    
  2. Совершенно другой тип фонового сетевого запроса соответствует фону NSURLSessionConfiguration, отлично подходит для больших загрузок/загрузок в фоновом режиме. Для этого любые загрузки/загрузки, которые вы инициируете, будут продолжаться, даже если приложение больше не находится на переднем плане (даже если приложение завершено), и когда все будет готово, ваше приложение будет перезагружено, если это необходимо, и соответствующие методы делегата будут называется. Но для этого вам необходимо:

    • [NSURLSessionConfiguration backgroundSessionConfiguration:identifier];

    • использовать делегатский NSURLSession (который вы есть);

    • использовать загрузку или загрузку задач, а не задач данных;

    • использовать метод фабрики загрузки/выгрузки, который делает не использовать блок завершения (вы должны реализовать методы делегата);

    • Делегат приложения отвечает на handleEventsForBackgroundURLSession, захватывая completionHandler; и

    • Внесите URLSessionDidFinishEventsForBackgroundURLSession: в делегат сессии, который будет вызывать completionHandler, когда вы закончите обработку всего.

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

+0

Каким будет другой способ? Вы указываете, что с NSURLSessionConfiguration вы не можете использовать задачу данных. Это не хорошо для меня, так как я не загружаю/не загружаю файл (я просто отправляю и отправляю Http-сообщение на сервер) – CedricSoubrie

+1

Не то, чтобы вы не могли использовать задачу данных с 'NSURLSessionConfiguration', а скорее можете Не используйте задачу данных с фоновым сеансом (что, я уверен, это то, что вы имели в виду). Но, отложив это, даже если вы не загружаете или загружаете что-либо, просто используйте загрузку или загрузку, независимо от того. Например, рассматривайте его как задачу загрузки, а «загрузка» - это всего лишь ответ, полученный с вашего сервера (например, любой ответ, который ваш сервер отправляет вам). Просто потому, что это задача загрузки, это не значит, что вы должны фактически сохранить ответ в виде файла в любом месте ... – Rob

Смежные вопросы