iOS Runloop 실습(상주 스레드)
- (void)viewDidLoad {
[super viewDidLoad];
//
self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(createRunloopByNormal) object:nil] ;
//
// self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(createRunloopByCFObserver) object:nil] ;
//
// self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(createRunloopByCFTimer) object:nil] ;
//
// self.thread = [[NSThread alloc] initWithTarget:self selector:@selector(createRunloopByCFSource) object:nil] ;
[self.thread start];
}
/**
* runloop 。 :
*/
- (void)createRunloopByNormal{
@autoreleasepool {
// port , runloop , 。
[[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
// runloop
[[NSRunLoop currentRunLoop] run];
}
}
위의 창설 방식은 업무에서 자주 사용하는 방식이다. 유명한 AFNetworking은 바로 이런 방식으로 시작된 AFNetworking 라인이 상주하는 것이다.
다음은 라인이 종료되는지 테스트해 보겠습니다.
- (IBAction)btnClick:(id)sender {
NSLog(@"-----btnClick--------");
[self performSelector:@selector(test) onThread:self.thread withObject:nil waitUntilDone:NO];
}
- (void)test{
NSLog(@"----->Test");
}
인쇄할 수 있는 --->Test는 스레드가 무효가 아니라는 것을 설명합니다.Core Foundation을 통해runloop을 만드는 방법
/**
* CFRunLoop Observer , runloop。 :
*/
- (void)createRunloopByCFObserver{
@autoreleasepool {
CFRunLoopRef runloop = CFRunLoopGetCurrent();
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"CFRunLoopActivity -->%zd",activity);
});
CFRunLoopAddObserver(runloop, observer, kCFRunLoopDefaultMode);
CFRelease(observer);
CFRunLoopRun();
}
}
/**
* CFRunLoop Timer , runloop。 :
*/
- (void)createRunloopByCFTimer{
@autoreleasepool {
CFRunLoopRef runloop = CFRunLoopGetCurrent();
CFRunLoopTimerRef timer = CFRunLoopTimerCreateWithHandler(CFAllocatorGetDefault(), CFAbsoluteTimeGetCurrent(), kCFAbsoluteTimeIntervalSince1904, 0, 0, ^(CFRunLoopTimerRef timer) {
});
CFRunLoopAddTimer(runloop, timer, kCFRunLoopDefaultMode);
CFRelease(timer);
CFRunLoopRun();
}
}
/**
* CFRunLoop Source , runloop。 :
*/
- (void)createRunloopByCFSource{
@autoreleasepool {
CFRunLoopRef runloop = CFRunLoopGetCurrent();
CFRunLoopSourceContext source_context;
bzero(&source_context, sizeof(source_context));
CFRunLoopSourceRef source = CFRunLoopSourceCreate(CFAllocatorGetDefault(), 0,&source_context );
CFRunLoopAddSource(runloop, source, kCFRunLoopDefaultMode);
CFRelease(source);
CFRunLoopRun();
}
}
테스트를 통해 단순히 Observer를 추가한 다음에runloop을 시작하면runloop이 장기적으로 실행되지 않으면 퀴즈를 종료합니다.또 다른 Source, Timer는runloop의 정상적인 운행을 보장할 수 있다.
팁:
1.Source、Timer、Observer
2. Observer runloop ,
3. Timer , time 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.