Я начал программировать на Objective-C пару недель назад, поэтому мое понимание того, как все эти части сочетаются друг с другом, и порядок, в котором они все происходят, все еще сбивает меня с толку. Я пытаюсь сделать вызов API JSON для одного из моих приложений, используя NSURLSession. Все это работает безупречно, но я хочу обновить метку частью возвращаемых данных, и каждый раз, когда я смотрю/пытаюсь обновить метку, я получаю нулевое значение.
Некоторые из сообщений SO, которые я обнаружил, похожие на мою проблему, включают: >это, это, это и это. Приходя из мира Ruby on Rails, мне вообще не приходилось иметь дело с асинхронными концепциями, но я знаю, что близок к этому.
Вот соответствующий фрагмент рассматриваемого кода:
if (!jsonError) {
NSDictionary *skillBuildData = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@:", skillBuildNameLabel.text); // should say "Build Name" but returns null
NSLog(@"%@", skillBuildData[@"name"]); // correctly prints the result
NSLog(@"%@:", skillBuildNameLabel.text); // should have contents of skillBuildData[@"name"] but returns null
skillBuildNameLabel.text = skillBuildData[@"name"]; // obviously results in null, but I don't know why.
});
}
ИЗМЕНИТЬ:
Не уверен, что это актуально, но вот основная часть моего ViewController.h
, чтобы дать вам представление о торговых точках и действиях в этом очень простом приложении. Одна кнопка, один метод, IBOutlet
, связывающий кнопку и метод вызова JSON, и метка:
@interface ViewController : UIViewController {
IBOutlet UILabel *skillBuildNameLabel;
IBOutlet UIButton *getSkillBuildDataButton;
}
- (void)getSkillBuildDataById:(int) skillBuildId;
- (IBAction)buttonPressed;
Кажется, я очень близко, я просто не вижу ссылку, которую мне не хватает. Огромное спасибо заранее!
РЕДАКТИРОВАТЬ 2:
Посмотрите комментарий Бена Кригера к ответу, который я пометил как ответ. Я не связал фактическую метку в своей раскадровке с выходом, который я создал в своем ViewController.h
. Я понятия не имел, что можно перетащить строку из элемента в раскадровке в настоящую строку кода. Это была недостающая часть. Похоже, мне еще многое предстоит узнать о Xcode и Objective-C. Спасибо всем, кто мне помог!
ViewController.m
? Что происходит, когда выNSLog(@"%@", skillBuildNameLabel);
? Вы делаете хорошее дело, заходя в основной поток, чтобы внести эти изменения, но я все еще не могу получить достаточно четкого представления о том, что происходит в этом первом фрагменте. - person Ben Kreeger   schedule 06.01.2014completionHandler
(обратном вызове?) метода, который изначально вызывает вызов API. Я просто не уверен, почему код не может говорить с меткой. - person Kyle Carlson   schedule 06.01.2014NSLog(@"%@", skillBuildNameLabel);
внутри обратного вызова? - person Ben Kreeger   schedule 06.01.2014