2013-07-21 2 views
1

Я начинаю с RestKit (у меня есть опыт работы с iOS), и у меня возникают некоторые проблемы с тем, что NSArray не заполнен RKMappingResult. Он заполняется только в фактическом «блоке», но если я вызываю его для доступа в viewDidLoad(), он просто выводит нуль.Restkit - свойство NSArray всегда null

Не могли бы вы посоветовать или предоставить какие-либо советы/ссылки на статьи?

Большое спасибо!

Вот мой код -

-(void) loadData 
{ 

    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Venue class]]; 
    [mapping addAttributeMappingsFromDictionary:@{ 
    @"name": @"name", @"location.address" : @"address", @"location.city" : @"city"}]; 

    NSString *urlString = [NSString stringWithFormat:@"https://api.foursquare.com/v2/venues/search?ll=55.903324,-3.171383&categoryId=4bf58dd8d48988d18f941735&client_id=%s&client_secret=%s&v=20130717", kCLIENTID, kCLIENTSECRET]; 
    NSURL *baseUrl = [NSURL URLWithString:urlString]; 

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodAny pathPattern:nil keyPath:@"response.venues" statusCodes:nil]; 

    NSURLRequest *request = [NSURLRequest requestWithURL:baseUrl]; 

    RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; 

    [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) { 
     //set the array of venues to be the result of what we got back 
     //NSLog(@"%@", [result array]); 

     NSArray *venues = [result array]; 
     self.arrayOfVenues = venues; //self.arrayOfVenues is always null when I call it in the other methods 
    } failure:nil]; 
    [operation start]; 
} 


- (void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:YES]; 
    NSLog(@"%@", self.arrayOfVenues); 

} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //load the venue data 
    self.title = @"Venues"; 
    [self loadData]; 
    NSLog(@"%@", self.arrayOfVenues); 
} 

ответ

0

Попробуйте self.arrayOfVenues = [venues copy];

Я думаю, что вы можете потерять ссылку на «места», когда вы выходите из блока и переменные уходят.

также:

Он только заполнит себя в действительном «блок», но если я позвоню, чтобы получить доступ к его в viewDidLoad(), он просто печатает нуль.

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

+0

Не уверен, что вы делаете с данными, но если он находится в таблице или что-то еще, просто поместите '[self.tableView reloadData]' в завершение после набора массива. – Stakenborg

+0

Вы, сэр, гений! Вы правы, я использую его в таблице, и мне нужно перезагрузить Data после блока! Спасибо Stakenborg !!! – user2604478

+0

Копирование массива не требуется. Это должно быть просто 'reloadData', которое отсутствовало. – Wain

0

вы должны Alloc & инициализации массива. как этот

NSArray *venues =[[NSArray alloc]init]; 
venus=[result array]; 
+0

Привет, спасибо, что ответили. Однако это не решило мою проблему. Массив мест назначения устанавливается, но «self.arrayOfVenues» не устанавливается вне этого метода. Если я NSLog self.arrayOfVenues внутри метода loadData, он распечатывается просто отлично. Он не печатает в viewDidLoad или viewDidAppear. Спасибо! – user2604478

+0

Инициализация массива и сохранение ссылки на него ('venues'), а затем установка этой ссылки на что-то другое приводит к тому, что только что созданный массив будет уничтожен. Он ничего не решает и тратит ресурсы системы. И если вы не используете ARC, это также утечка ... – Wain

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