Так что я загружаю некоторые данные с сервера на мой клиент 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
И это так.
Вам не нужно называть 'start', что происходит автоматически. Можете ли вы добавить журналы ко всем методам делегатов, чтобы узнать, какой ответ вы получите? –
не получает ответа – nupac
И если вы запустите 'sendSynchronousRequest: returnResponse: error:'? –