2013-09-27 2 views
1

Так что я загружаю некоторые данные с сервера на мой клиент ios. Данные должны быть отформатированы, поэтому я использую NSNotification для уведомления приложения, когда данные были полностью загружены, и когда это будет сделано, я отформатирую данные и затем покажу их на экране. Все это круто, но из-за размера данных экран зависает. Я думал, что должен использовать GCD, чтобы подтолкнуть загрузку данных к другому потоку, чтобы пользовательский интерфейс все еще реагировал. Когда я это сделал, я, похоже, не загружаю никаких данных. У меня есть метод getTops, который использует NSURLConnection для загрузки данных. Первоначально в моих viewDidLoad я назвал этот метод, и он работал нормально, но я использовал НОД как такНе удается получить данные с помощью NSURLConnection с GCD

dispatch_queue_t getItemsQ = dispatch_queue_create("get Items", NULL); 
dispatch_async(getItemsQ, ^{ 
    [self getTops]; 
}); 

И он перестал работать. Я знаю, что он попадает в getTops, потому что я могу видеть бревно в консоли, но он никогда не достигает -(void)connectionDidFinishLoading:(NSURLConnection *)connection

Вот код, я использовал:

-(void)getTops{ 
    Keychain *keychain = [[Keychain alloc]init]; 
    NSString *auth_token = [keychain getAuthToken]; 
    NSLog(@"at getTops"); 
    topimageArray = [[NSMutableArray alloc]init]; 
    NSURLConnection *connection; 

    webData = [[NSMutableData alloc]init]; 
    NSURL *url = [[NSURL alloc]initWithString:base]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init]; 
    [request setURL: url]; 
    [request setValue:auth_token forHTTPHeaderField:@"X-AUTH-TOKEN"]; 
    connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
    // [connection start]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    NSLog(@"at getTops conn start"); 
    } 
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    NSLog(@"recieved response"); 
    [webData setLength:0]; 
} 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    if(data) { 
     NSLog(@"Appending data"); 
     [webData appendData:data]; 
    } 
} 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    NSArray *response= [NSJSONSerialization JSONObjectWithData:webData options:0 error:nil]; 
    NSLog(@"Tops full response::: %@",response); 
    theArray = [[NSArray alloc]initWithArray:response]; 
    NSLog(@"DONE"); 
    //Notify that the data is ready to be formated 
    [[NSNotificationCenter defaultCenter]postNotificationName:@"getTops" object:nil]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    NSLog(@"error::::%@", error); 
    NSString *errormsg = error.localizedDescription; 
    UIAlertView *alertview = [[UIAlertView alloc]initWithTitle:@"Error" message:errormsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
    [alertview show]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

Я подумал, что я должен удалить [UIApplication sharedApplication].networkActivityIndicatorVisible но did not help

Редактировать :: Добавлено NSLogs для делегирования методов. Бревенчатый, что я получаю

at getTops conn start 

И это так.

+1

Вам не нужно называть 'start', что происходит автоматически. Можете ли вы добавить журналы ко всем методам делегатов, чтобы узнать, какой ответ вы получите? –

+0

не получает ответа – nupac

+0

И если вы запустите 'sendSynchronousRequest: returnResponse: error:'? –

ответ

3

Самый простой способ - использовать sendAsynchronousRequest: queue: completeHandler :. Никаких делегатов не требуется, просто введите код из connectionDidFinishLoading: в блок завершения.

Загружает данные для запроса URL-адреса и выполняет блок обработчика в рабочей очереди при завершении или сбое запроса.

[NSURLConnection sendAsynchronousRequest:request 
    queue:[NSOperationQueue mainQueue] 
    completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
     < your code > 
}]; 
+0

Работает как магия. благодаря – nupac

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