2011-01-24 1 views
1

Dans la méthode viewDidLoad() du contrôleur de vue J'appelleNSThread pour UITableView

[NSThread detachNewThreadSelector:@selector(readFromFaceBook) 
         toTarget:self 
         withObject:nil]; 

readFromFaceBook va extraire les données de distance et renseigne les données NSMutabaleArray appelées « myData ». Le contrôleur de vue contient un tableView qui charge les données de myData. Le problème que j'ai, c'est comment retarder l'exécution des délégués tableView jusqu'à ce que toutes les données soient chargées dans "myData" par le thread .. ?? Le programme plante lorsque les fonctions déléguées tentent d'exécuter myData. Toute aide est grandement appréciée...!!!!

Répondre

1

Vous devez créer la tableview et l'afficher immédiatement, afin que l'utilisateur ne pense pas que votre application est non-fonctionnelle. Peut-être un UIProgressIndicator ou quelque chose pour montrer que vous faites quelque chose?

Votre thread d'arrière-plan devrait effectuer le chargement, comme vous l'avez correctement choisi. Lorsque cela est fait, rappelez le thread principal via quelque chose comme performSelectorOnMainThread:... ou dispatch_async() au dispatch_get_main_queue(), et appelez [myTableView reloadData] pour actualiser l'interface utilisateur. Pour éviter le chargement prématuré de la vue de table, plusieurs approches peuvent être envisagées. Vraisemblablement, vous stockez vos données dans un tableau, puisqu'un UITableView affiche les données commandées. Si c'est le cas, ne remplissez pas le tableau jusqu'à ce que le thread se termine. Si cela ne fonctionne pas, vous pouvez simplement avoir un BOOL ivar que vous utilisez pour indiquer si vous avez terminé le chargement, puis utilisez l'état du BOOL pour déterminer ce que vous devriez montrer dans votre .

+0

Fonctionne bien .. merci Guys pour des réponses instantanées .... !!! – bp581

1

Deux choses que vous pouvez faire: soit instancier votre tableViewaprès que vous obtenez les données ou appelez [tableView reloadData] après que vous obtenez un rappel en disant que vos données se fait le chargement.

+0

..après vous obtenez un rappel en disant que vos données se fait le chargement .. » peut me montrer un exemple de code pour accomplir Aussi, comment puis-je initier tableView après avoir obtenu les données ... – bp581

0

Votre thread secondaire ne doit pas gérer le travail de l'interface utilisateur.

Une fois que vous recevez un rappel lorsque le téléchargement est terminé et que les données sont dans la collection "myData" --- appelez une fonction dans le contexte du thread principal, disons que vous appelez UpdateTable :.

Utilisation suivant API pour ce faire

[self performSelectorOnMainThread:@selectore(UpdateTable:) withObject:<#(id)arg#> waitUntilDone:<#(BOOL)wait#> 

DANS le UpdateTable

- (void)UpdateTable:(id)inData 
{ 
    [<view object> reloadData]; 
}