Является ли Asynchronous NSURLconnection в любом случае полезным для обновления в реальном времени или отправки постоянного запроса на сервер в приложении iOS? - PullRequest
0 голосов
/ 23 января 2012

Я очень плохо знаком с задачей 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' на сервере, он не может выполнить обновление в реальном времени, так как когда файл изменяется, он все еще регистрирует старые значения в файле.

Ответы [ 3 ]

2 голосов
/ 23 января 2012

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

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

1 голос
/ 23 января 2012

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

1 голос
/ 23 января 2012

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

...