case error(Error)
}
-let watingQueue = DispatchQueue(label: "Future", attributes: .concurrent)
+private let watingQueue = DispatchQueue(label: "Future", attributes: .concurrent)
class Future<T> {
private let queue: DispatchQueue
}
}
-extension Future {
-
+
+extension NotificationCenter {
- /// Notificationã\82\92å¾\85ã\81£ã\81¦å\80¤ã\82\92è¨å®\9aã\81\99ã\82\8b
+ /// Notificationã\82\92å¾\85ã\81£ã\81¦å\80¤ã\81\8cè¨å®\9aã\81\95ã\82\8cã\82\8b Future<T>ã\82\92è¿\94ã\81\99
///
/// - Parameters:
- /// - center: NotificationCenter. default is NotificationCenter.default
/// - name: Notification.Name
/// - object: 監視対象
/// - block:
/// Parameters: Notification
/// Returns: `Result<T>` : 成功時は `.value<T>`, エラー時は `.error<Error>`, 監視を継続するときは `.none`を返す
- func waitingNotification(_ center: NotificationCenter = .default, name: Notification.Name, object: Any?, block: @escaping (Notification) -> Result<T>) {
+ /// - Returns: Notificationによって値が設定される Future<T>
+ func future<T>(name: Notification.Name, object: Any?, block: @escaping (Notification) -> Result<T>) -> Future<T> {
+
+ let future = Future<T>()
weak var token: NSObjectProtocol?
- token = center
+ token = self
.addObserver(forName: name,
object: object,
queue: nil) { notification in
-
switch block(notification) {
- case .value(let val): self.success(val)
+ case .value(let val): future.success(val)
case .none: return
- case .error(let error): self.failure(error)
+ case .error(let error): future.failure(error)
}
token.map(NotificationCenter.default.removeObserver)
}
+
+ return future
}
+}
+
+extension CoreDataProvider {
- /// å\88\9då\9b\9eèµ·å\8b\95æ\99\82ã\81ªã\81©ã\81«ã\83\87ã\83¼ã\82¿ã\81\8cã\81ªã\81\84æ\99\82ã\81ªã\81©ã\81«CoreDataã\82\92ç\9b£è¦\96ã\81\99ã\82\8b
+ /// å\88\9då\9b\9eèµ·å\8b\95æ\99\82ã\81ªã\81©ã\81«ã\83\87ã\83¼ã\82¿ã\81\8cã\81ªã\81\84æ\99\82ã\81ªã\81©ã\81«CoreDataã\82\92ç\9b£è¦\96ã\81\97å\80¤ã\81\8cè¨å®\9aã\81\95ã\82\8cã\82\8b Future<T>ã\82\92è¿\94ã\81\99
///
/// - Parameters:
- /// - coreData: 監視対象
/// - block:
/// Parameters: Notification (NSManagedObjectContextObjectsDidChange)
/// Returns: `Result<T>` : 成功時は `.value<T>`, エラー時は `.error<Error>`, 監視を継続するときは `.none`を返す
- func waitingCoreData(_ coreData: CoreDataProvider = ServerDataStore.default, block: @escaping (Notification) -> Result<T>) {
+ /// - Returns: CoreDataの更新で値が設定される Future<T>
+ func future<T>(block: @escaping (Notification) -> Result<T>) -> Future<T> {
- waitingNotification(name: .NSManagedObjectContextObjectsDidChange, object: coreData.context, block: block)
+ return NotificationCenter.default
+ .future(name: .NSManagedObjectContextObjectsDidChange, object: self.context, block: block)
}
}