Полезно ли асинхронное соединение NSURL для обновления в реальном времени или отправки постоянного запроса на сервер в приложении iOS?

Я очень новичок в задаче C. У меня есть случай, когда мне нужно через равные промежутки времени отправлять запрос на URL-адрес сервера. Я создал асинхронное URL-соединение и использовал функцию NSTimer для вызова функции viewWillAppear.

 - (void)viewWillAppear:(BOOL)animated
  {
       [super viewWillAppear:animated];
       NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL    URLWithString:@"myurl/test.csv"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];

       NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request delegate:self];

       if(connection){
          label.text = @"connecting...";
        }else{
         //
        }


    }

 -(void)connection :(NSURLConnection *) connection didReceiveData:(NSData *)data{
     [self viewWillAppear:TRUE];
      response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
      NSLog(response);
      }

Я использовал следующий метод NSTimer для вызова метода viewWillAppear.

- (void)checkURLRequest
    {
     [self setProgressTimer:[NSTimer
                        scheduledTimerWithTimeInterval:(1.0f / 30.0f) 
                        target:self 
                        selector:@selector(viewWillAppear:) 
                        userInfo:self 
                        repeats:TRUE]];
    }

   - (void)setProgressTimer:(NSTimer *)theTimer
    {
    [_progressTimer invalidate];
     _progressTimer = theTimer;
    }

Мой подход вообще правильный? Потому что, когда я обновил файл «test.csv» на сервере, он не может выполнять обновление в реальном времени, так как и когда файл изменяется, он все еще регистрирует старые значения в файле.


person Siddharthan Asokan    schedule 23.01.2012    source источник


Ответы (3)


Я бы переместил все материалы для подключения URL-адресов за пределы VC и в собственный класс, который делает это с помощью блоков. Это позволит вам использовать это в других классах и лучше программировать OO. Я могу отправить вам пример, который я использую с загрузкой изображения, если вам это нужно.

person LJ Wilson    schedule 23.01.2012
comment
[email protected] Большое спасибо за помощь! - person Siddharthan Asokan; 24.01.2012

Вы не должны вызывать viewWillAppear: самостоятельно, тем более, что он должен вызывать [super viewWillAppear:], который делает вещи, о которых вы не знаете. Я могу сказать вам по опыту, что вызов этих методов контроллера представления может привести к странным ошибкам, которые очень трудно отлаживать.

Поэтому переместите свой код обработки URL-соединения в отдельный метод, который вы вызываете с помощью своего таймера и который вы также можете вызывать в своем viewWillAppear:, если вам нужно.

person DarkDust    schedule 23.01.2012
comment
Это зависит от обстоятельств, но обычно вы хотите, чтобы делегат приложения был вне, иначе он станет одним огромным классом, который делает все. Обычно вы хотите, чтобы все было вместе. - person DarkDust; 23.01.2012

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

person Oscar Gomez    schedule 23.01.2012