Adding Background Fetch Capabilities to Your Apps(在后台获取数据)

  与前一篇介绍app(主动)在后台运行长时间的任务不同,这次是app(被动)让IOS唤醒启动模式

  一般情况,都是打开运行app,然后让app刷新,才能看到新内容,但是这种新的唤醒机制是让app在后台就完成刷新任务,当用户打开app时,新内容已经呈现出

  前提:项目设置-Capabilities-Background Modes:Background fetch 勾选中

  方法:

      //设置唤醒时间

     - (void)setMinimumBackgroundFetchInterval:(NSTimeInterval)minimumBackgroundFetchInterval

      //执行后台获取数据操作

     - (void)application:(UIApplication *)application 

                   performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler

e.g.

 AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (nonatomic, strong) UIWindow *window;

@property (nonatomic, strong) NSMutableArray *allNewsItems;

@end


 AppDelegate.m

#import "AppDelegate.h"

#import "NewsItem.h" //自定义对象NewsItem 有两属性 NSDate *date , NSString *text;

@implementation AppDelegate

//初始化数组

- (NSMutableArray *) allNewsItems{

    if (_allNewsItems == nil){

        _allNewsItems = [[NSMutableArray alloc] init];      

        /* Pre-populate the array with one item */

        NewsItem *item = [[NewsItem alloc] init];

        item.date = [NSDate date];

        item.text = [NSString stringWithFormat:@"News text 1"];

        [_allNewsItems addObject:item];       

    }

    return _allNewsItems;

}

- (BOOL) application:(UIApplication *)application  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{  

    //设置唤醒时间,默认UIApplicationBackgroundFetchIntervalNever,稍后要执行performFetchWithCompletionHandler

    [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum];   

    return YES;

}

// 后台获取数据

- (void) application:(UIApplication *)application

  performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))

    completionHandler{   

    BOOL haveNewContent = NO;

    [self fetchNewsItems:&haveNewContent];  

    if (haveNewContent){

        completionHandler(UIBackgroundFetchResultNewData); // 成功获取到新数据

    } else {              // UIBackgroundFetchResultFailed 失败

        completionHandler(UIBackgroundFetchResultNoData); // 没有新数据

    }  

}

//参数BOOL带*,表示作为地址存值 

//模拟从服务器获取数据,若是0则无数据,1为有数据

- (void) fetchNewsItems:(BOOL *)paramFetchedNewItems{    

    if (arc4random_uniform(2) != 1){  //arc4random_uniform(n): [0,n) 随机数

        if (paramFetchedNewItems != nil){

            *paramFetchedNewItems = NO;

        }

        return;

    }   

    [self  willChangeValueForKey:@"allNewsItems"]; //KVO模式 willChangeValueForKey -> didChangeValueForKey

    NewsItem *item = [[NewsItem alloc] init];

    item.date = [NSDate date];

    item.text = [NSString stringWithFormat:@"News text %lu",

                 (unsigned long)self.allNewsItems.count + 1];

    [self.allNewsItems addObject:item];    

    if (paramFetchedNewItems != nil){

        *paramFetchedNewItems = YES;

    }    

    [self  didChangeValueForKey:@"allNewsItems"];   

}

.....

@end


  启动界面 - TableViewController.h

@interface TableViewController : UITableViewController

@end


  -TableViewController.m

#import "TableViewController.h"

#import "AppDelegate.h"

#import "NewsItem.h"

@interface TableViewController ()

@property (nonatomic, weak) NSArray *allNewsItems; //注意,这里是用weak

@property (nonatomic, assign) BOOL mustReloadView;

@end

@implementation TableViewController

- (void)viewDidLoad

{

    [super viewDidLoad];   

    AppDelegate *appDelegate = [UIApplication  sharedApplication].delegate;

    self.allNewsItems = appDelegate.allNewsItems;  //因为是weak,所以若appDelegate.allNewsItems后续指向空时,self.allNewsItems也随之

    //注册以接收KVO通知   

    [appDelegate addObserver:self

                  forKeyPath:@"allNewsItems"

                     options:NSKeyValueObservingOptionNew

                     context:NULL];    

    [[NSNotificationCenter defaultCenter] addObserver:self

                                             selector:@selector(handleAppIsBroughtToForeground:)

                                                 name:UIApplicationWillEnterForegroundNotification

                                               object:nil];

}

//当keyPath对应的值改变时。。必须先注册(addObserver:forKeyPath:options:context)

//在AppDelegate.m文件中fetchNewsItems时,有didChangeValueForKey,所以在值改变时此处会执行

- (void) observeValueForKeyPath:(NSString *)keyPath

                       ofObject:(id)object

                         change:(NSDictionary *)change

                        context:(void *)context{    

    if ([keyPath isEqualToString:@"allNewsItems"]){

        if ([self isBeingPresented]){

            [self.tableView reloadData];

        } else {

            self.mustReloadView = YES;

        }

    }   

}

- (void) handleAppIsBroughtToForeground:(NSNotification *)paramNotification{

    if (self.mustReloadView){

        self.mustReloadView = NO;

        [self.tableView reloadData];

    }

}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return self.allNewsItems.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    

    static NSString *CellIdentifier = @"Cell";    

    UITableViewCell *cell = [tableView

                             dequeueReusableCellWithIdentifier:CellIdentifier

                             forIndexPath:indexPath];    

    NewsItem *newsItem = self.allNewsItems[indexPath.row];   

    cell.textLabel.text = newsItem.text;   

    return cell;

}

//取消相关注册

- (void) dealloc{

    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

    [appDelegate removeObserver:self forKeyPath:@"allNewsItems"];

    [[NSNotificationCenter defaultCenter] removeObserver:self];

}

@end




Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值