实现思路:

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!=) {
// 取到已经点赞的那一行
BmobObject *zanObj = array[];
// 用户取消点赞或者点赞
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 = ;
[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开发-项目实战-点赞功能的实现的更多相关文章

  1. iOS开发项目实战——Swift实现图片轮播与浏览

    近期開始开发一个新的iOS应用,自己决定使用Swift.进行了几天之后,发现了一个非常严峻的问题.那就是无论是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是 ...

  2. iOS开发项目实战——Swift实现ScrollView滚动栏功能

    手机作为一个小屏设备,须要显示的信息往往无法在一个屏幕上显示,此时就须要使用到滚动栏,当然除了像TableView这样能够自带滚动功能的. 假设一个界面上View较多,那就必须要使用到ScrollVi ...

  3. iOS开发——项目实战总结&经典错误一

    经典错误一 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7, VA 运行报错 出现的原因:armv7s ...

  4. iOS开发——项目实战总结&Block使用注意点浅析

    Block使用注意点浅析 1.在使用block前需要对block指针做判空处理. 不判空直接使用,一旦指针为空直接产生崩溃. if (!self.isOnlyNet) { if (succBlock ...

  5. iOS开发——项目实战总结&带你看看Objective-C的精髓

    带你看看Objective-C的精髓 1:接口与实现 @interface...@end @implementation...@end @class 接口(头文件) 实现文件 向前引用 注:类别通过增 ...

  6. iOS开发——项目实战总结&关于随机量

    关于随机量 rand 是一个标准的 C 函数. random 是定义为 POSIX 标准的一部分. arc4random 是在 BSD 和派生平台. 随机数 arc4random_uniform(N) ...

  7. iOS开发——项目实战总结&数据持久化分析

    数据持久化分析 plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 当存储大块数据时你会怎么做? 你有很多选择,比 ...

  8. iOS开发——项目实战OC篇&类QQ黏性按钮(封装)

    类QQ粘性按钮(封装) 那个,先来说说原理吧: 这里原理就是,在界面设置两个控件一个按钮在上面,一个View在下面(同样大小),当我们拖动按钮的时候显示下面的View,view不移动,但是会根据按钮中 ...

  9. C# Xamarin移动开发项目实战篇

    一.课程介绍 在前面阿笨的<C# Xamarin移动开发基础进修篇>课程中,大家已经熟悉和了解了Xamarin移动App开发的基础知识和原理.本次分享课<C# Xamarin移动开发 ...

随机推荐

  1. Python爬虫:一些常用的爬虫技巧总结

    爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情. 1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com&qu ...

  2. 通过java输出当前系统时间

    获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowString ...

  3. 课时8—弹窗modal

    首先弹窗的实现效果如下: 主要实现的代码如下: CSS: .header,.footer,.wrap-page{ position:absolute; left:; right:; backgroun ...

  4. 使用Jsoup 抓取页面的数据

    需要使用的是jsoup-1.7.3.jar包   如果需要看文档我下载请借一步到官网:http://jsoup.org/ 这里贴一下我用到的 Java工程的测试代码 package com.javen ...

  5. select document library from certain list 分类: Sharepoint 2015-07-05 07:52 6人阅读 评论(0) 收藏

    S using System; using Microsoft.SharePoint; namespace Test { class ConsoleApp { static void Main(str ...

  6. python操作excel表格详解(xlrd/xlwt)

    http://www.2cto.com/kf/201501/373655.html http://blog.csdn.net/b_h_l/article/details/17001395 利用pyth ...

  7. AngularJS拦截器

    AngularJS是通过拦截器提供了一个全局层面对响应进行处理的途径.拦截器实际是$http服务的基础中间件,用来向应用的业务流程中注入新的逻辑,其核心是服务工厂,通过向 $httpProvider. ...

  8. C#面向对象学习笔记概要

    1.面向对象不是取代面向过程的. 2.面向对象的三个特性:封装.继承.多态. 3.字段.方法.属性(后面讲)都可以叫做类的成员,他们都需要定义访问级别.访问级别的用处在于控制成员在哪些地方可以被访问, ...

  9. 4、android之actionbar用法

    转: 上:http://blog.csdn.net/yuzhiboyi/article/details/32709833 下:http://blog.csdn.net/yuzhiboyi/articl ...

  10. IOS演变史

    我是从iOS5开始接触iPhone操作系统,对此系统也算是有爱有恨,今天从网上整理以下整个iOS发展的历史,了解了解也算做以后闲时讨论的一个话题. 电脑需要操作系统,手机也需要,2007年,苹果带着旗 ...