0

J'ai créé un indicateur personnalisé dans lequel je peux exécuter du code dans un bloc et afficher un indicateur pendant que le code est en cours d'exécution. Une fois le code terminé, j'appelle un deuxième bloc de succès et cache/enlève l'indicateur. Comme je ne veux pas instancier tous les indicateurs de la classe où je veux les utiliser, l'objet indicateur est un singleton.Occurrence partagée de verrou d'indicateur personnalisé Objective-c

Flux de travail:

  1. Créer un indicateur
  2. Afficher l'indicateur
  3. bloc d'exécution de code
  4. bloc Run succès
  5. Cacher indicateur
  6. Retirer du superview
  7. Nullify partagé dans position

Le problème se produit lorsque j'utilise deux indicateurs après l'autre (exemple: après la connexion, actualiser les données).

Lorsque le second indicateur est affiché, la méthode hide est appelée sur la première instance. Et pendant le second indicateur, la vue de l'indicateur est supprimée de la vue d'ensemble.

Je n'ai aucune expérience avec la gestion de mes propres verrous de fil mais j'ai pensé résoudre le problème en utilisant @synchronized(self) mais il semble qu'il n'a aucun effet?

+ (Indicator *)create 
{ 
    if (!sharedIndicator) 
    { 
     sharedIndicator = [[Indicator alloc] initWithNibName:@"Indicator" bundle:nil]; 
    } 

    return sharedIndicator; 
} 

+ (Indicator *)createWithDelegate:(id <IndicatorDelegate>)delegate 
          message:(NSString *)message 
           inView:(UIView *)parentView 
{ 
    Indicator *indicator = [Indicator create]; 
    [indicator setDelegate:delegate]; 
    [indicator setMessage:message]; 
    [indicator setParentView:parentView]; 

    return indicator; 
} 

+ (void)showInView:(UIView *)view 
     withMessage:(NSString *)message 
      execute:(BOOL (^)(void))executeBlock 
      complete:(void (^)(BOOL success))completed 
{ 
    Indicator *indicator = [Indicator createWithDelegate:nil message:message inView:view]; 

    [indicator show]; 

    __block BOOL success = NO; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^
    {  
     success = executeBlock(); 

     dispatch_async(dispatch_get_main_queue(),^
     { 
      completed(success); 

      [indicator hide]; 
     }); 
    }); 
} 
+0

votre variable 'success' devrait être déclarée dans le premier bloc, comme une variable normale (pas' __block') – newacct

Répondre

0

Chaque fois que vous affichez l'indicateur, vous obtenez la même vue, puisqu'elle est liée à l'instance sharedInstance.