Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
#1

Из NSURLConnection в NSURLSsesion - Objective-C

07.06.2016, 08:35. Просмотров 1091. Ответов 6
Метки нет (Все метки)

Реализовал по примерам получение данных с сайта с помощью NSURLConnection, но как я понял, оно будет работать некорректно на новых версиях iOS
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// создаем ссылку
    NSString *lineURLfirst = [@"https://???.com/Contacts.svc/Hello?login=" stringByAppendingString:lineNameProfile];
    NSString *lineURLsecond = [@"&password=" stringByAppendingString:linePassword];
    NSString *lineURLresult = [lineURLfirst stringByAppendingString:lineURLsecond];
    
    // создаем запрос
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:lineURLresult]
     cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];
     
     // создаём соединение и начинаем загрузку
     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
     
     if (connection) {
     // соединение началось
     _labelStatus.text = @"Подключение...";
     // создаем NSMutableData, чтобы сохранить полученные данные
     receivedData = [NSMutableData data];
     } else {
     // при попытке соединиться произошла ошибка
     _labelStatus.text = @"Произошла ошибка!";
     }
}
 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // получен ответ от сервера
    [receivedData setLength:0];
}
 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // добавляем новые данные к receivedData
    [receivedData appendData:data];
}
 
- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error {
    
    // выводим сообщение об ошибке
    NSString *errorString = [[NSString alloc] initWithFormat:@"Ошибка подключения",
                             [error localizedDescription],
                             [error description],
                             [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]];
    _labelStatus.text = errorString;
}
 
 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    
    // вывод полученных данных
    NSString *dataString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
    
    _labelStatus.text = dataString;
}
К сожалению я только начал знакомство с iOS и get запросами, подобного примера по NSURSsesion я не нашел

Самый простой пример, что обнаружил:
Objective-C
1
2
3
4
5
6
7
8
NSString *dataUrl = @"YOUR_DATA_URL";
NSURL *url = [NSURL URLWithString:dataUrl];
 
// 2
NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession]
  dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  // 4: Handle response here
}];
Но не знаю как здесь управлять ("Handle response here") 'data','response','error'
Как получить данные?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Митя800
49 / 49 / 12
Регистрация: 13.07.2015
Сообщений: 165
07.06.2016, 19:17     Из NSURLConnection в NSURLSsesion #2
StriBog45, когда придет ответ с сервера, данные будут записаны в data типа NSData, не забудьте проверить на ошибки в error и код ответа с сервера в response
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
08.06.2016, 07:54  [ТС]     Из NSURLConnection в NSURLSsesion #3
В //4 не попадаю, данные не загружаются
p.s. ссылка рабочая проверено
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
NSURL *url = [NSURL URLWithString:lineURLresult]; // URL
        
        // 2
        NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession]
                                              dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                  // 4: Handle response here
                                                  id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
                                                  
                                                  if ([object isKindOfClass:[NSDictionary class]] && error == nil){
                                                      _labelStatus = [object objectForKey:@"Success"];
                                                  }
                                                  
                                              }];
Митя800
49 / 49 / 12
Регистрация: 13.07.2015
Сообщений: 165
10.06.2016, 19:30     Из NSURLConnection в NSURLSsesion #4
StriBog45, забыли вызвать метод
Objective-C
1
-resume
у объекта
Objective-C
1
downloadTask
After you create a task, you start it by calling its resume method. The session then maintains a strong reference to the task until the request finishes or fails; you do not need to maintain a reference to the task unless it is useful to do so for your app’s internal bookkeeping purposes.
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
14.06.2016, 08:53  [ТС]     Из NSURLConnection в NSURLSsesion #5
Запрос этот происходит в нажатии кнопки
NSLog выводится мгновенно после нажатия кнопки, а вот следующая строка для label выводит только через ~40 секунд, почему?
И еще в таком варианте не работает переход на другой экран, падает программа с ошибкой(скриншот)

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (IBAction)buttonConnect:(id)sender {
NSURL *url = [NSURL URLWithString:lineURLresult]; // URL
         NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession]
         dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
             id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
             if ([object isKindOfClass:[NSDictionary class]] && error == nil){
                 if([[object objectForKey:@"Success"] boolValue] == FALSE){
                     NSLog(@"NO");
                     _labelStatus.text = [object objectForKey:@"Message"];
                 }
                 else {
                     NSLog(@"True");
                     _labelStatus.text = @"YES";
                     // Переход на VievControllerTable
                     ViewControllerTable *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerTable"];
                     // Передача профиля и пароля
                     detail.lineNameProfile = lineNameProfile;
                     detail.linePassword = linePassword;
                     [self.navigationController pushViewController:detail animated:YES];
                 }
             }
         }];
        [downloadTask resume];
}
С вариантом Connection выше, таких проблем нет
Миниатюры
Из NSURLConnection в NSURLSsesion  
cin_cout
26 / 26 / 7
Регистрация: 06.10.2012
Сообщений: 119
14.06.2016, 17:20     Из NSURLConnection в NSURLSsesion #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
NSURLConnection: если вызвать sendAsyncronousRequest, эффект будет тот же, что и во втором случае.

NSURLSession по умолчанию async. Чтобы манипулировать с UI, надо принудительно в main queue вернуться.
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
15.06.2016, 07:16  [ТС]     Из NSURLConnection в NSURLSsesion #7
Objective-C
1
2
3
4
5
6
7
8
9
10
11
NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession]
                                          dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                              id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
                                              if ([object isKindOfClass:[NSDictionary class]] && error == nil){
                                                  dispatch_async(dispatch_get_main_queue(), ^{
                                                      // обновление UI
                                            
                                                      });
                                              }
                                          }];
    [downloadTask resume];
Нашел решение проблемы, для обновления UI нужно использовать
Objective-C
1
dispatch_async(dispatch_get_main_queue(), ^{}
В общем то об этом и пытались сказать выше)
Yandex
Объявления
15.06.2016, 07:16     Из NSURLConnection в NSURLSsesion
Ответ Создать тему
Опции темы

Текущее время: 03:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru