42 _CPNotificationRegistry _unnamedRegistry;
63 _unnamedRegistry = [[_CPNotificationRegistry alloc] init];
76 - (void)addObserver:(
id)anObserver selector:(
SEL)aSelector name:(
CPString)aNotificationName object:(
id)anObject
79 observer = [[_CPNotificationObserver alloc] initWithObserver:anObserver selector:aSelector];
81 if (aNotificationName == nil)
82 registry = _unnamedRegistry;
83 else if (!(registry = [_namedRegistries objectForKey:aNotificationName]))
85 registry = [[_CPNotificationRegistry alloc] init];
86 [_namedRegistries setObject:registry forKey:aNotificationName];
89 [registry addObserver:observer object:anObject];
96 - (void)removeObserver:(
id)anObserver
99 names = [_namedRegistries keyEnumerator];
101 while ((name = [names nextObject]) !== nil)
102 [[_namedRegistries objectForKey:name] removeObserver:anObserver object:nil];
104 [_unnamedRegistry removeObserver:anObserver object:nil];
113 - (void)removeObserver:(
id)anObserver name:(
CPString)aNotificationName object:(
id)anObject
115 if (aNotificationName == nil)
118 names = [_namedRegistries keyEnumerator];
120 while ((name = [names nextObject]) !== nil)
121 [[_namedRegistries objectForKey:name] removeObserver:anObserver object:anObject];
123 [_unnamedRegistry removeObserver:anObserver object:anObject];
126 [[_namedRegistries objectForKey:aNotificationName] removeObserver:anObserver object:anObject];
137 [
CPException raise:CPInvalidArgumentException
reason:"postNotification: does not except 'nil' notifications"];
139 _CPNotificationCenterPostNotification(
self, aNotification);
150 _CPNotificationCenterPostNotification(
self, [[
CPNotification alloc] initWithName:aNotificationName
object:anObject userInfo:aUserInfo]);
158 - (void)postNotificationName:(
CPString)aNotificationName object:(
id)anObject
160 _CPNotificationCenterPostNotification(
self, [[
CPNotification alloc] initWithName:aNotificationName
object:anObject userInfo:nil]);
165 var _CPNotificationCenterPostNotification =
function(
self, aNotification)
167 [
self._unnamedRegistry postNotification:aNotification];
168 [[
self._namedRegistries objectForKey:[aNotification
name]] postNotification:aNotification];
175 @implementation _CPNotificationRegistry :
CPObject
192 - (void)addObserver:(_CPNotificationObserver)anObserver object:(
id)anObject
200 var observers = [_objectObservers objectForKey:[anObject UID]];
205 [_objectObservers setObject:observers forKey:[anObject UID]];
209 [observers addObject:anObserver];
212 - (void)removeObserver:(
id)anObserver object:(
id)anObject
214 var removedKeys = [];
220 keys = [_objectObservers keyEnumerator];
223 while ((key = [keys nextObject]) !== nil)
225 var observers = [_objectObservers objectForKey:key],
227 observersEnumerator = [observers objectEnumerator];
229 while ((observer = [observersEnumerator nextObject]) !== nil)
230 if ([observer observer] == anObserver)
231 [observers removeObject:observer];
233 if (![observers count])
234 removedKeys.push(key);
239 var key = [anObject UID],
240 observers = [_objectObservers objectForKey:key],
242 observersEnumerator = [observers objectEnumerator];
244 while ((observer = [observersEnumerator nextObject]) !== nil)
245 if ([observer observer] == anObserver)
246 [observers removeObject:observer];
248 if (![observers count])
249 removedKeys.push(key);
252 var count = removedKeys.length;
255 [_objectObservers removeObjectForKey:removedKeys[count]];
265 var
object = [aNotification
object],
266 currentObservers = nil;
268 if (
object != nil && (currentObservers = [_objectObservers objectForKey:[
object UID]]))
270 var observers = [currentObservers copy],
272 observersEnumerator = [observers objectEnumerator];
274 while ((observer = [observersEnumerator nextObject]) !== nil)
277 if ([currentObservers containsObject:observer])
278 [observer postNotification:aNotification];
283 currentObservers = [_objectObservers objectForKey:[[
CPNull null]
UID]];
285 if (!currentObservers)
288 var observers = [currentObservers copy],
289 observersEnumerator = [observers objectEnumerator];
291 while ((observer = [observersEnumerator nextObject]) !== nil)
294 if ([currentObservers containsObject:observer])
295 [observer postNotification:aNotification];
301 return [_objectObservers count];
307 @implementation _CPNotificationObserver :
CPObject
313 - (id)initWithObserver:(
id)anObserver selector:(
SEL)aSelector
317 _observer = anObserver;
318 _selector = aSelector;
331 [_observer performSelector:_selector withObject:aNotification];