Установка времени ожидания для метода делегата в цели c - PullRequest
1 голос
/ 03 августа 2011

Мне нужно установить для объекта NSTimer время ожидания вызова сервера вручную, если это занимает более 10 секунд (не поддерживается в Restkit)

Это мой код ниже. По сути, мой класс загрузчика будет делегировать запрос с помощью loadObjectsAtResourcePath

Если это займет более 10 секунд, я хотел бы вызвать тот же метод сбоя, который Restkit вызывает при обнаружении ошибки на сервере (didFailWithError)

Но я чувствую, что я делаю это неправильно, и, кроме того, метод сбоя требует объекта, который только инициализируется в классе делегата.

//CLASS FOR LOADING OBJECTS

-(void)getObjects{
    RKObjectManager *sharedManager = [RKObjectManager sharedManager];

    // loads the object via delegate
    [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];

    //creates an error
    NSError *error = [NSError errorWithDomain:@"world" code:200 userInfo:nil];

    // Setting timeout here. goto failure 
    nTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self.delegate selector:@selector:(objectLoader:nil didFailWithError:error:) userInfo:nil repeats:NO];
}


// handles failure
- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {
..
}

// handles success
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
..
}

Как правильно это сделать?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Было бы лучше обработать время ожидания в методе, отличном от обратного вызова делегата.Как вы говорите, метод делегата требует объектов, которые создаются внутри класса.И вы, вероятно, не хотите обрабатывать «настоящую ошибку» и время ожидания точно так же, верно?Например, при тайм-ауте вы можете захотеть повторить попытку.

Если вы действительно хотите, чтобы тайм-аут и сбой с ошибкой сделали то же самое, вы можете использовать для этого другой метод:1003 *

-(void)getObjects{
    RKObjectManager *sharedManager = [RKObjectManager sharedManager];

    // loads the object via delegate
    [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];

    //creates an error
    NSError *error = [NSError errorWithDomain:@"world" code:200 userInfo:nil];

    // Setting timeout here. goto failure 
    nTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(didTimeout) userInfo:nil repeats:NO];
}


- (void)didTimeout {
    NSLog(@"Error");
}

// handles failure
- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {
    [self didTimeout];
}

// handles success
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
    //don't forget to invalidate the time or else you'll get errors even when successful
    [nTimer invalidate];
}

Конечно, вы можете расширить это, чтобы сделать его более гибким, если это необходимо, но это, кажется, охватывает то, что вы спросили.

1 голос
/ 03 августа 2011

Не знаком с RestKit, но первое, о чем я думаю, это то, что было бы гораздо лучше настроить запланированный селектор на вызов метода проверки, а не на метод с ошибкой, проверьте метод проверки, чтобы убедиться, что действительный ответ имеет был получен в течение определенного времени, и если он не получен, отмените запрос и т. д. и вызовите ошибку.

Хотя я не знаком с RestKit, я знаком с использованием NSURLRequests и знаю, что можно определить время ожидания при выдаче запроса на создание ошибки времени ожидания - не знаю, помогает ли это ...

...