2016-01-04 5 views
0

Функции в JSONDownload.mNSURLConnection не скачивая

-(void)downloadEntries{ 
    NSString *urlString = @"https://itunes.apple.com/in/rss/topmovies/limit=50/genre=4431/json"; 
    NSURL *url = [NSURL URLWithString:urlString]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    [self.webData setLength:0]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(nonnull NSData *)data{ 
    [self.webData appendData:data]; 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    NSError *error; 
    self.dictionary = [NSJSONSerialization JSONObjectWithData:self.webData options:0 error:&error]; 
    NSLog(@"%@", [error localizedDescription]); 
} 

-(NSString *)returnName: (NSInteger)index{ 
    NSArray *entry = [self entryArray]; 
    NSDictionary *indexDictionary = [entry objectAtIndex:index]; 
    NSDictionary *nameDictionary = [indexDictionary objectForKey:@"im:name"]; 
    NSString *nameOfMovie = [nameDictionary objectForKey:@"label"]; 
    return nameOfMovie; 
} 

-(NSInteger)numberOfEntries{ 
    NSDictionary *feed = [self dictionary]; 
    NSArray *entry = [feed objectForKey:@"entry"]; 
    return [entry count]; 
} 

который вызывается другим классом FeedEntry.m

- (void)recieveEntries{ 
    JSONDownload *download = [JSONDownload sharedInstance]; 
    [download downloadEntries]; // calling method 

    NSInteger numberOfEntries = [download numberOfEntries]; //calling method 

    for (int index = 0; index < numberOfEntries; index++) { 

     self.name = [download returnName:index]; //calling method 
     NSLog(@"%@",self.name); 
    } 
} 

Однако по отслеживанию я обнаружил, что connectionDidFinishLoading: не вызывается и, следовательно, словарь Свойство в этом fucntion не инициализируется. Таким образом, я получаю numberOfEntries как 0, и цикл не выполняется. То, что должно быть сделано?

+0

Вы реализовали другие (необходимые) методы делегирования 'didReceiveResponse' и' didReceiveData'? В любом случае вызов 'numberOfEntries' после' downloadEntries' всегда будет возвращать 0 из-за асинхронного поведения соединения. – vadian

+0

@vadian yes У меня есть – Rishab

+0

Вам нужен обработчик завершения или метод делегата, который вызывается в методе 'connectionDidFinishLoading', чтобы сообщить' FeedEntry', что данные доступны. – vadian

ответ

1

Вам нужен обработчик завершения, потому что NSURLConnection работает асинхронно.

в FeedEntry.h определить тип блока и completion свойство

typedef void (^ConnectionCompletion)(NSDictionary *data, NSError *error); 

@property (nonatomic, copy) ConnectionCompletion completion; 

В FeedEntry.m изменения downloadEntries к

- (void)downloadEntriesWithCompletion:(ConnectionCompletion)completion{ 
    self.completion = completion; 
    NSString *urlString = @"https://itunes.apple.com/in/rss/topmovies/limit=50/genre=4431/json"; 
    NSURL *url = [NSURL URLWithString:urlString]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; 
} 

и изменить connectionDidFinishLoading к

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    NSError *error; 
    self.dictionary = [NSJSONSerialization JSONObjectWithData:self.webData options:0 error:&error]; 
    self.completion(self.dictionary, error); 
} 

Обработчик завершения возвращает Dictio а также потенциальную ошибку сериализации.

Теперь вызовите метод с

JSONDownload *download = [JSONDownload sharedInstance]; 
[download downloadEntriesWithCompletion:^(NSDictionary *data, NSError *error) { 
    if (error) { 
     NSLog(@"%@", error); 
    } else { 
     NSInteger numberOfEntries = [download numberOfEntries]; //calling method 
     for (int index = 0; index < numberOfEntries; index++) { 
     self.name = [download returnName:index]; //calling method 
     NSLog(@"%@",self.artist); 
     } 
    } 
}]; 

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

Вы также должны реализовать connectionDidFailWithError и вызвать обработчик завершения также там, чтобы вернуть nil и ошибку.

+0

Я просто понял, что мне нужно много узнать о блоках. Спасибо за код. Кажется, он работает сейчас. Однако 'didReceiveData:' показывает пару ключей/значений 0 и в 'connectionDidFinishLoading:' его бросает исключение, говорящее, что параметр data равен nil'. Я проверил синтаксис, но все, кажется, в правильном порядке. – Rishab

+0

- это 'webData', инициализированный как' [NSMutabledata data] '? – vadian

+0

о, ну ... да, его уже нет. – Rishab

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