[iOS微博项目 - 2.6] - 获取微博数据

github: https://github.com/hellovoidworld/HVWWeibo

 

A.新浪获取微博API

1.读取微博API

2.“statuses/home_timeline”接口

B.在app中获取微博数据

1.在“首页”控制器发送请求,获取json数据

 1 /** 加载微博数据 */
 2 - (void) loadWeiboData {
 3     // 创建AFNetworking的http操作中管理器
 4     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 5
 6     // 设置参数
 7     NSMutableDictionary *param = [NSMutableDictionary dictionary];
 8     param[@"access_token"] = [HVWAccountInfoTool accountInfo].access_token;
 9
10     // 发送请求
11     [manager GET:@"https://api.weibo.com/2/statuses/home_timeline.json" parameters:param success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
12         HVWLog(@"获取微博数据成功-------%@", responseObject);
13     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
14         HVWLog(@"获取微博数据失败------%@", error);
15     }];
16 }

Output:

获取微博数据成功-------{
statuses = [
{
rid = 0_0_2669621413509583897,
visible = {
type = 0,
list_id = 0
},
original_pic = http://ww1.sinaimg.cn/large/c3ad47bejw1eoygflrel2g201w034q34.gif,
mid = 3806890389487492,
source = <a href="http://app.weibo.com/t/feed/3j6BDx" rel="nofollow">
孔明社交管理</a>,
truncated = 0,
reposts_count = 2,
bmiddle_pic = http://ww1.sinaimg.cn/bmiddle/c3ad47bejw1eoygflrel2g201w034q34.gif,
darwin_tags = [
],

....

2.封装“用户”、“微博”类,用来装载每条微博信息

(1)用户类(包括登陆用户和关注的人)

暂时简单封装几个属性,以后再扩展

 1 //
 2 //  HVWUser.h
 3 //  HVWWeibo
 4 //
 5 //  Created by hellovoidworld on 15/2/5.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface HVWUser : NSObject
12
13 /** 友好显示名称 */
14 @property(nonatomic, strong) NSString *name;
15
16 /** 用户头像地址(中图),50×50像素 */
17 @property(nonatomic, strong) NSString *profile_image_url;
18
19
20 +(instancetype) userWithDict:(NSDictionary *) dict;
21
22 @end
 1 //
 2 //  HVWUser.m
 3 //  HVWWeibo
 4 //
 5 //  Created by hellovoidworld on 15/2/5.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "HVWUser.h"
10
11 @implementation HVWUser
12
13 +(instancetype) userWithDict:(NSDictionary *) dict {
14     HVWUser *user = [[self alloc] init];
15
16     user.name = dict[@"name"];
17     user.profile_image_url = dict[@"profile_image_url"];
18
19     return user;
20 }
21
22 @end

“微博”类

 1 //
 2 //  HVWStatus.h
 3 //  HVWWeibo
 4 //
 5 //  Created by hellovoidworld on 15/2/5.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 #import "HVWUser.h"
11
12 @interface HVWStatus : NSObject
13
14 /** 微博信息内容 */
15 @property(nonatomic, strong) NSString *text;
16
17 /** 微博作者的用户信息字段 详细 */
18 @property(nonatomic, strong) HVWUser *user;
19
20 /** 微博配图地址数组,里面装载的时HVWPic模型 */
21 @property(nonatomic, strong) NSArray *pic_urls;
22
23 + (instancetype) statusWithDict:(NSDictionary *) dict;
24
25 @end
 1 //
 2 //  HVWStatus.m
 3 //  HVWWeibo
 4 //
 5 //  Created by hellovoidworld on 15/2/5.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "HVWStatus.h"
10 #import "HVWUser.h"
11
12 @implementation HVWStatus
13
14 + (instancetype) statusWithDict:(NSDictionary *) dict {
15     HVWStatus *status = [[HVWStatus alloc] init];
16
17     status.text = dict[@"text"];
18     status.user = [HVWUser userWithDict:dict[@"user"]];
19
20     return status;
21 }
22
23 @end

3.在“首页”中显示简单的微博信息

使用SDWebImage加载网络图片

 1 //  HVWHomeViewController.m
 2 /** 加载微博数据 */
 3 - (void) loadWeiboData {
 4     // 创建AFNetworking的http操作中管理器
 5     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 6
 7     // 设置参数
 8     NSMutableDictionary *param = [NSMutableDictionary dictionary];
 9     param[@"access_token"] = [HVWAccountInfoTool accountInfo].access_token;
10
11     // 发送请求
12     [manager GET:@"https://api.weibo.com/2/statuses/home_timeline.json" parameters:param success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
13 //        HVWLog(@"获取微博数据成功-------%@", responseObject);
14
15         // 保存数据到内存
16         NSArray *dataArray = responseObject[@"statuses"];
17
18         for (NSDictionary *dict in dataArray) {
19             HVWStatus *status = [HVWStatus statusWithDict:dict];
20             [self.statuses addObject:status];
21         }
22
23         // 刷新数据
24         [self.tableView reloadData];
25
26     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
27         HVWLog(@"获取微博数据失败------%@", error);
28     }];
29 }
30
31 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
32
33     static NSString *ID = @"HomeCell";
34     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
35     if (nil == cell) {
36         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
37     }
38
39     HVWStatus *status = self.statuses[indexPath.row];
40     HVWUser *user = status.user;
41
42     // 加载内容
43     cell.textLabel.text = status.text;
44     // 作者
45     cell.detailTextLabel.text = user.name;
46     // 作者头像
47     NSString *imageUrlStr = user.profile_image_url;
48     [cell.imageView setImageWithURL:[NSURL URLWithString:imageUrlStr] placeholderImage:[UIImage imageWithNamed:@"avatar_default_small"]];
49
50     return cell;
51 }

B.使用第三方框架转换json字典数据到模型

因为返回的json字典数据量大层多,自己编写的代码运行效率可能比较低下,这里使用李明杰老师的MJExtension框架来进行转换

github: https://github.com/CoderMJLee/MJExtension

1.使用此框架,只需要相应的类和成员属性,不用自己编写初始化方法

 1 //
 2 //  HVWUser.h
 3 //  HVWWeibo
 4 //
 5 //  Created by hellovoidworld on 15/2/5.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface HVWUser : NSObject
12
13 /** 友好显示名称 */
14 @property(nonatomic, strong) NSString *name;
15
16 /** 用户头像地址(中图),50×50像素 */
17 @property(nonatomic, strong) NSString *profile_image_url;
18
19 @end
 1 //
 2 //  HVWStatus.h
 3 //  HVWWeibo
 4 //
 5 //  Created by hellovoidworld on 15/2/5.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 #import "HVWUser.h"
11
12 @interface HVWStatus : NSObject
13
14 /** 微博信息内容 */
15 @property(nonatomic, strong) NSString *text;
16
17 /** 微博作者的用户信息字段 详细 */
18 @property(nonatomic, strong) HVWUser *user;
19
20 /** 微博配图地址数组,里面装载的时HVWPic模型 */
21 @property(nonatomic, strong) NSArray *pic_urls;
22
23 @end
 1 //  HVWHomeViewController.m
 2 /** 加载微博数据 */
 3 - (void) loadWeiboData {
 4     // 创建AFNetworking的http操作中管理器
 5     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 6
 7     // 设置参数
 8     NSMutableDictionary *param = [NSMutableDictionary dictionary];
 9     param[@"access_token"] = [HVWAccountInfoTool accountInfo].access_token;
10
11     // 发送请求
12     [manager GET:@"https://api.weibo.com/2/statuses/home_timeline.json" parameters:param success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
13 //        HVWLog(@"获取微博数据成功-------%@", responseObject);
14
15         // 保存数据到内存
16         NSArray *dataArray = responseObject[@"statuses"];
17
18         // 使用MJExtension直接进行字典-模型转换
19         self.statuses = [HVWStatus objectArrayWithKeyValuesArray:dataArray];
20
21         // 刷新数据
22         [self.tableView reloadData];
23
24     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
25         HVWLog(@"获取微博数据失败------%@", error);
26     }];
27 }

