2013-10-27 7 views
0

В моем проекте у меня есть следующие методы:методы называются перед другими закончены

-(NSArray*)getWindSpeed 
{ 
    [client setURL:@"windspeed"]; 
    NSLog(@"Wind speed asked"); 
    [client getData]; 
    return [self Parse]; 
} 

-(NSArray *)Parse 
{ 
    NSLog(@"parsing"); 
    return [parser parseJSONData:rawData]; 
} 

Когда getWindSpeed ​​называется, он первым изменяет URL в HTTPClient я сделал, а затем запрашивает данные. В методе getData клиента я делаю httprquest, и когда он получает данные, он хранит данные в массиве. Затем я хочу вернуть проанализированные данные. Однако метод Parse вызывается до того, как функция getData моего клиента завершена.

Таким образом, исходные данные, которые принимает парсер, всегда равны нулю.

Я предполагаю, что это происходит потому, что [сами Анализировать] вызываются до клиента

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

So..any советы о том, как я могу сделать это так [сам Анализировать] не не дозвонились до данных получено?

+0

Звонок getData является асинхронным, поэтому вызов [self parse] сразу после того, как он не будет работать, как вы сказали. Также, как вы намекали, вы должны реализовать метод делегирования didReceiveData, и вам нужно было проанализировать данные с сервера. –

+0

@hugo точно, но когда я анализирую данные в didReceiveData, тогда запрос будет вызван до разбора, чтобы проблема осталась. – Aelion

+0

Из-за характера синхронных запросов у вас не может быть метода с подписями '- (NSArray *) getWindspeed' вам нужно будет использовать что-то вроде' - (void) startWindSpeedRequest', а затем использовать делегирование или целевое действие, чтобы уведомить кого когда-либо пересекается в скорости ветра после того, как данные загружены с сервера. –

ответ

1

Вы не можете сделать это так, как хотите. Невозможно (или, по крайней мере, не имеет смысла) возвращаться синхронно от асинхронной операции/метода/функции.

Вы должны наследовать асинхронную, основанную на событиях модель, i. е. не пытайтесь вернуть анализируемые данные, вместо этого передайте номер вызывающего абонента в блок обратного вызова, который вы вызываете из метода делегата connection:didFinishLoading:.

Например:

- (void)requestWindSpeedWithBlock:(void(^)(NSArray *))callback 
{ 
    [client setURL:@"windspeed"]; 
    NSLog(@"Wind speed asked"); 
    [client loadData]; 

    dataAccumulator = [NSMutableData new]; 
    callbackBlock = callback; 
} 

- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data 
{ 
    [dataAccumulator appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)conn 
{ 
    NSArray *array = [parser parseData:dataAccumulator]; 
    callbackBlock(array); 
} 

отметить также измененные имена методов. Не присваивайте именам методов «get»,, что соглашение об именах подразумевает совершенно иное использование.

+0

Я использовал делегат на данный момент, но я обязательно проверю это позже :) Также спасибо за отзыв о имени! – Aelion

+0

@Aelion Добро пожаловать. –

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