zoukankan      html  css  js  c++  java
  • iOS 后台处理

    iOS 后台处理的常见用途

    1、进入后台时候删除资源:应用处于挂起状态的时候所占用的资源越少,该应用被iOS终止的风险就越低。通过从内存中清理那些易于重新创建的资源,可以增加应用驻留内存的机会,因此可以大幅加快重启速度。

    2、进入后台时候保存状态:保存与用户执行的操作相关的所有信息,这样的话,用户下次回来的时候,依然可以恢复到他们离开时的进度。

    3、延时执行,请求更多的后台时间:如果进入后台花费了很多时间,应用可能会从内存中移除,如果应用正在进行文件传输,没有能够完成的话,将会带来很多不便。我们可以将applicationDidEnterBackground 作为平台,告诉系统,你还有额外的工作要做,然后启动一个程序块,真正的执行该工作。

    例解:

    @property (strong, nonatomic) UILabel *label;
    @property (strong, nonatomic) UIImage *smiley;
    @property (strong, nonatomic) UIImageView *smileyView;
    @property (strong, nonatomic) UISegmentedControl *segmentedControl;
    @implementation BIDViewController {
        BOOL animate;
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        
        CGRect bounds = self.view.bounds;
        CGRect labelFrame = CGRectMake(bounds.origin.x, CGRectGetMidY(bounds) - 50,
                                       bounds.size.width, 100);
        
        //转动的Label
        self.label = [[UILabel alloc] initWithFrame:labelFrame];
        self.label.font = [UIFont fontWithName:@"Helvetica" size:70];
        self.label.text = @"Bazinga!";
        self.label.textAlignment = NSTextAlignmentCenter;
        self.label.backgroundColor = [UIColor clearColor];
        
        
        //笑脸
        CGRect smileyFrame = CGRectMake(CGRectGetMidX(bounds) - 42,
                                        CGRectGetMidY(bounds)/2 - 35,
                                        84, 84);
        self.smileyView = [[UIImageView alloc] initWithFrame:smileyFrame];
        self.smileyView.contentMode = UIViewContentModeCenter;
        NSString *smileyPath = [[NSBundle mainBundle] pathForResource:@"smiley"
                                                               ofType:@"png"];
        
        self.smiley = [UIImage imageWithContentsOfFile:smileyPath];
        self.smileyView.image = self.smiley;
        
        
        //分段器
        self.segmentedControl = [[UISegmentedControl alloc] initWithItems:
                                 [NSArray arrayWithObjects:
                                  @"One", @"Two", @"Three", @"Four", nil]] ;
        self.segmentedControl.frame = CGRectMake(bounds.origin.x + 20,
                                                 50,
                                                 bounds.size.width - 40, 30);
        
        
        [self.view addSubview:self.segmentedControl];
        [self.view addSubview:self.smileyView];
        [self.view addSubview:self.label];
        
        
        NSNumber *indexNumber = [[NSUserDefaults standardUserDefaults]
                                 objectForKey:@"selectedIndex"];
        if (indexNumber) {
            NSInteger selectedIndex = [indexNumber intValue];
            self.segmentedControl.selectedSegmentIndex = selectedIndex;
        }
        
        //通知
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self
                   selector:@selector(applicationWillResignActive)
                       name:UIApplicationWillResignActiveNotification
                     object:nil];
        [center addObserver:self
                   selector:@selector(applicationDidBecomeActive)
                       name:UIApplicationDidBecomeActiveNotification
                     object:nil];
        
        [center addObserver:self
                   selector:@selector(applicationDidEnterBackground)
                       name:UIApplicationDidEnterBackgroundNotification
                     object:nil];
        [center addObserver:self
                   selector:@selector(applicationWillEnterForeground)
                       name:UIApplicationWillEnterForegroundNotification
                     object:nil];
    }
    //Label 向下转动
    - (void)rotateLabelDown
    {
        [UIView animateWithDuration:0.5
                         animations:^{
                             self.label.transform = CGAffineTransformMakeRotation(M_PI);
                         }
                         completion:^(BOOL finished){
                             [self rotateLabelUp];
                         }];
    }
    
    //Label 向上转动
    - (void)rotateLabelUp
    {
        [UIView animateWithDuration:0.5
                         animations:^{
                             self.label.transform = CGAffineTransformMakeRotation(0);
                         }
                         completion:^(BOOL finished){
                             if (animate) {
                                 [self rotateLabelDown];
                             }
                         }];
    }
    //离开活动状态
    - (void)applicationWillResignActive
    {
        NSLog(@"VC: %@", NSStringFromSelector(_cmd));
        animate = NO;
    }
    
    //进入活动状态
    - (void)applicationDidBecomeActive
    {
        NSLog(@"VC: %@", NSStringFromSelector(_cmd));
        animate = YES;
        [self rotateLabelDown];
    }
    //后台运行
    - (void)applicationDidEnterBackground
    {
        NSLog(@"VC: %@", NSStringFromSelector(_cmd));
        //先获取共享的UIApplication 实例。
        UIApplication *app = [UIApplication sharedApplication];
        
        //声明了taskId变量、并用__block修饰。
        __block UIBackgroundTaskIdentifier taskId;
        
        //告诉系统,需要更多的时间来完成某件事,并承诺在完成之后告诉它。如果系统判定我们运行了太久时间并决定停止运行,可以调用我们做为参数提供的程序块
        taskId = [app beginBackgroundTaskWithExpirationHandler:^{
            NSLog(@"Background task ran out of time and was terminated.");
            [app endBackgroundTask:taskId];
        }];
        
        //如果系统返回的值是UIBackgroundTaskInvalid,表明系统没有为我们提供任何多余的时间。
        if (taskId == UIBackgroundTaskInvalid) {
            NSLog(@"Failed to start background task!");
            return;
        }
        
        //
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
        ^{
            NSLog(@"Starting background task with %f seconds remaining",
                  app.backgroundTimeRemaining);
            
            self.smiley = nil;
            self.smileyView.image = nil;
            
            //存储segmentedControl的位置
            NSInteger selectedIndex = self.segmentedControl.selectedSegmentIndex;
            [[NSUserDefaults standardUserDefaults] setInteger:selectedIndex
                                                       forKey:@"selectedIndex"];
            
            //模拟一个25秒的过程
            [NSThread sleepForTimeInterval:25];
            
            NSLog(@"Finishing background task with %f seconds remaining",
                  app.backgroundTimeRemaining);
            //告诉系统,我们已经完成
            [app endBackgroundTask:taskId];
        });
    }
    //进入前台
    - (void)applicationWillEnterForeground
    {
        NSLog(@"VC: %@", NSStringFromSelector(_cmd));
        NSString *smileyPath = [[NSBundle mainBundle] pathForResource:@"smiley"
                                                               ofType:@"png"];
        self.smiley = [UIImage imageWithContentsOfFile:smileyPath];
        self.smileyView.image = self.smiley;
    }

    运行效果:

  • 相关阅读:
    选择结构(if、switch)
    顺序结构程序
    矩阵变换、矩阵求值
    basicRF双向灯光控制
    基于BasicRF点对点无线开发基础知识
    MATLAB矩阵处理—特殊矩阵
    ScrollView嵌套RecyclerView时滑动出现的卡顿
    如何给GridView添加网格
    Android 中关于ListView分割线的设置
    关于ScrollView嵌套ListView问题
  • 原文地址:https://www.cnblogs.com/jukaiit/p/5830195.html
Copyright © 2011-2022 走看看