42 _CPNotificationRegistry _unnamedRegistry;
62 _namedRegistries = @{};
63 _unnamedRegistry = [[_CPNotificationRegistry alloc] init];
77 - (void)addObserver:(
id)anObserver selector:(
SEL)aSelector name:(
CPString)aNotificationName object:(
id)anObject
79 var registry = [
self _registryForNotificationName:aNotificationName],
80 observer = [[_CPNotificationObserver alloc] initWithObserver:anObserver selector:aSelector];
82 [registry addObserver:observer object:anObject];
94 var registry = [
self _registryForNotificationName:aNotificationName],
95 observer = [[_CPNotificationObserver alloc] initWithBlock:block queue:queue];
97 [registry addObserver:observer object:anObject];
105 - (_CPNotificationRegistry)_registryForNotificationName:(
CPString)aNotificationName
109 if (aNotificationName == nil)
110 registry = _unnamedRegistry;
111 else if (!(registry = [_namedRegistries objectForKey:aNotificationName]))
113 registry = [[_CPNotificationRegistry alloc] init];
114 [_namedRegistries setObject:registry forKey:aNotificationName];
124 - (void)removeObserver:(
id)anObserver
127 names = [_namedRegistries keyEnumerator];
129 while ((
name = [names nextObject]) !== nil)
130 [[_namedRegistries objectForKey:name] removeObserver:anObserver object:nil];
132 [_unnamedRegistry removeObserver:anObserver object:nil];
141 - (void)removeObserver:(
id)anObserver name:(
CPString)aNotificationName object:(
id)anObject
143 if (aNotificationName == nil)
146 names = [_namedRegistries keyEnumerator];
148 while ((
name = [names nextObject]) !== nil)
149 [[_namedRegistries objectForKey:name] removeObserver:anObserver object:anObject];
151 [_unnamedRegistry removeObserver:anObserver object:anObject];
154 [[_namedRegistries objectForKey:aNotificationName] removeObserver:anObserver object:anObject];
165 [
CPException raise:CPInvalidArgumentException
reason:"postNotification: does not except 'nil' notifications"];
167 _CPNotificationCenterPostNotification(
self, aNotification);
178 _CPNotificationCenterPostNotification(
self, [[
CPNotification alloc] initWithName:aNotificationName
object:anObject userInfo:aUserInfo]);
186 - (void)postNotificationName:(
CPString)aNotificationName object:(
id)anObject
188 _CPNotificationCenterPostNotification(
self, [[
CPNotification alloc] initWithName:aNotificationName
object:anObject userInfo:nil]);
193 var _CPNotificationCenterPostNotification =
function(
self, aNotification)
195 [
self._unnamedRegistry postNotification:aNotification];
196 [[
self._namedRegistries objectForKey:[aNotification
name]] postNotification:aNotification];
203 @implementation _CPNotificationRegistry :
CPObject 214 _objectObservers = @{};
220 - (void)addObserver:(_CPNotificationObserver)anObserver object:(
id)anObject
228 var observers = [_objectObservers objectForKey:[anObject UID]];
233 [_objectObservers setObject:observers forKey:[anObject UID]];
237 [observers addObject:anObserver];
240 - (void)removeObserver:(
id)anObserver object:(
id)anObject
242 var removedKeys = [];
248 keys = [_objectObservers keyEnumerator];
251 while ((key = [keys nextObject]) !== nil)
253 var observers = [_objectObservers objectForKey:key],
255 observersEnumerator = [observers objectEnumerator];
257 while ((observer = [observersEnumerator nextObject]) !== nil)
258 if ([observer observer] == anObserver ||
259 ([observer block] && [anObserver respondsToSelector:
@selector(block)] && [observer block] == [anObserver block]))
260 [observers removeObject:observer];
262 if (![observers count])
263 removedKeys.push(key);
268 var key = [anObject UID],
269 observers = [_objectObservers objectForKey:key],
271 observersEnumerator = [observers objectEnumerator];
273 while ((observer = [observersEnumerator nextObject]) !== nil)
274 if ([observer observer] == anObserver ||
275 ([observer block] && [anObserver respondsToSelector:
@selector(block)] && [observer block] == [anObserver block]))
276 [observers removeObject:observer];
278 if (![observers count])
279 removedKeys.push(key);
282 var count = removedKeys.length;
285 [_objectObservers removeObjectForKey:removedKeys[count]];
295 var
object = [aNotification
object],
296 currentObservers = nil;
298 if (
object != nil && (currentObservers = [_objectObservers objectForKey:[
object UID]]))
300 var observers = [currentObservers copy],
302 observersEnumerator = [observers objectEnumerator];
304 while ((observer = [observersEnumerator nextObject]) !== nil)
307 if ([currentObservers containsObject:observer])
308 [observer postNotification:aNotification];
313 currentObservers = [_objectObservers objectForKey:[[
CPNull null]
UID]];
315 if (!currentObservers)
318 var observers = [currentObservers copy],
319 observersEnumerator = [observers objectEnumerator];
321 while ((observer = [observersEnumerator nextObject]) !== nil)
324 if ([currentObservers containsObject:observer])
325 [observer postNotification:aNotification];
331 return [_objectObservers count];
337 @implementation _CPNotificationObserver :
CPObject 345 - (id)initWithObserver:(
id)anObserver selector:(
SEL)aSelector
349 _observer = anObserver;
350 _selector = aSelector;
361 _operationQueue = aQueue;
381 if (!_operationQueue)
382 _block(aNotification);
384 [_operationQueue addOperation:[[_CPNotificationObserverOperation alloc] initWithBlock:_block notification:aNotification]];
389 [_observer performSelector:_selector withObject:aNotification];
395 @implementation _CPNotificationObserverOperation :
CPOperation 402 - (id)initWithBlock:(Function)aBlock notification:(
CPNotification)aNotification
409 _notification = aNotification;
418 _block(_notification);
Used to implement exception handling (creating & raising).
An object representation of nil.
var CPNotificationDefaultCenter
void raise:reason:(CPString aName, [reason] CPString aReason)
A mutable key-value pair collection.
An immutable string (collection of characters).
A notification that can be posted to a CPNotificationCenter.
Represents an operation that can be run in an CPOperationQueue.
Sends messages (CPNotification) between objects.
Represents an operation queue that can run CPOperations.