迁移到Xcode 4.3和IOS 5后,NSNotification多线程无法正常工作

时间:2012-01-31 21:26:07

标签: ios multithreading notifications

我已将我的工作应用程序从Xcode 3.2迁移到Xcode 4.2 IOS 5,并且通知代码不会触发。我已经使用NSNotificationsAdditions来确保每次都将所有通知发送到主线程。是的,在早期版本中有效的功能现在不起作用。

- (void) postNotificationOnMainThread:(NSNotification *) notification {
     if( [NSThread isMainThread] ) return [self postNotification:notification];
     [self postNotificationOnMainThread:notification waitUntilDone:NO];
}

- (void) postNotificationOnMainThread:(NSNotification *) notification waitUntilDone:(BOOL) wait {
    if( [NSThread isMainThread] ) return [self postNotification:notification];
    [[self class] performSelectorOnMainThread:@selector( _postNotification: ) withObject:notification waitUntilDone:wait];
}

+ (void) _postNotification:(NSNotification *) notification {
    [[self defaultCenter] postNotification:notification];
}

- (void) postNotificationOnMainThreadWithName:(NSString *) name object:(id) object {
    if([NSThread isMainThread] ) return [self postNotificationName:name object:object userInfo:nil];
    [self postNotificationOnMainThreadWithName:name object:object userInfo:nil waitUntilDone:NO];
}

- (void) postNotificationOnMainThreadWithName:(NSString *) name object:(id) object userInfo:(NSDictionary *) userInfo {
     if([NSThread isMainThread]) return [self postNotificationName:name object:object userInfo:userInfo];
     [self postNotificationOnMainThreadWithName:name object:object userInfo:userInfo waitUntilDone:NO];
}

- (void) postNotificationOnMainThreadWithName:(NSString *) name object:(id) object userInfo:(NSDictionary *) userInfo waitUntilDone:(BOOL) wait {
    if([NSThread isMainThread]) return [self postNotificationName:name object:object userInfo:userInfo];
    NSMutableDictionary *info = [[NSMutableDictionary alloc] initWithCapacity:3];
    if( name ) [info setObject:name forKey:@"name"];
    if( object ) [info setObject:object forKey:@"object"];
    if( userInfo ) [info setObject:userInfo forKey:@"userInfo"];
    [[self class] performSelectorOnMainThread:@selector( _postNotificationName: ) withObject:info waitUntilDone:wait];
    [info release];
}

+ (void) _postNotificationName:(NSDictionary *) info {
    NSString *name = [info objectForKey:@"name"];
    id object = [info objectForKey:@"object"];
    NSDictionary *userInfo = [info objectForKey:@"userInfo"];
    [[self defaultCenter] postNotificationName:name object:object userInfo:userInfo];
}

0 个答案:

没有答案