-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLongThread.m
More file actions
124 lines (96 loc) · 2.49 KB
/
LongThread.m
File metadata and controls
124 lines (96 loc) · 2.49 KB
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// LongThread.m
// runloopTest
//
// Created by du on 2020/4/5.
// Copyright © 2020 du. All rights reserved.
//
#import "LongThread.h"
@interface XXThread: NSThread
@end
@implementation XXThread
- (void)dealloc{
NSLog(@"%s",__func__);
}
@end
//#define USE_CoreFoundation
@interface LongThread ()
@property (nonatomic,strong) XXThread *thread;
@property (nonatomic,assign) BOOL exitRunloop;
@end
@implementation LongThread
+ (instancetype)thread{
LongThread *l = [[LongThread alloc]init];
return l;
}
#ifdef USE_CoreFoundation
- (instancetype)init{
self = [super init];
if (self) {
_thread = [[XXThread alloc]initWithBlock:^{
//基于CoreFoundation 实现
CFRunLoopSourceContext context = {0};
CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
CFRelease(source);
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, false);
}];
[_thread start];
}
return self;
}
#else
- (instancetype)init{
self = [super init];
if (self) {
_exitRunloop = NO;
__weak typeof(self) weakSelf = self;
_thread = [[XXThread alloc]initWithBlock:^{
//基于Foundation实现
[[NSRunLoop currentRunLoop]addPort:[NSPort port]
forMode:NSDefaultRunLoopMode];
while (weakSelf && !weakSelf.exitRunloop) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]];
}
}];
[_thread start];
}
return self;
}
#endif
- (void)doTask:(ThreadBlock)block{
if(self.thread == nil){
return;
}
[self performSelector:@selector(__doTask:) onThread:self.thread withObject:block waitUntilDone:NO];
}
- (void)stop{
if(self.thread == nil){
return;
}
[self performSelector:@selector(__stop) onThread:self.thread withObject:nil waitUntilDone:YES];
}
#pragma mark - private -
- (void)dealloc{
NSLog(@"%s",__func__);
[self stop];
}
#ifdef USE_CoreFoundation
- (void)__stop{
CFRunLoopStop(CFRunLoopGetCurrent());
self.thread = nil;
}
#else
- (void)__stop{
self.exitRunloop = YES;
CFRunLoopStop(CFRunLoopGetCurrent());
self.thread = nil;
}
#endif
- (void)__doTask:(ThreadBlock)block{
if (block) {
block();
}
}
@end