IOS开发-项目实战-点赞功能的实现
2015-09-17 22:49
666 查看
实现思路:
1.每一条新闻就是一个cell,在cell上添加点赞按钮。
2.让cell的控制器成为自定义cell的代理,将点击了哪一个cell放在代理方法中传出去。
3.并将这条新闻的ID和当前用户的ID上传服务器。
4.此时要考虑每个用户只能点击一次,且当用户再次点击的时候,取消点赞(定义一个BOOL变量存储用户的点击次数)。则将上传的数据取出来,做判断,如果取出来有数据,说明用户点击过,没有数据那就存储到网络。再次点击,将请求下来的数据,即BOOL变量存储为NO,即取消点赞。
5.到这里就要考虑取出所有用户点击此条新闻的数据怎样赋值给cell?也就是和取其他数据一起取出,这样保证每条新闻对应数据量一直,然后一起赋值给cell,这样就完成了这项功能。
部分重点代码实现:(bmob)
在cell的代理方法中:
-(void)TableViewForCell:(News_TableViewCell *)cell andbutton:(UIButton *)button{ // 获得点击了那一行 NSIndexPath *indexPath = [Mytabview indexPathForCell:cell]; NSString *className = @"dian_zan"; Newmodel *news = _allmodelNews[indexPath.row]; BmobObject *data = [[BmobObject alloc] initWithClassName:className]; // 获得当前用户 BmobUser *user = [BmobUser getCurrentUser]; BmobQuery *query = [BmobQuery queryWithClassName:className]; // 两个判断条件,用户的ID和此条新闻的ID作判断 [query whereKey:@"newsID" equalTo:news.ID]; [query whereKey:@"userID" equalTo:user.objectId]; [query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) { NSLog(@"error == %@",error); // 用户点击过 if (array.count!=0) { // 取到已经点赞的那一行 BmobObject *zanObj = array[0]; // 用户取消点赞或者点赞 BOOL zann = [[zanObj objectForKey:@"dianzan"] boolValue]==NO?YES:NO; BmobObject *data = [BmobObject objectWithoutDatatWithClassName:className objectId:zanObj.objectId]; // 最终结果上传云端 [data setObject:@(zann) forKey:@"dianzan"]; [data updateInBackgroundWithResultBlock:^(BOOL isSuccessful, NSError *error) { if (!error) { } }]; }else{ // 用户没有点击过的话,就保存用户点赞 [data setObject:user.objectId forKey:@"userID"]; [data setObject:news.ID forKey:@"newsID"]; [data setObject:@(YES) forKey:@"dianzan"]; // [data setObject:@(indexPath.row) forKey:@"row"]; [data saveInBackgroundWithResultBlock:^(BOOL isSuccessful, NSError *error) { NSLog(@"tijiao == %@",error); if (!error) { } }]; } }]; }
处理网络数据,将网络数据赋值给对应的cell.
#pragma mark----------------网络数据下载----------------------- -(NSArray *)allmodelNew{ // 每次调用该方法初始化点赞数组,保证每条新闻的数据互不影响。 zan = [NSMutableArray array];//由于数据下载是异步下载,所以点赞和其他数据各用一个可变数据存放数据 NSString *className = @"CampusNews"; NSMutableArray *all = [NSMutableArray array]; BmobQuery *quer = [BmobQuery queryWithClassName:className]; [quer orderByDescending:@"updatedAt"]; quer.limit = 3; [quer findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) { for (BmobObject *data in array) { // 用一个Newmodel模型来装载数据 Newmodel *info = [[Newmodel alloc] init]; if ([data objectForKey:@"name"]) { info.name = [data objectForKey:@"name"]; } if ([data objectForKey:@"text"]) { info.text = [data objectForKey:@"text"]; } info.time = [dateformatter stringFromDate:data.updatedAt]; info.ID = data.objectId; #pragma mark---------------点赞计算-------------------------- // 查找点赞个数 BmobQuery *query = [BmobQuery queryWithClassName:@"dian_zan"]; // 查找该账号的所有点赞数据(并且全部是YES的数据) [query whereKey:@"newsID" equalTo:data.objectId]; [query whereKey:@"dianzan" equalTo:@(YES)]; [query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) { // 可变数组zan [zan addObject:@(array.count)]; }]; [all addObject:info]; } _allmodelNews = all; if (_allmodelNews.count == _allmodelNews.count) { [Mytabview.footer endRefreshing]; } [self performSelectorOnMainThread:@selector(upDateUI) withObject:nil waitUntilDone:YES]; }]; return _allmodelNews; }
相关文章推荐
- iOS Block语法 基础介绍1 浅谈(void(^MyBlock)()=^) oc block
- iOS激情详解之异步请求图片加载
- iOS开发之属性、单例、代理、通知传值比较
- ios 第三方支付
- iOS国际化---跟随系统语言
- iOS激情详解之json解析
- iOS开发 大文件下载(支持断点下载)
- iOS疯狂讲解之手势识别器
- iOS开发中 new与alloc/init的区别 及 [NSArray array] 和 [[NSArray alloc]init] 及 self. 和 _ 的区别
- [置顶] iOS中copy和mutableCopy的详细分析
- IOS 使代码在ARC和MRC环境编译通用
- iOS 中TextKit的使用中,设置部分字体,出现的问题及解决方法
- IOS GDC实现单例写法ARC与MRC
- IOS--Quartz2D绘图绘制小黄人
- iOS应用开发-地图定位
- IOS--Quartz2D绘图
- JSON TO NSDictionary Mac & iOS
- IOS征途之三 分类与协议(二)
- ios 爱行华夏 技术支持
- iOS开发-获取设备电量