实现思路:

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. netbean快捷键

    1.Application应用程序的参数args的设置,在Build->Set Main Projects Configuration 2.程序运行快捷键F6 3.@Deprecated 4.代 ...

  2. python新技能get——看!源!码!

    上节课一起看了一下ThreadingTCPserver和tornado的源码,真是心力交瘁...后来仔细的想了一下,看懂源码其实并不难,只是需要明确一些以前我们学习过但是却容易被忽视的概念! 再看继承 ...

  3. Visual Studio 如何恢复默认设置

    我们在使用 Visual Studio 的时候,常常有一些窗口不见了又弄不回来的情况,如何恢复默认设置呢? 1.点击“开始-->程序-->Microsoft Visual Studio20 ...

  4. jQuery水平下拉菜单实现

    <!DOCTYPE html> <html>    <head>       <title>jQuery水平下拉菜单实现</title>   ...

  5. DateFomrat Mask in ASPxTextbox increases width ,How to disable display of dxeErrorCell on ASPxTextBox

    让ASPxTextbox显示yyyy-MM-dd, 需设置 <MaskSettings Mask="yyyy-MM-dd" />.但是会导致ASPxTextbox宽度变 ...

  6. SQL SERVER CURSOR游标的使用(转载)

    一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据 ...

  7. Linux定时器相关源码分析

    Linux的定时器使用时间轮算法.数据结构不难理解,核心数据结构与散列表及其相似,甚至可以说,就是散列表.事实上,理解其散列表的本质,有助于对相关操作的理解. 数据结构 这里先列出一些宏,稍后解释: ...

  8. Learning with Trees

    We are now going to consider a rather different approach to machine learning, starting with one of t ...

  9. General Motors China

    General Motors Co., one of the world's largest automakers, trace its root back to 1908. The General ...

  10. LNMP安装一键安装包

    系统需求: CentOS/Debian/Ubuntu Linux系统 需要2GB以上硬盘剩余空间 128M以上内存,OpenVZ的建议192MB以上(小内存请勿使用64位系统) VPS或服务器必须已经 ...