Skip to content

Commit

Permalink
首页更新数据调整,支持版本添加新源时能够自动增加到本地
Browse files Browse the repository at this point in the history
  • Loading branch information
daiming committed Sep 8, 2016
1 parent ee1bdaf commit 35eaae2
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 38 deletions.
35 changes: 31 additions & 4 deletions GCDFetchFeed/GCDFetchFeed/AppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#import "AppDelegate.h"

#import "SMRootViewController.h"
#import "SMFeedListViewController.h"
#import "SMStyle.h"

@interface AppDelegate ()
Expand All @@ -21,16 +22,42 @@ @implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
SMRootViewController *rootVC = [[SMRootViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:rootVC];
UINavigationController *homeNav = [self styleNavigationControllerWithRootController:rootVC];
UITabBarItem *homeTab = [[UITabBarItem alloc] initWithTitle:@"频道" image:nil tag:1];
homeTab.titlePositionAdjustment = UIOffsetMake(0, -20);
homeNav.tabBarItem = homeTab;


SMFeedListViewController *feedListVC = [[SMFeedListViewController alloc] init];
UINavigationController *listNav = [self styleNavigationControllerWithRootController:feedListVC];
UITabBarItem *listTab = [[UITabBarItem alloc] initWithTitle:@"列表" image:nil tag:2];
listTab.titlePositionAdjustment = UIOffsetMake(0, -18);
listNav.tabBarItem = listTab;

UITabBarController *tabBarC = [[UITabBarController alloc]initWithNibName:nil bundle:nil];
tabBarC.tabBar.tintColor = [SMStyle colorPaperBlack];
tabBarC.tabBar.barTintColor = [SMStyle colorPaperDark];
UIView *shaowLine = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(tabBarC.tabBar.frame), 0.5)];
shaowLine.backgroundColor = [UIColor colorWithHexString:@"D8D7D3"];
[tabBarC.tabBar addSubview:shaowLine];
tabBarC.tabBar.shadowImage = [UIImage new];
tabBarC.tabBar.clipsToBounds = YES;
tabBarC.viewControllers = @[homeNav,listNav];

self.window.rootViewController = tabBarC;
[self.window makeKeyAndVisible];
return YES;
}

- (UINavigationController *)styleNavigationControllerWithRootController:(UIViewController *)vc {
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
nav.navigationBar.tintColor = [SMStyle colorPaperBlack];
nav.navigationBar.barTintColor = [SMStyle colorPaperDark];
UIView *shaowLine = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetHeight(nav.navigationBar.frame), CGRectGetWidth(nav.navigationBar.frame), 0.5)];
shaowLine.backgroundColor = [UIColor colorWithHexString:@"D8D7D3"];
[nav.navigationBar addSubview:shaowLine];
nav.navigationBar.translucent = NO;
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
return nav;
}


