美文网首页
RunLoop应用实例

RunLoop应用实例

作者: 暗夜精灵_NightElf | 来源:发表于2017-11-21 15:14 被阅读0次

    1.滑动与图片刷新;

    当tableview的cell上有需要从网络获取的图片的时候,滚动tableView,异步线程会去加载图片,加载完成后主线程就会设置cell的图片,但是会造成卡顿。可以让设置图片的任务在CFRunLoopDefaultMode下进行,当滚动tableView的时候,RunLoop是在 UITrackingRunLoopMode 下进行,不去设置图片,而是当停止的时候,再去设置图片。

    - (void)viewDidLoad {

    [superviewDidLoad];

    // 只在NSDefaultRunLoopMode下执行(刷新图片)

    [self.myImageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@""] afterDelay:ti inModes:@[NSDefaultRunLoopMode]];

    }

    2.常驻子线程,保持子线程一直处理事件

    为了保证线程长期运转,可以在子线程中加入RunLoop,并且给Runloop设置item,防止Runloop自动退出。

    + (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]];

    }elseif([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/dzlwvxtx.html