IOS开发-项目实战-点赞功能的实现

实现思路:

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.

 1 #pragma mark----------------网络数据下载-----------------------
 2 -(NSArray *)allmodelNew{
 3 //    每次调用该方法初始化点赞数组,保证每条新闻的数据互不影响。
 4     zan = [NSMutableArray array];//由于数据下载是异步下载,所以点赞和其他数据各用一个可变数据存放数据
 5     NSString *className = @"CampusNews";
 6     NSMutableArray *all = [NSMutableArray array];
 7     BmobQuery *quer = [BmobQuery queryWithClassName:className];
 8     [quer orderByDescending:@"updatedAt"];
 9     quer.limit = 3;
10     [quer findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
11
12         for (BmobObject *data in array) {
13 //            用一个Newmodel模型来装载数据
14             Newmodel *info    = [[Newmodel alloc] init];
15             if ([data objectForKey:@"name"]) {
16                 info.name    = [data objectForKey:@"name"];
17             }
18             if ([data objectForKey:@"text"]) {
19                 info.text  = [data objectForKey:@"text"];
20             }
21             info.time   = [dateformatter stringFromDate:data.updatedAt];
22             info.ID = data.objectId;
23  #pragma mark---------------点赞计算--------------------------
24 //            查找点赞个数
25             BmobQuery *query = [BmobQuery queryWithClassName:@"dian_zan"];
26 //            查找该账号的所有点赞数据(并且全部是YES的数据)
27             [query whereKey:@"newsID" equalTo:data.objectId];
28             [query whereKey:@"dianzan" equalTo:@(YES)];
29             [query findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
30 //                可变数组zan
31                 [zan addObject:@(array.count)];
32
33             }];
34
35             [all addObject:info];
36         }
37         _allmodelNews = all;
38         if (_allmodelNews.count == _allmodelNews.count) {
39             [Mytabview.footer endRefreshing];
40         }
41
42         [self performSelectorOnMainThread:@selector(upDateUI) withObject:nil waitUntilDone:YES];
43            }];
44        return _allmodelNews;
45 }
时间: 2024-10-23 22:41:22

IOS开发-项目实战-点赞功能的实现的相关文章

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

最近开始开发一个新的iOS应用,自己决定使用Swift,进行了几天之后,发现了一个很严峻的问题,那就是不管是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是找到Swift的资源,一看,大概是半年前的代码,或是一年前的代码,一运行,全都报错.这是由于毕竟Swift还是在不断发展完善当中,随着Swift2.0的开源以来,包括发布Swift这一年多以来,Swift的改动还是很大的,很多的接口或是语法前后有较大差异.有些功能只能自己硬生生看官方文档或挤破脑子想,

iOS开发项目实战——Swift实现ScrollView滚动条功能

手机作为一个小屏设备,需要显示的信息往往无法在一个屏幕上显示,此时就需要使用到滚动条,当然除了像TableView这样可以自带滚动功能的.如果一个界面上View较多,那就必须要使用到ScrollView了.现在我们将会使用Swift在iOS上实现滚动效果.具体实现如下: (1)创建一个新的iOS项目,语言选择Swift,并在Main.storyboard中拖入一个ScrollView控件.然后在ScrollView中拖入几张照片,等下可以使用滚动功能查看照片,界面如下: . (2)把Scroll

iOS开发——项目实战总结&类微信朋友圈发动态功能初步-图片与视频上传

类微信朋友圈发动态功能初步-图片与视频上传 最近在做一个新的项目,涉及到了关于图片和视频上传和显示的功能,研究了一段时间,总结一下. 使用AFNetworking上传图片(可一次上传多张图片,包含不同类型png, jpeg)和视频 1 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 2 3 AFHTTPRequestOperation *operation = [manager P

iOS开发——项目实战技术OC篇&XMPP简单总结

XMPP简单总结 最近面试被问到了一个问题,笔者当时就懵了:什么XMPP,平时怎么使用,使用过程中遇到什么问题?. 但是还是通过记忆,简单的说了一下自己所知道了,不过那并没有撒卵用,所以你懂的 XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开发. 1.关于连接的 1 //此方法在stream开始连接服务器的时候调用 2 - (void)xmppS

iOS开发——项目实战Swift篇&swift 2.0项目开发总结二(开发常用)

swift 2.0项目开发总结二(开发常用) 一:相册中选择相片到App指定位置 随 着相机像素的提高,实际用户选择的图片都是很大的,有的高达5.6M,如果直接使用用户选着的图片,非常消耗内存,并且也用不到这么高像素的图片,可以当 用户选着好图片后,在UIImagePickerController对应的代理方法中,先将图片进行重新绘制为需要的大小,在设置给iconView 1 /// MARK: 摄像机和相册的操作和代理方法 2 extension MeViewController: UIIma

iOS开发——项目实战总结&警告消除

警告消除 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作.其实大部分的警告都是很好改的,把自己整个项目的警告撸一遍应该也就耗费半小时的时间,一次麻烦带来之后的清净这样不好么? 本文分为三个部分: 1.简单粗暴的消除警告. 2.详细科学的消除警告.(包括警告收录) 3.添加警告. 一.简单粗暴的消除警告 警告如果是自己项目中的还好直接改了,如果是第三方库,你改了之后,pod下作者更新一下又白

iOS开发——项目实战Swift篇&swift 2.0项目开发总结一(开发常用)

swift 2.0项目开发总结一(开发常用) 一:新特性(版本判断)的实现 1 let versionStr = "CFBundleShortVersionString" 2 let cureentVersion = NSBundle.mainBundle().infoDictionary![versionStr] as! String 3 let oldVersion = (NSUserDefaults.standardUserDefaults().objectForKey(vers

iOS开发——项目实战总结&UITableView性能优化与卡顿问题

UITableView性能优化与卡顿问题 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell.如果重用cell,为cell创建一个ID 每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到一个自定义类,初始化时就布局好

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

经典错误一 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7, VA 运行报错 出现的原因:armv7s是应用在iPhone 5 A6 的架构上的 解决的方式: 1,在Project target里“Architectures”设置为“Standard (armv7,armv7s)” 2,修改在Project target里“Build Settings”的“Valid Architectures”添