Expand Down
4 changes: 2 additions & 2 deletions GCDFetchFeed/GCDFetchFeed/SMArticleViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ - (void)viewDidLoad {
NSError *err = nil;
NSString *feedString = [NSString stringWithFormat:@"%@<p><a href=\"%@\">阅读原文</a></p>",self.feedItemModel.des,self.feedItemModel.link];
NSString *styleString = [NSString stringWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"css.html"] encoding:NSUTF8StringEncoding error:&err];
self.feedItemModel.des = [NSString stringWithFormat:@"%@%@",styleString,feedString];
NSData *data = [self.feedItemModel.des dataUsingEncoding:NSUTF8StringEncoding];
NSString *articleString = [NSString stringWithFormat:@"%@%@",styleString,feedString];
NSData *data = [articleString dataUsingEncoding:NSUTF8StringEncoding];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithHTMLData:data documentAttributes:nil];
self.articleView.attributedString = attrString;
//算高
Expand Down
4 changes: 2 additions & 2 deletions GCDFetchFeed/GCDFetchFeed/SMDB.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@
- (RACSignal *)insertWithFeedModel:(SMFeedModel *)feedModel; //插入feed内容
- (RACSignal *)selectAllFeeds; //读取所有feeds
- (RACSignal *)selectFeedItemsWithPage:(NSUInteger)page fid:(NSUInteger)fid;
- (RACSignal *)markFeedItemAsRead:(NSUInteger)iid;
- (RACSignal *)markFeedAllItemsAsRead:(NSUInteger)fid;
- (RACSignal *)markFeedItemAsRead:(NSUInteger)iid; //标注已读
- (RACSignal *)markFeedAllItemsAsRead:(NSUInteger)fid; //标注全部已读
@end
39 changes: 28 additions & 11 deletions GCDFetchFeed/GCDFetchFeed/SMDB.m
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,19 @@ - (instancetype)init {
if ([[NSFileManager defaultManager] fileExistsAtPath:_feedDBPath] == NO) {
FMDatabase *db = [FMDatabase databaseWithPath:_feedDBPath];
if ([db open]) {
NSString *createSql = @"create table feeds (fid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, title text, link text, des text, copyright text, generator text, imageurl text, feedurl text, unread integer, updatetime integer)";
/*
unread:未读数
updatetime:最后更新时间用来排序
ishide:是否隐藏,0表示显示,1表示不显示
*/
NSString *createSql = @"create table feeds (fid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, title text, link text, des text, copyright text, generator text, imageurl text, feedurl text, unread integer, updatetime integer, ishide integer)";
[db executeUpdate:createSql];
NSString *createItemSql = @"create table feeditem (iid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, fid integer, link text, title text, author text, category text, pubdate text, des blob, isread integer)";
/*
des:正文内容
isread:是否点开查看过,0表示没看过,1表示看过
thumbnails:图片集,各个图片地址使用|作为分隔符
*/
NSString *createItemSql = @"create table feeditem (iid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, fid integer, link text, title text, author text, category text, pubdate text, des blob, isread integer, thumbnails text)";
[db executeUpdate:createItemSql];
}
}
Expand All @@ -64,7 +74,7 @@ - (RACSignal *)insertWithFeedModel:(SMFeedModel *)feedModel {

} else {
//不存在创建一个,同时返回fid
[db executeUpdate:@"insert into feeds (title, link, des, copyright, generator, imageurl, feedurl) values (?, ?, ?, ?, ?, ?, ?)", feedModel.title, feedModel.link, feedModel.des, feedModel.copyright, feedModel.generator, feedModel.imageUrl, feedModel.feedUrl];
[db executeUpdate:@"insert into feeds (title, link, des, copyright, generator, imageurl, feedurl, ishide) values (?, ?, ?, ?, ?, ?, ?, ?)", feedModel.title, feedModel.link, feedModel.des, feedModel.copyright, feedModel.generator, feedModel.imageUrl, feedModel.feedUrl, @(0)];

FMResultSet *fidRsl = [db executeQuery:@"select fid from feeds where feedurl = ?",feedModel.feedUrl];
if ([fidRsl next]) {
Expand Down Expand Up @@ -115,7 +125,7 @@ - (RACSignal *)selectAllFeeds {
@strongify(self);
FMDatabase *db = [FMDatabase databaseWithPath:self.feedDBPath];
if ([db open]) {
FMResultSet *rs = [db executeQuery:@"select * from feeds order by updatetime desc"];
FMResultSet *rs = [db executeQuery:@"select * from feeds where ishide = ? order by updatetime desc",@(0)];
NSUInteger count = 0;
NSMutableArray *feedsArray = [NSMutableArray array];
while ([rs next]) {
Expand Down Expand Up @@ -147,7 +157,7 @@ - (RACSignal *)selectFeedItemsWithPage:(NSUInteger)page fid:(NSUInteger)fid {
FMDatabase *db = [FMDatabase databaseWithPath:self.feedDBPath];
if ([db open]) {
//分页获取
FMResultSet *rs = [db executeQuery:@"select * from feeditem where fid = ? and isread = ? order by iid desc limit ?, 20",@(fid), @(0), @(page * 20)];
FMResultSet *rs = [db executeQuery:@"select * from feeditem where fid = ? and isread = ? order by iid desc limit ?, 50",@(fid), @(0), @(page * 50)];
NSUInteger count = 0;
NSMutableArray *feedItemsArray = [NSMutableArray array];
//设置返回Array里的Model
Expand Down Expand Up @@ -177,7 +187,6 @@ - (RACSignal *)selectFeedItemsWithPage:(NSUInteger)page fid:(NSUInteger)fid {
return nil;
}];
}
//标注已读
- (RACSignal *)markFeedItemAsRead:(NSUInteger)iid {
@weakify(self);
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
Expand All @@ -192,16 +201,14 @@ - (RACSignal *)markFeedItemAsRead:(NSUInteger)iid {
return nil;
}];
}

//标注全部已读
- (RACSignal *)markFeedAllItemsAsRead:(NSUInteger)fid {
@weakify(self);
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
@strongify(self);
FMDatabase *db = [FMDatabase databaseWithPath:self.feedDBPath];
if ([db open]) {
[db executeUpdate:@"update feeditem set isread = ? where fid = ?", @(1), @(fid)];

[db executeUpdate:@"update feeds set unread = ? where fid = ?",@0,@(fid)]; //更新feeds表里未读数
FMResultSet *rs = [db executeQuery:@"select iid from feeditem where fid = ? order by iid asc",@(fid)];
NSUInteger count = 0;
while ([rs next]) {
Expand All @@ -219,7 +226,17 @@ - (RACSignal *)markFeedAllItemsAsRead:(NSUInteger)fid {
return nil;
}];
}


//是否取消订阅
- (RACSignal *)isHideFeed:(BOOL)hide {
@weakify(self);
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
@strongify(self);
FMDatabase *db = [FMDatabase databaseWithPath:self.feedDBPath];
if ([db open]) {
//
}
return nil;
}];
}

@end
4 changes: 1 addition & 3 deletions GCDFetchFeed/GCDFetchFeed/SMFeedListCell.m
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,12 @@ - (void)buildUI {
make.left.right.top.bottom.equalTo(self);
}];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self).offset([SMStyle floatMarginMassive]);
make.left.top.equalTo(self).offset([SMStyle floatMarginNormal]);
}];
[self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.titleLabel);
make.top.equalTo(self.titleLabel.mas_bottom).offset([SMStyle floatTextIntervalHorizontal]);
make.bottom.equalTo(self);
}];

}

