美文网首页
[搬运]RunLoop个人学习

[搬运]RunLoop个人学习

作者: 月咏蝴蝶 | 来源:发表于2016-01-12 15:36 被阅读203次

    深入理解RunLoop
    sunnyxx关于runloop的线下视频
    iOS程序启动与运转
    详细内容上面的链接已经讲得很详细了
    下面是关于RunLoop运用场景

    1. 滑动与图片刷新;
      当tableview的cell上有需要从网络获取的图片的时候,滚动tableView,异步线程会去加载图片,加载完成后主线程就会设置cell的图片,但是会造成卡顿。可以让设置图片的任务在CFRunLoopDefaultMode下进行,当滚动tableView的时候,RunLoop是在 UITrackingRunLoopMode 下进行,不去设置图片,而是当停止的时候,再去设置图片。
    这两者本质是一样的,第二种其实是在内部创建一个Timer去执行
    NSRunLoopCommonModes 包括滑动时和平常时两种app状态
    NSDefaultRunLoopMode 只包括平常时的app状态,滑动不会执行RunLoop
    #pragma mark - NSTimer运用
        NSTimer *time = [NSTimer timerWithTimeInterval:20.0 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
        [[NSRunLoop mainRunLoop] addTimer:time forMode:NSDefaultRunLoopMode];
        
    #pragma mark - PerformSelector方法
        [self performSelector:@selector(xxx:) withObject:self afterDelay:1.0f inModes:@[NSDefaultRunLoopMode]];
    
    1. 常驻子线程,保持子线程一直处理事件
      为了保证线程长期运转,可以在子线程中加入RunLoop,并且给Runloop设置item,防止Runloop自动退出。这里为子线程设置了RunLoop之后,由于Mode存在,子线程就一直做do-while循环,而且Mode只能添加不能删除,如果想删除,只有退出RunLoop重新设置一个Mode
    + (void)networkRequestThreadEntryPoint:(id)__unused object {
        @autoreleasepool {
            [[NSThread currentThread] setName:@"AFNetworking"];
            NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
            [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
            [runLoop run];
        }
    }
    
    + (NSThread *)networkRequestThread {
        static NSThread *_networkRequestThread = nil;
        static dispatch_once_t oncePredicate;
        dispatch_once(&oncePredicate, ^{
            _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
            [_networkRequestThread start];
        });
        return _networkRequestThread;
    }
    - (void)start {
        [self.lock lock];
        if ([self isCancelled]) {
            [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];
        } else if ([self isReady]) {
            self.state = AFOperationExecutingState;
            [self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];
        }
        [self.lock unlock];
    }
    

    相关文章

      网友评论

          本文标题:[搬运]RunLoop个人学习

          本文链接:https://www.haomeiwen.com/subject/vthckttx.html