杨锴
2025-04-16 09a372bc45fde16fd42257ab6f78b8deeecf720b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
 *  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