#pragma mark - Interface
Expand Down
32 changes: 21 additions & 11 deletions GCDFetchFeed/GCDFetchFeed/SMFeedListViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ - (instancetype)initWithFeedModel:(SMFeedModel *)feedModel {
if (self = [super init]) {
self.feedModel = feedModel;
self.page = 0;

}
return self;
}
Expand Down Expand Up @@ -81,16 +80,20 @@ - (void)selectFeedItems {
subscribeOn:scheduler]
deliverOn:[RACScheduler mainThreadScheduler]]
subscribeNext:^(NSMutableArray *x) {
@strongify(self);
if (self.listData.count > 0) {
//进入时加载
[self.listData addObjectsFromArray:x];
} else {
//加载更多
self.listData = x;
}
//刷新
[self.tableView reloadData];
@strongify(self);
self.tableView.mj_footer.hidden = NO;
if (self.listData.count > 0) {
//加载更多
[self.listData addObjectsFromArray:x];
} else {
//进入时加载
self.listData = x;
if (self.listData.count < 50) {
self.tableView.mj_footer.hidden = YES;
}
}
//刷新
[self.tableView reloadData];
} error:^(NSError *error) {
//处理无数据的显示
[self.tableView.mj_footer endRefreshingWithNoMoreData];
Expand Down Expand Up @@ -190,6 +193,13 @@ - (UITableView *)tableView {
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
//mj
_tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(selectFeedItems)];
MJRefreshAutoNormalFooter *footer = (MJRefreshAutoNormalFooter *)_tableView.mj_footer;
footer.stateLabel.font = [SMStyle fontSmall];
footer.stateLabel.textColor = [SMStyle colorPaperGray];
[footer setTitle:@"上拉读取更多" forState:MJRefreshStateIdle];
[footer setTitle:@"正在读取..." forState:MJRefreshStateRefreshing];
[footer setTitle:@"已读取完毕" forState:MJRefreshStateNoMoreData];

}
return _tableView;
}
Expand Down
10 changes: 7 additions & 3 deletions GCDFetchFeed/GCDFetchFeed/SMNetManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,15 @@ - (RACSignal *)fetchAllFeedWithModelArray:(NSMutableArray *)modelArray {
dispatch_group_enter(group);
SMFeedModel *feedModel = modelArray[i];
dispatch_async(fetchFeedQueue, ^{
@strongify(self);
[self GET:feedModel.feedUrl parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
// NSString *xmlString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
// NSLog(@"Data: %@", xmlString);
// NSLog(@"%@",feedModel);
//解析feed
self.feeds[i] = [self.feedStore updateFeedModelWithData:responseObject preModel:feedModel];
//入库存储
SMDB *db = [[SMDB alloc] init];
[[db insertWithFeedModel:self.feeds[i]] subscribeNext:^(NSNumber *x) {
[[[SMDB shareInstance] insertWithFeedModel:self.feeds[i]] subscribeNext:^(NSNumber *x) {
SMFeedModel *model = (SMFeedModel *)self.feeds[i];
model.fid = [x integerValue];
//插入本地数据库成功后开始sendNext
Expand All @@ -64,7 +64,11 @@ - (RACSignal *)fetchAllFeedWithModelArray:(NSMutableArray *)modelArray {

} failure:^(NSURLSessionTask *operation, NSError *error) {
NSLog(@"Error: %@", error);
dispatch_group_leave(group);
[[[SMDB shareInstance] insertWithFeedModel:self.feeds[i]] subscribeNext:^(NSNumber *x) {
SMFeedModel *model = (SMFeedModel *)self.feeds[i];
model.fid = [x integerValue];
dispatch_group_leave(group);
}];
}];

});//end dispatch async
Expand Down
9 changes: 8 additions & 1 deletion GCDFetchFeed/GCDFetchFeed/SMRootCell.m
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ - (void)buildUI {
make.left.right.top.bottom.equalTo(self);
}];
[self.iconImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self).offset([SMStyle floatMarginMassive]);
make.left.top.equalTo(self).offset([SMStyle floatMarginNormal]);
make.size.mas_equalTo(CGSizeMake(30, 30));
}];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
Expand All @@ -73,6 +73,13 @@ - (void)updateWithViewModel:(SMRootCellViewModel *)viewModel {
self.contentLabel.text = viewModel.contentString;
[self.iconImageView updateWithImageWebUrl:viewModel.iconUrl];
self.highlightLabel.text = viewModel.highlightString;
if ([viewModel.highlightString isEqualToString:@"0"]) {
self.highlightLabel.textColor = [SMStyle colorPaperGray];
self.titleLabel.textColor = [SMStyle colorPaperGray];
} else {
self.highlightLabel.textColor = [SMStyle colorPaperBlack];
self.titleLabel.textColor = [SMStyle colorPaperBlack];
}
self.feedModel = viewModel.feedModel;
}
#pragma mark - Private
Expand Down
43 changes: 42 additions & 1 deletion GCDFetchFeed/GCDFetchFeed/SMRootViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#import "SMNetManager.h"
#import "Ono.h"
#import "Masonry.h"
#import "MJRefresh.h"
#import "SMNotificationConst.h"
#import "SMSubContentLabel.h"

Expand All @@ -20,6 +21,7 @@
#import "SMDB.h"

#import "SMFeedListViewController.h"
#import "UINavigationController+FDFullscreenPopGesture.h"

static NSString *rootViewControllerIdentifier = @"SMRootViewControllerCell";

Expand Down Expand Up @@ -83,6 +85,7 @@ - (void)viewDidLoad {
return NO;
}
}];

