目前已经完成的功能有对RSS的解析和Atom解析,RSS内容本地数据库存储和读取,抓取中状态进度展示,标记阅读状态,标记全部已读等。这些功能里我对一些异步操作产生的数据采用了ReactiveCocoa来对数据流向进行了控制,下面我来说下如何运用RAC来进行的开发。
初始时读取本地存储首页列表数据,过滤无效数据,监听列表数据变化进行列表更新
这里会用到RAC这个宏可以方便的来进行键值和信号的绑定,RACObserve这个宏方便的进行键值变化的监听处理。具体实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
@weakify(self); //首页列表数据赋值,过滤无效数据 RAC(self, feeds) = [[[SMDB shareInstance] selectAllFeeds] filter:^BOOL(NSMutableArray *feedsArray) { if (feedsArray.count > 0) { return YES; } else { return NO; } }]; //监听列表数据变化进行列表更新 [RACObserve(self, feeds) subscribeNext:^(id x) { @strongify(self); [self.tableView reloadData]; }]; //本地读取首页订阅源数据 - (RACSignal *)selectAllFeeds { @weakify(self); return [RACSignal createSignal:^RACDisposable *(id subscriber) { @strongify(self); FMDatabase *db = [FMDatabase databaseWithPath:self.feedDBPath]; if ([db open]) { FMResultSet *rs = [db executeQuery:@"select * from feeds"]; NSUInteger count = 0; NSMutableArray *feedsArray = [NSMutableArray array]; while ([rs next]) { SMFeedModel *feedModel = [[SMFeedModel alloc] init]; feedModel.fid = [rs intForColumn:@"fid"]; feedModel.title = [rs stringForColumn:@"title"]; feedModel.link = [rs stringForColumn:@"link"]; feedModel.des = [rs stringForColumn:@"des"]; feedModel.copyright = [rs stringForColumn:@"copyright"]; feedModel.generator = [rs stringForColumn:@"generator"]; feedModel.imageUrl = [rs stringForColumn:@"imageurl"]; feedModel.feedUrl = [rs stringForColumn:@"feedurl"]; feedModel.unReadCount = [rs intForColumn:@"unread"]; [feedsArray addObject:feedModel]; count++; } [subscriber sendNext:feedsArray]; [subscriber sendCompleted]; [db close]; } return nil; }]; } |
通过网络获取订阅源最新内容,获取后进行本地存储,转成显示用的model进行列表的显示
这里的异步操作比较多,而且为了尽快取得数据采用的是并行队列,需要准确的获取到每个源完成的状态,包括解析的完成,本地存储完成,全部获取完成等数据完成情况。具体使用RAC方式的代码如下:
1 2 3 4 5 6 7 8 9 AC来进行的开发。
初始时读取本地存储首页列表数据,过滤无效数据,监听列表数据变化进行列表更新这里会用到RAC这个宏可以方便的来进行键值和信号的绑定,RACObserve这个宏方便的进行键值变化的监听处理。具体实现代码如下:
通过网络获取订阅源最新内容,获取后进行本地存储,转成显示用的model进行列表的显示这里的异步操作比较多,而且为了尽快取得数据采用的是并行队列,需要准确的获取到每个源完成的状态,包括解析的完成,本地存储完成,全部获取完成等数据完成情况。具体使用RAC方式的代码如下:
|