2015-04-24 1 views
0

J'ai un UIView avec une backgroundcolor.comment invalider un UIView dans un Asynctask (swift, ios)

@IBOutlet var timelineview: Timelineview!

Maintenant, je voudrais le changement de la couleur de fond de la UIView avec un AsyncTask qui devrait changer la backgroundcolor du UIView chaque seconde.

dispatch_async(dispatch_get_main_queue()) { 
     for var i=10;i<100;i++ { 
      println(i); 
      var iRed:CGFloat=CGFloat(i)/CGFloat(10.0); 
      var backgroundColor:UIColor=UIColor(red: iRed, green: iRed, blue: iRed, alpha: 0.5); 
      self.timelineview.backgroundColor = backgroundColor; 
      sleep(1); 
     } 
    } 

Ceci est seulement un exemple pour comprendre comment appeler une modification de l'interface graphique d'une tâche en arrière-plan. Dans Android, cela est fait avec les gestionnaires, qui mettent à jour l'interface graphique. Je ne connais pas le concept d'IOS en ce sens.

Une aide?

+0

Vous pourriez utiliser 'NSTimer' au lieu de' dispatch_async'/'sleep' pour cela. – jszumski

Répondre

0

Ce que vous cherchez en fait pour n'est pas une file d'attente d'envoi, plutôt une minuterie qui peut être créé en utilisant la méthode dispatch_source_create de GCD, comme suit:

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main-queue()); 

//start timer 
if (timer) { 
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, interval * NSEC_PER_SEC, 0.0 * NSEC_PER_SEC); 
    dispatch_source_set_event_handler(timer, ^{ 
     // set background color or any other UI code here 
    }); 
    dispatch_resume(timer); 
} 

interval est l'intervalle en secondes dans lequel la minuterie doit tirer (1,0 pour vous) pour arrêter l'utilisation de la minuterie:

dispatch_source_cancel(timer); 
timer = NULL; 

Je suis désolé, que je suis un bon vieux objectif C gars et pas très familier avec Swift. Mais vous pourriez avoir le concept.

+0

Merci beaucoup pour votre explication. C'est prometteur. Je vais vérifier. Aussi la réponse de Ian MacDonald est bonne et j'ai déjà vérifié. Donc, je ne suis pas sûr de savoir qui accepter la réponse pour le moment :-) –

+0

@ user1344545 Je peux comprendre le dilemme. Mais je devrais vous recommander au moins une chose comme Ian McDonald a mentionné à un moment donné de sa réponse, évitez d'appeler 'sleep' dans votre code sauf si vous n'avez aucun autre moyen d'effectuer la même fonctionnalité. Pour votre besoin, une minuterie est une solution plutôt optimale.Vous pouvez également utiliser 'NSTimer' si vous trouvez cela plus convaincant. –

1

À moins que vous n'ayez ignoré le comportement de votre vue, la définition du backgroundColor indique également la vue dont il a besoin pour s'afficher à nouveau. Si vous trouvez que cela ne fonctionne pas (il se doit), vous pouvez dire explicitement en vue de réafficher en utilisant

self.timelineview.setNeedsDisplay() 

Side note: Vous ne devriez jamais appel sleep dans la file d'attente principale.


Il semblerait que vous souhaitiez que sa couleur soit continuellement mise à jour toutes les secondes. Cette boucle ne devrait pas exister dans la file d'attente principale; le contenu peut cependant exister dessus. Au lieu de cela, envisager quelque chose comme:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
    for var i=10;i<100;i++ { 
    println(i); 
    var iRed:CGFloat=CGFloat(i)/CGFloat(10.0); 
    var backgroundColor:UIColor=UIColor(red: iRed, green: iRed, blue: iRed, alpha: 0.5); 
    dispatch_async(dispatch_get_main_queue())) { 
     self.timelineview.backgroundColor = backgroundColor; 
    } 
    sleep(1); 
    } 
} 

Il est toujours pas une bonne idée de faire la queue ce bloc entier à la fois (même si vous êtes en file d'attente dans la file d'arrière-plan). Vous devriez le faire avec une minuterie répétitive ou un lien d'affichage.

+0

Merci beaucoup! Thats helpfull .. J'ai testé et cela a très bien fonctionné. Ce n'est pas un bon design comme vous l'avez fait, et je vais aussi vérifier la réponse d'Ayan. Donc, je ne suis pas sûr de savoir qui accepter la réponse pour le moment :-) –

+0

Upvoted, car il répond à ma question, mais la réponse d'ayans correspond un peu mieux. Merci beaucoup pour votre aide. –

0
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
    //Background Thread 
    dispatch_async(dispatch_get_main_queue(), ^(void){ 
     //Run UI Updates/Main Queue 

    }); 
});