2015-03-17 3 views
0

У меня есть NSURLSession, который выглядит так, и что я хочу сделать, это если данные не возвращаются, то я хочу, чтобы он повторил попытку снова и снова, до тех пор, пока не скажем 8 секунд или 3 попытки, а затем если по-прежнему ничего не будет, я верну ему никаких данных. Вот что у меня есть сейчас:Отправить несколько NSURLSession

NSURLSession *session = [NSURLSession sharedSession]; 
[[session dataTaskWithURL:[NSURL URLWithString:urlIn] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
// handle response 
    //use my data 
    // if no data I want to try again? 


}] resume]; 

Так что я хочу, чтобы он попробовал 3 раза или до 8 секунд. Как я мог это сделать,

Спасибо за помощь заранее.

+0

Просто создайте свойства, чтобы отслеживать количество попыток и время первой попытки. Затем в счетчике попыток приращения блока завершения и проверьте, прошло ли время, прошедшее менее 8 секунд, и количество попыток было меньше 3, и если да, вызовите метод, который выполнил этот запрос еще раз. Вы действительно должны попробовать это сами. Не было намека на преступление, но мы здесь, чтобы помочь вам с вашим кодом, а не писать его для вас. – Rob

+0

@Rob Кажется, что он может быстро загромождать. Вы знаете о более чистом способе сделать это? – MendyK

+0

@MendyK - Если вы делаете это много, оберните его в асинхронный подкласс NSOperation, чтобы у вас был хороший инкапсулированный подход. Или на самом деле посмотрите на _why_, и он обработал его соответствующим образом (т. Е. Если сеть не читается, не пытайтесь повторить попытку, пока Reachability не сообщит вам, что сеть вернулась). Но они немного сложнее, и ОП, судя по всему, ничего не пытался, поэтому я не решаюсь идти туда, пока он не рассмотрит самые рудиментарные подходы. – Rob

ответ

1

Хорошо, поэтому я почти там, у меня есть немного больше, чтобы работать с таймером. Вот что у меня есть.

Я получил свойство

NSInteger attemptInt; 
NSInteger _counter; 
NSDate *date = [NSDate date]; 

А затем эти два метода для моего таймера

- (void)startCountdown 
{ 
    _counter = 8; 

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 
                 target:self 
                selector:@selector(countdownTimer:) 
                userInfo:nil 
                repeats:YES]; 
} 

- (void)countdownTimer:(NSTimer *)timer 
{ 
    _counter--; 
    if (_counter <= 0) { 
     [timer invalidate]; 
     NSLog(@"8 sec passed"); 
    } 
} 

А потом вот где я получаю мои данные.

- (void)getMenuItems:(NSString*)urlIn{ 
    NSURLSession *session = [NSURLSession sharedSession]; 
    [[session dataTaskWithURL:[NSURL URLWithString:urlIn] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    //One problem I am facing is I have to call timer for main thread 
    if ([date timeIntervalSinceNow] <= 8 && [response expectedContentLength] == 0) { 
     attemptInt++; 
     [self getMenuItems:url]; 
    } 
    if (attemptInt >= 3) { 
     NSLog(@"NO DATA"); 
    } 
    else if ([response expectedContentLength] == 0) { 
     NSLog(@"TRY AGAIN"); 
     attemptInt++; 
     [self getMenuItems:url]; 
    } 
    else { 
     //GOT MY DATA :) 
     self.mealdata=[[MealData alloc]init:data]; 
    } 

Таким образом я получил попытки разработал я таймер настройки я просто нужна помощь заканчивал, чтобы проверить, является ли прошло первое 8 секунд?

+0

Отличный первый удар. Лично, вместо того, чтобы использовать таймер, я бы просто взял дату [NSDate date] 'времени начала, а затем, когда я захочу проверить количество пройденного времени, я бы сделал' [startDate timeIntervalSinceNow] '(это будет отрицательное значение, но количество прошедших секунд). Или вы можете захватить 'CFAbsoluteTimeGetCurrent()' времени начала, а затем получить разницу между более поздним 'CFAbsoluteTimeGetCurrent()' и исходным значением. Оба этих подхода вообще не требуют таймеров и быстро вычисляют количество секунд между двумя точками времени. – Rob

+0

@Rob okay Я добавил дату, а затем попытался проверить, меньше ли значение 'timeIntervalSinceNow', но это не сработало? См. Дополнение – iqueqiorio

+1

Да, '[datetimeIntervalSinceNow]' будет отрицательным, поскольку документы говорят: «Если объект даты раньше текущей даты и времени, значение этого свойства отрицательное». Таким образом, переверните знак, например. '(- [date timeIntervalSinceNow]) <= 8'. И если это не совсем то, что вы ожидаете, вставьте утверждения 'NSLog', показывая прошедшее время и' tryInt', и вы быстро диагностируете, что именно происходит. (Кстати, вы можете убрать все вещи «NSTimer».) – Rob

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