2010-10-27 5 views
1

J'essaie d'obtenir la valeur booléenne retournée par -(BOOL)backupDropletUpdateAvailable via NSThread.NSThread - get bool value

Pour ce faire, je l'ai essayé ce qui suit:

`BOOL isAvailable = NO;

[NSThread detachNewThreadSelector:@selector(backupDropletUpdateAvailable) toTarget:isAvailable withObject:nil]; 

if (isAvailable == YES) 
{//etc 

qui retourne un avertissement depuis BOOL est un entier et toTarget: est un pointeur. Mais comment puis-je obtenir la valeur? Si je ne le fais pas sur un thread séparé, mon xib sera en retard quand il apparaît.

Merci de

Répondre

1

La méthode dirigée par le fil doit écrire dans un emplacement que les objets qui se soucient du résultat aurait accès. Une solution serait d'avoir une méthode envelopper l'appel, obtenir le résultat et poster une notification qui inclut le résultat dans les informations de l'utilisateur. Les objets qui en dépendent peuvent alors gérer la notification. Notez que les objets doivent être créés avant le démarrage du thread, sinon l'objet risque de manquer la notification.

Une esquisse de la solution est:

#define kDropletAvailabilityNotificationName @"com.myapp.notifications.DropletAvailability" 

@implementation MyObject 
- (void)registerNotifications { 
    [[NSNotificationCenter defaultCenter] 
    addObserver:self selector:@selector(dropletAvailabilityNotification:) 
    name:kDropletAvailaibiltyNotificationName 
    object:nil]; 
} 

- (void)unregisterNotifications { 
    [[NSNotificationCenter defaultCenter] 
    removeObserver:self]; 
} 

- (void)dropletAvailabilityNotification:(NSNotification *)note { 
    NSNumber *boolNum = [note object]; 
    BOOL isAvailable = [boolNum boolValue]; 
    /* do something with isAvailable */ 
} 

- (id)init { 
    /* set up… */ 
    [self registerNotifications]; 
    return self; 
} 

- (void)dealloc { 
    [self unregisterNotifications]; 
    /* tear down… */ 
    [super dealloc]; 
} 
@end 

@implementation CheckerObject 
- (rsotine)arositen { 
    /* MyObject must be created before now! */ 
    [self performSelectorInBackground:@selector(checkDropletAvailability) withObject:nil]; 
} 

- (void)checkDropletAvailability { 
    id pool = [[NSAutoreleasePool alloc] init]; 
    BOOL isAvailable = [self backupDropletUpdateAvailable]; 
    NSNumber *boolNum = [NSNumber numberWithBool:isAvailable]; 
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:kDropletAvailaibiltyNotificationName 
    object:boolNum]; 
    [pool drain]; 
} 
+0

merci! Cela a résolu mon problème. – Pripyat