运行成功!

2.指定数组元素包装类,可以在代码中指定用什么类来包装一个数组中的数据

例如,返回的数据中,有"pic_urls"的数组,里面存放的是所有的微博配图

没有配置包装类的时候,返回的就是一个字典,不会被自动封装

创建一个"配图”类

 1 //
 2 //  HVWPic.h
 3 //  HVWWeibo
 4 //
 5 //  Created by hellovoidworld on 15/2/5.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface HVWPic : NSObject
12
13 /** 缩略图片地址,没有时不返回此字段 */
14 @property(nonatomic, strong) NSString *thumbnail_pic;
15
16 @end

“微博”类中已经有了对这个数组的映射,但是不会自动把里面的数据自动转换成HVWPic

所以,需要实现一个方法来指定数组子元素的包装类:

 1 //
 2 //  HVWStatus.m
 3 //  HVWWeibo
 4 //
 5 //  Created by hellovoidworld on 15/2/5.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "HVWStatus.h"
10 #import "HVWPic.h"
11
12 // 注意引入框架
13 #import "MJExtension.h"
14
15 @implementation HVWStatus
16
17 - (NSDictionary *)objectClassInArray {
18     // 返回一个字典,创建数组子元素和包装类的映射关系
19     return @{@"pic_urls": [HVWPic class]};
20 }
21
22 @end

运行,确认status内的pic_urls数组的元素类型是HVWPic:

时间: 2024-11-09 18:13:26

[iOS微博项目 - 2.6] - 获取微博数据的相关文章

iOS开发项目篇—39获取用户未读的微博信息(信息提醒)

