'NSInternalInconsistencyException', la raison: "Seuls les exécuter sur le thread principal!" erreur
Donc je connaître la raison de cette erreur, mais je ne suis pas vraiment sûr de savoir comment les contourner.
J'ai un TextField
que je veux pas être modifiable, mais avec le défilement est activé à l'intérieur d'un point de vue.
C'est comment j'ai configuré ce point de vue:
- (void)tableView:(UITableView *) tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSDictionary *component = self.resultsTuples[indexPath.row];
NSString* serverUrl = @"http://staging.toovia.com";
NSString* pageLink = component[@"$element"][@"ContactCard"][@"PageLink"];
NSString* recUrl =[NSString stringWithFormat:@"%@%@&format=json&fields=summary&fields=session_info", serverUrl,pageLink];
[AJAXUtils getAsyncJsonWithUrl:(NSURL *)[NSURL URLWithString:recUrl] callback:^(NSDictionary *returnjson){
if (returnjson != nil){
NSLog(@"RETURN JSON : %@", returnjson);
NSString *userPageLink = returnjson[@"Node"][@"SessionInfo"][@"PostingAs"][@"Key"];
self.detailController.userPageLink = userPageLink;
self.detailController.nodePage = returnjson[@"Node"][@"Key"];
NSString *selectedCard = component[@"$element"][@"Title"];
// [self.detailController setDescription:component[@"element"][@"ContactCard"][@"Description"]];
[self.detailController setPageTitle:selectedCard];
NSString* photoUrl = component[@"$element"][@"ContactCard"][@"Cover"][@"Medium"][@"Link"];
[self.detailController setRestaurantImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:photoUrl]]]];
self.detailController.title = selectedCard;
NSString* rating = component[@"$element"][@"Summary"][@"AverageRating"];
self.detailController.rating =(NSInteger)rating;
[self.navigationController pushViewController:self.detailController animated:YES];
}
}];
C'est le viewWillAppear
code pour l'afficher:
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear: animated];
self.rateView.notSelectedStar =[UIImage imageNamed:@"star-off.png"];
self.rateView.fullSelectedStar = [UIImage imageNamed:@"star-on.png"];
self.rateView.rating = self.rating;
self.rateView.editable = YES;
self.rateView.maxRating = 5;
self.rateView.delegate = self;
_pageTitleLabel.text = _pageTitle;
_pageScoreLabel.text = _pageScore;
_trendingImageView.image = [UIImage imageNamed:@"trending.png"];
_restaurantImageView.image = _restaurantImage;
}
L'erreur totale est -
2013-12-16 01:22:50.362 ReviewApp[7332:441f] *** Assertion failure in void _UIPerformResizeOfTextViewForTextContainer(NSLayoutManager *, UIView<NSTextContainerView> *, NSTextContainer *, NSUInteger)(), /SourceCache/UIFoundation_Sim/UIFoundation-258.1/UIFoundation/TextSystem/NSLayoutManager_Private.m:1510
2013-12-16 01:22:50.365 ReviewApp[7332:441f] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Only run on the main thread!'
Donc je suppose que ce qui se passe parce que le redimensionnement du champ de texte (lorsque le contenu est fixé) a arriver sur le thread principal. Comment puis-je la force à ce que cela arrive/supprimer cette erreur? Je ne suis pas dans le contrôle du champ de texte redimensionnement suis-je?
Grâce
- Sans doute dans le rappel bloc pour
getAsyncJsonWithUrl
? - Je ne suis pas familier avec
getAsyncJsonWithUrl
mais, par le nom, je suppose que c'est sur un thread d'arrière-plan. Recherchez les docs sur l'exécution d'un sélecteur sur le thread principal ou l'envoi d'un bloc à la file d'attente principale.
Vous devez vous connecter pour publier un commentaire.
Je devine que le rappel de
AJAXUtils
qui se passe sur un thread d'arrière-plan. Je ne sais pas si c'est votre code ou non, mais ce que vous devez faire toutes les opérations de l'INTERFACE utilisateur (comme la mise en texte dans un label, réglage d'une image dans une image vue, poussant un view controller) sur le thread principal.Swift version 3.0
Vous devez toujours effectuer code de l'INTERFACE utilisateur sur le thread principal. Vous n'êtes pas, d'où l'erreur. Essayez ceci:
Cela garantit l'affichage de la vue-contrôleur est sur le thread principal. Vous pouvez réellement besoin de mettre un peu plus de code à l'intérieur de l'appel à
dispatch_async
.Swift version
Aussi, ce n'est pas une très bonne façon de faire les choses dans didSelectRow. Vous devriez avoir une couche réseau, séparer le code du réseau de la vue des contrôleurs sinon vous allez vous retrouver avec d'énormes vue-contrôleur, le code ne sera pas testable.