//监听列表数据变化进行列表更新
[RACObserve(self, feeds) subscribeNext:^(id x) {
@strongify(self);
Expand All @@ -96,9 +99,9 @@ - (void)viewDidLoad {
@strongify(self);
SMFeedModel *feedModel = (SMFeedModel *)value.second;
SMFeedListViewController *feedList = [[SMFeedListViewController alloc] initWithFeedModel:feedModel];
feedList.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:feedList animated:YES];
}];

}

#pragma mark - private
Expand All @@ -121,6 +124,15 @@ - (void)fetchAllFeeds {
self.tableView.tableHeaderView = [[UIView alloc] init];
self.fetchingCount = 0;
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
//下拉刷新关闭
[self.tableView.mj_header endRefreshing];
//更新列表
[self.tableView reloadData];
//检查是否需要增加源
if ([SMFeedStore defaultFeeds].count > self.feeds.count) {
self.feeds = [SMFeedStore defaultFeeds];
[self fetchAllFeeds];
}
}] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(SMFeedModel *feedModel) {
//抓完一个
@strongify(self);
Expand Down Expand Up @@ -171,6 +183,19 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N

return cell;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// SMFeedModel *model = self.feeds[indexPath.row];

}
}
- (NSString *)tableView:(UITableView *)tableView
titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
return @"取消";
}

#pragma mark - Getter
- (SMRootDataSource *)dataSource {
Expand Down Expand Up @@ -201,6 +226,22 @@ - (UITableView *)tableView {
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
UIView *tbFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 50)];
_tableView.tableFooterView = tbFooterView;

//下拉刷新
@weakify(self);
_tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
@strongify(self);
[self fetchAllFeeds];
}];
MJRefreshNormalHeader *header = (MJRefreshNormalHeader *)_tableView.mj_header;
header.lastUpdatedTimeLabel.hidden = YES;
[header.arrowView setImage:[UIImage imageNamed:@""]];
header.stateLabel.font = [SMStyle fontSmall];
header.stateLabel.textColor = [SMStyle colorPaperGray];
[header setTitle:@"下拉更新数据" forState:MJRefreshStateIdle];
[header setTitle:@"松开立刻更新" forState:MJRefreshStatePulling];
[header setTitle:@"更新数据..." forState:MJRefreshStateRefreshing];

}
return _tableView;
}
Expand Down

0 comments on commit 35eaae2

Please sign in to comment.