/* * Copyright (c) 2014, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #import "OSSTaskCompletionSource.h" #import "OSSTask.h" NS_ASSUME_NONNULL_BEGIN @interface OSSTask (OSSTaskCompletionSource) - (BOOL)trySetResult:(nullable id)result; - (BOOL)trySetError:(NSError *)error; - (BOOL)trySetException:(NSException *)exception; - (BOOL)trySetCancelled; @end @implementation OSSTaskCompletionSource #pragma mark - Initializer + (instancetype)taskCompletionSource { return [[self alloc] init]; } - (instancetype)init { self = [super init]; if (!self) return self; _task = [[OSSTask alloc] init]; return self; } #pragma mark - Custom Setters/Getters - (void)setResult:(nullable id)result { if (![self.task trySetResult:result]) { [NSException raise:NSInternalInconsistencyException format:@"Cannot set the result on a completed task."]; } } - (void)setError:(NSError *)error { if (![self.task trySetError:error]) { [NSException raise:NSInternalInconsistencyException format:@"Cannot set the error on a completed task."]; } } - (void)setException:(NSException *)exception { if (![self.task trySetException:exception]) { [NSException raise:NSInternalInconsistencyException format:@"Cannot set the exception on a completed task."]; } } - (void)cancel { if (![self.task trySetCancelled]) { [NSException raise:NSInternalInconsistencyException format:@"Cannot cancel a completed task."]; } } - (BOOL)trySetResult:(nullable id)result { return [self.task trySetResult:result]; } - (BOOL)trySetError:(NSError *)error { return [self.task trySetError:error]; } - (BOOL)trySetException:(NSException *)exception { return [self.task trySetException:exception]; } - (BOOL)trySetCancelled { return [self.task trySetCancelled]; } @end NS_ASSUME_NONNULL_END