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, copy) NSString *name;
15
16 /** 用户头像地址(中图),50×50像素 */
17 @property(nonatomic, copy) 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, copy) 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框架来进行转换
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, copy) NSString *name;
15
16 /** 用户头像地址(中图),50×50像素 */
17 @property(nonatomic, copy) 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, copy) 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, copy) 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: