2016-02-04 6 views
1

Это может быть глупый вопрос, но у меня есть некоторые проблемы, меняющие мой код, чтобы избежать устаревшего кода в iOS9.sendSynchronousRequest не рекомендуется. Как я могу достичь такого же результата с помощью dataTaskWithRequest?

Я создал приложение, которое входит на веб-страницу. На веб-странице используется имя пользователя и пароль, который пересылается на страницу, где должен быть введен токен.

Я смог войти на эту веб-страницу, используя три URL-адреса, которые были загружены синхронно в цикле for. Вот краткий пример процесса:

let urls = ["www.testpage.com", "www.testpage.com/username=erik&password=123", "www.testpage.com/token=123456"] 

for (index, url) in urls.enumerate() { 

    self.urlRequest = NSMutableURLRequest(URL: urlObject.baseUrl, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30.0) 

    NSURLConnection.sendSynchronousRequest(self.urlRequest, returningResponse: &response) 

    if index == 2 { 
      print("Login successful") 
    } 
} 

Это работает просто отлично, как синхронный запрос вызвал на URL в то время, в правильной последовательности.

У меня возникла проблема с достижением того же самого результата с dataTaskWithRequest, поскольку последний URL-адрес иногда запускается до того, как первый закончен.

Есть ли рекомендации по этому вопросу?

Цените любую помощь!

С уважением, Эрик

+0

См. Мой ответ здесь: http://stackoverflow.com/a/33205098/341994 – matt

+0

Спасибо @matt! Я посмотрю на это! – fisher

+0

@fisher вы получили 1: 1 падение в решении без блоков, async_dispatchs и т. Д., Только функция, которая выполняет http-get, блокирует текущий поток и затем возвращается? – Leo

ответ

-1

Не делай этого. Вместо этого, сделать что-то вроде этого:

let index: UInt = 0 

self.beginRequest(index, urls); 

, а затем написать Быструю версию этого:

- (void) beginRequestAtIndex: (NSUInteger) index inArray:(NSArray *)URLs { 
    NSURL *URL = URLs[index]; 
    NSURLRequest *req = [NSURLRequest requestWithURL:URL]; 
    // Configure request here. 

    NSURLSession *session = self.myURLSession; 

    NSURLSessionDataTask *task = [session dataTaskWithRequest:req 
              completionHandler:^(NSData *data, 
                NSURLResponse *response, 
                NSError *error))completionHandler { 

     if (++index >= [URLs count]) { 
      print("Login successful") 
     } else { 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), 
         dispatch_get_main_queue(), ^{ 
       [self beginRequestAtIndex:index inArray: URLs]; 
      }); 

      print("Login successful") 
     } 
    }]; 

} 

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