PINCache中的后台任务

作者: 萧子然 | 来源:发表于2016-06-30 17:23 被阅读161次

PINCache中的后台任务

在PINCache磁盘缓存策略中,针对数据写入,删除等磁盘操作,作者用了后台任务操作,用来确保磁盘操作得以顺利完成。其具体是通过beginBackgroundTaskWithExpirationHandler来实现的。作者对其操作进行了封装。在源码中有一个PINBackgroundTask类,该类实现了向系统注册后台任务的方法。


这里有几点需要明确下:
  • 大多数情况下,我们可以在app中通过调用beginBackgroundTaskWithExpirationHandler来请求一个后台任务,通过调用endBackgroundTask来完成该请求。几乎不会在用户按下Home键的时候来调用。

  • 你可以在任何时候,同时向系统请求多个任务。这对于系统来说,性能损耗较低,就好比引用计数一样,只要系统中还有一个未完成的请求,系统就会预留一些时间来完成它。

  • 系统是不能保证用户的请求同步完成。这些方法只是向系统请求,系统仍可以忽略该请求,在需要一些额外的资源,甚至可能被系统然随时杀了进程。系统通常会预留约10分钟时间来处理请求。

动手写一个
  1. 检查系统是否支持多线程任务

     if([][UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupportes)]) {
    
     }
    
  2. 向系统请求一个后台任务

     __block UIBackgroundTaskIdentifier background_task;
     background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
     //This code block is execute when the application’s 
     //remaining background time reaches ZERO.}];
    
  3. 执行自己的异步操作,并标志请求完成

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
     //### background task starts
     NSLog(@"Running in the background\n");
     while(TRUE)
     {
         NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
         [NSThread sleepForTimeInterval:1]; //wait for 1 sec
     }
     //#### background task ends
    
     //Clean up code. Tell the system that we are done.
     [application endBackgroundTask: background_task];
     background_task = UIBackgroundTaskInvalid; });  
    

看看PINCache的具体实现
@interface PINBackgroundTask : NSObject
#if !defined(PIN_APP_EXTENSIONS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
@property (atomic, assign) UIBackgroundTaskIdentifier taskID;
#endif
+ (instancetype)start;
- (void)end;
@end

@implementation PINBackgroundTask
- (instancetype)init
{
    if (self = [super init]) {
#if !defined(PIN_APP_EXTENSIONS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
        _taskID = UIBackgroundTaskInvalid;
#endif
    }
    return self;
}

+ (instancetype)start
{
    PINBackgroundTask *task = [[self alloc] init];
#if !defined(PIN_APP_EXTENSIONS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
    task.taskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        UIBackgroundTaskIdentifier taskID = task.taskID;
        task.taskID = UIBackgroundTaskInvalid;
        [[UIApplication sharedApplication] endBackgroundTask:taskID];
    }];
#endif
    return task;
}

- (void)end
{
#if !defined(PIN_APP_EXTENSIONS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
    UIBackgroundTaskIdentifier taskID = self.taskID;
    self.taskID = UIBackgroundTaskInvalid;
    [[UIApplication sharedApplication] endBackgroundTask:taskID];
#endif
}

@end
具体使用
- (void)removeObjectForKey:(NSString *)key fileURL:(NSURL **)outFileURL
{
    if (!key)
        return;
    //创建一个后台请求
    PINBackgroundTask *task = [PINBackgroundTask start];    
    NSURL *fileURL = nil;
    
    [self lock];
        fileURL = [self encodedFileURLForKey:key];
        [self removeFileAndExecuteBlocksForKey:key];
    [self unlock];
    //注销完成该请求
    [task end];
    
    if (outFileURL) {
        *outFileURL = fileURL;
    }
}

相关文章

  • PINCache中的后台任务

    PINCache中的后台任务 在PINCache磁盘缓存策略中,针对数据写入,删除等磁盘操作,作者用了后台任务操作...

  • iOS - 常见框架使用

    1. PINCache -->PINCache是多线程安全的,使用键值对来保存数据。PINCache内部包含了2个...

  • ReactiveCocoa AFNetworking PINCa

    最近需要实现对网络数据的缓存,通过综合考虑最后决定采用PINCache作为底层缓存框架,PINCache是Pint...

  • PINCache

    PINCache 是一个适用于 iOS,tvOS 和 OS X 的快速、无死锁的并行对象缓存框架。 PINCach...

  • iOS PINCache学习

    最近突发奇想,想对比下几个不同Cache框架的实现,于是就从项目中在用的PINCache着手分析。PINCache...

  • PINCache和YYCache

    PINCache根据键值对来进行存储, PINCache有磁盘缓存和内存缓存,分别由两个对象属性PINDiskCa...

  • uap后台任务&&预警平台

    后台任务 【后台任务类型注册】 业务插件:对应的后台任务入口类nc.bs.**.**BGWorkPlugin 关键...

  • iOS app退到后台经常被杀,重新启动体验很差

    同事在写推送那块代码,加的后台任务。 代码中几处错误: applyForMoreTime中的backgroundT...

  • JetPack之WorkManager 管理后台任务

    【链接】【背景】作为 Android Jetpack 中的新组件,WorkManager 负责用来管理后台任务,它...

  • WorkManager调研分析

    背景:通常我们在开发过程中处理后台任务的时候可能是自己维系一个线程池或者通过一个后台任务来完成我们的工作,然后对于...

网友评论

    本文标题:PINCache中的后台任务

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