iOS开发项目篇—39获取用户未读的微博信息(信息提醒) 一.简单说明 1.实现效果       2.实现 (1)新建一个类,封装请求 查看新浪官方要求的请求参数 该类中的代码设计 YYUnreadCountParam.h文件 1 // YYUnreadCountParam.h 2 //封装请求参数的类 3 4 #import "YYBaseParam.h" 5 6 @interface YYUnreadCountParam : YYBaseParam 7 /**uid true in

iOS开发项目篇—36封装微博业务

iOS开发项目篇—36封装微博业务 一.简单说明 1.请求参数面向模型 2.请求结果面向模型 3.对控制器来说应该屏蔽业务细节.不让控制器关心(知道)业务细节,它只需要知道自己在做某个业务 @通过一个专门的业务处理类:处理微博业务细节 说明: 业务:加载新的微博首页数据 实现:给新浪服务器发送一个GET请求 业务:加载更多的首页微博数据 实现1:给新浪服务器发送一个GET请求 实现2:去沙盒中加载以前离线缓存的微博数据  二.实现 1.新建一个微博业务处理类,继承自NSObject 微博业务处理

iOS开发项目篇—33发微博

iOS开发项目篇—33发微博 一.简单说明 1.发送按钮 当textView的文字发生改变(有内容)的时候,设置导航栏右侧的按钮为可点击的. 说明:监听内容的改变,既可以使用通知来实现,也可以使用代理来实现(下面使用的是代理的方式) 代码说明: 1 #pragma mark-设置代理方法 2 /** 3 *当textView的内容改变的时候,通知导航栏“发送”按钮为可用 4 */ 5 -(void)textViewDidChange:(UITextView *)textView 6 { 7 se

iOS开发项目篇—34获取用户信息

iOS开发项目篇—34获取用户信息 一.简单说明 需求:获取当前用户的昵称 ,需要获取当前登录用户的个人信息. 查看接口 要求传递的参数 这里要获取的时用户的昵称(所以使用用户id作为参数传入) 二.实现代码 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 //设置导航栏内容 6 [self setupNavBar]; 7 8 //集成刷新控件 9 [self setupRefresh]; 10 11 //设置用户的昵称为标题 12 [s

iOS开发项目篇—19获取授权过的访问标记

iOS开发项目篇—19获取授权过的访问标记 一.简单说明 1.获取授权 2.简单说明 说明: (1)只能使用post请求 (2)post请求的参数有5个,且五个参数都是必须的. (3)新浪会返回一个JSON,转成OC对象为字典,可以通过Key取出ACCESS_TOKEN. 二.实现 1.导入第三方框架 2.使用字典封装请求参数,五个参数都是必须的,就算少一个都是非法请求. 封装代码 1 //2.封装请求参数 2 /* 3 url:https://api.weibo.com/oauth2/acce

[iOS微博项目 - 3.6] - 获取未读消息

github: https://github.com/hellovoidworld/HVWWeibo   A.获取登陆用户未读消息 1.需求 获取所有未读消息,包括新微博.私信.@.转发.关注等 把未读消息数显示在相应的tabItem上 把总的未读消息数显示在app图标上 当app进入后台,仍然需要刷新未读消息数量数据 读取了未读消息之后清空计数 监听tabBarItem的点击,刷新数据(例如重复点击"首页"要刷新微博) 2.思路 使用微博提醒API获取未读消息 使用定时器定时获取 在

[iOS微博项目 - 3.2] - 发送微博

github: https://github.com/hellovoidworld/HVWWeibo A.使用微博API发送微博 1.需求 学习发送微博API 发送文字微博 发送带有图片的微博 2.思路 直接按照微博API的文档指示使用 这里测试上传带图片微博 3.实现 在"发微博"界面,点击右上角发送就调用API 1 // HVWComposeViewController.m 2 /** 发送微博 */ 3 - (void) sendWeibo { 4 if (self.compos

[iOS微博项目 - 3.4] - 获取用户信息

github: https://github.com/hellovoidworld/HVWWeibo   A.获取用户信息 1.需求 获取用户信息并储存 把用户昵称显示在“首页”界面导航栏的标题上 2.思路 使用微博API 将用户信息封装到HVWUser模型中 把获取的用户名存放到账户信息HVWAccountInfo模型中存储到沙盒 3.实现 1 // HVWHomeViewController.m 2 /** 获取用户信息 */ 3 - (void) setupUserInfo { 4 //

[iOS微博项目 - 3.1] - 发微博界面

github: https://github.com/hellovoidworld/HVWWeibo   A.发微博界面:自定义UITextView 1.需求 用UITextView做一个编写微博的输入框 没有输入任何文本的时候显示占位文本 统一占位文本和正文的字体 2.思路 系统自带的输入控件有UITextField和UITextView两种 UITextField:自带占位文本属性,不能换行 UITextView:没有占位文本属性,能换行 这里我们选择UITextView进行改造 根据是否输