Метод, выполняемый потоком, должен записать в местоположение, к которому у объектов, которые заботятся о результате, будет доступ.Одним из решений было бы иметь метод обернуть вызов, получить результат и опубликовать уведомление, которое включает результат в информацию пользователя.Объекты, которые заботятся, могут тогда обработать уведомление.Обратите внимание, что объекты должны быть созданы до запуска потока, в противном случае объект может пропустить уведомление.
Эскиз решения:
#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];
}