NSThread - получить значение bool - PullRequest
1 голос
/ 27 октября 2010

Я пытаюсь получить логическое значение, которое возвращается -(BOOL)backupDropletUpdateAvailable через NSThread.

Для этого я попробовал следующее:

`BOOL isAvailable = NO;

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

if (isAvailable == YES)
{//etc

Возвращает предупреждение, поскольку BOOL - это целое число, а toTarget: - указатель. Но как я могу получить значение? Если я не сделаю это в отдельном потоке, моя xib будет отставать, когда появится.

Спасибо:)

1 Ответ

1 голос
/ 27 октября 2010

Метод, выполняемый потоком, должен записать в местоположение, к которому у объектов, которые заботятся о результате, будет доступ.Одним из решений было бы иметь метод обернуть вызов, получить результат и опубликовать уведомление, которое включает результат в информацию пользователя.Объекты, которые заботятся, могут тогда обработать уведомление.Обратите внимание, что объекты должны быть созданы до запуска потока, в противном случае объект может пропустить уведомление.

Эскиз решения:

#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];
}
...