         selectorInfos.insert(notificationInfo)
     }
     
+    public func notificationReceived(notification: NSNotification) {
+        let name = notification.name
+        for info in selectorInfos  where info.selector != nil {
+            if name == info.name && info.observer.respondsToSelector(info.selector!) {
+                info.observer.performSelector(info.selector!, withObject: info.object)
+            }
+        }
+    }
     
     // MARK: Unobserve
     
     public func unobserve(notification: String?, object: NSObject? = nil) {
         var deadInfos = Set<NotificationInfo>()
         
-        with {
+        spinLock {
             for info in self.blockInfos {
                 if info.name == notification && info.object == object {
                     self.DefaultCenter.removeObserver(info.observer, name: info.name, object: info.object)
                 }
-                
                 deadInfos.insert(info)
             }
             

        unobserveAll()
    }
    
    // MARK: Observe with Clouse
    
    public func observe(notification: String?, object: NSObject? = nil, queue: NSOperationQueue? = nil, block: NotificationClouse) {
        let observer = DefaultCenter.addObserverForName(notification, object: object, queue: queue, usingBlock: block)
        
        let info = NotificationInfo(observer: observer as! NSObject, name: notification, object: object)
        
        with {
            self.blockInfos.insert(info)
        }
        
    }
    
    // MARK: Observe with Selector

            DefaultCenter.removeObserver(info.observer, name: info.name, object: info.object)
        }
        
        spinLock {
            self.blockInfos.removeAll(keepCapacity: false)
        }
    }
    
    // MARK: Lock
    
    private func spinLock(closure: Void -> Void) {
        OSSpinLockLock(&lock)
        closure()
        OSSpinLockUnlock(&lock)
