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:
- Créer un indicateur
- Afficher l'indicateur
- bloc d'exécution de code
- bloc Run succès
- Cacher indicateur
- Retirer du superview
- 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];
});
});
}
votre variable 'success' devrait être déclarée dans le premier bloc, comme une variable normale (pas' __block') – newacct