2

CUSTOM_VIEW CLASSE:correctement gérer la file d'attente d'expédition pour réduire le chauffage de téléphone iOS

J'ai fait custom_view classe qui calcule la valeur sur elle-même et montre à l'utilisateur après chaque 1 sec. Calcul des valeurs dans custom_view en fonction des propriétés/variables stockées dans l'instance custom_view.

viewController CLASSE:

J'afficher une 7 à 9 vue de la création en instance de custom_class en classe viewController.

Comme mon custom_class affiche une nouvelle valeur calculée toutes les 1 s, j'ai utilisé dispatch_async pour exécuter le code de calcul. Pour que cela n'affecte pas le thread UI.

custom_view.m

static dispatch_queue_t queue; 
    queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0); 

     dispatch_async(queue, ^(void) 
         { 
          [self calculateViewValue]; 
         }); 



-(void) calculateViewValue 
{ 
int wait = [self generateRandomNumberWithlowerBound:10 upperBound:20]; 

           for (int i = 0; i<= wait; i++) 
           { 
           // value calculation 

            [[NSOperationQueue mainQueue] addOperationWithBlock:^ 
            {custom_view_instance.text = value;}]; 

           sleep(1); 
           } 
} 

Cependant, après son exécution iPhone chauffe après un certain temps !! Suis-je faire quelque chose de mal/manquant/meilleure façon de le faire ???

Répondre

2

ne font pas de calcul dans les vues, les contrôleurs le font. de toute façon n'appelez pas dormir dans UIKit. une meilleure approche peut être: (code doit être dans un contrôleur .. ET il définit le texte dans les vues ...) si vous avez besoin de répéter les calculs, utilisez une minuterie.

Donc, commencer par un code similaire à:

uint64_t interval = 1; 
uint64_t leeway = 0; 

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); 
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, interval * NSEC_PER_SEC, leeway * NSEC_PER_SEC); 
dispatch_source_set_event_handler(timer, ^{ 

    // put code here... 
}); 
dispatch_resume(timer); 

certains avantages: 1) processus cpu inférieur 2) ne pas dormir 3) déjà async. 4) vous pouvez utiliser chaque "feu" de temps pour planifier un événement 5) utiliser un "count" var pour décider quand sop timer: dans ce cas, tuer timer en utilisant quelque chose de similaire à dispatch_cancel ... minuterie ")

+0

Salut @ingconti, merci pour la réponse :) Eh bien, comme vous l'avez mentionné, je suis d'accord avec votre que le calcul soit fait dans le contrôleur, Cependant les calculs sont faits valeur stockée dans ma classe custom_view. Par exemple. Considérons que custom_view représente PROPERTY [HOUSE/BUILDING] et value sur custom_view est RATE de la propriété. donc sa valeur est basée sur les propriétés/variables de custom_view. Par conséquent, je crée toujours une instance de custom_view et initialise chaque nouvelle custom_view avec la valeur. –

+0

Les vues ne doivent pas contenir de données ni effectuer de calculs. Les données doivent figurer dans le modèle et les calculs quelque part dans la couche de modèle ou de contrôle (en fonction des détails de mise en œuvre). – bbum

+0

ok @bbum, oui je préfère ne pas utiliser la vue pour le calcul/stockage des données que je fais faire cette fois-ci et apportera des changements comme vous l'avez souligné. Merci :) Im étant débutant, que dois-je référer/apprendre à éviter de faire une telle erreur que vous avez souligné et faire une mise en œuvre plus structurée à l'avenir. –