1、效果演示
2、设计说明
2.1 界面设计及基本框架设计请参考前面几讲的内容
2.2 创建数据模型,设计一个Status类用来存储从新浪API接口获取的JSON数据中微博内容,设计一个StatusUser类用来存储JSON数据中的微博用户
2.3 创建工具模型,设计一个StatusTool类用来发送微博请求,封装HttpTool类
2.4 优化Request请求方法,因为后续每次请求都需要在Request中添加AccessToken,因此将AccessToken自动加载到Request请求中
2.5 调用工具模型请求微博数据,并将数据展示到首页TableView的表格中,当前TableView表格中只显示微博内容中的微博发送者昵称与微博正文,其他内容及界面展示后续完善2.6 数据请求展示示意图:
3、关键代码
SAHttpTool.m
[Objective-C] 纯文本查看 复制代码 //
// SAHttpTool.m
// SianWeibo
//
// Created by yusian on 14-4-15.
// Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import "SAHttpTool.h"
#import "AFNetWorking.h"
#import "SAAccountTool.h"
@implementation SAHttpTool
// 包装第三方框架AFNetWorking,对外提供类似方法
+ (void)httpToolPostWithBaseURL:(NSString *)urlString path:(NSString *)pathString params:(NSDictionary *)params success:(Success)success failure:(Failure)failure method:(NSString *)method
{
// 获取授权
// 1、创建一个Operation
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:urlString]];
NSMutableDictionary *paramsDict = [[NSMutableDictionary alloc] initWithDictionary:params];
SAAccountTool *accountTool = [[SAAccountTool alloc] init];
// 如果本在沙盒存在AccessToken则自动将AccessToken加入Request请求中
if (accountTool.account.accessToken) {
[paramsDict setObject:accountTool.account.accessToken forKey:@"access_token"];
}
NSURLRequest *post = [client requestWithMethod:method path:pathString parameters:paramsDict];
// 2、发送Operation请求
AFJSONRequestOperation *json = [AFJSONRequestOperation JSONRequestOperationWithRequest:post
success:
^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
success(JSON); // 将方法中的实参传给内部的Success Block调用
}
failure:
^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
failure(error); // 将方法中的error传给内部的Failure Block调用
}];
[json start];
}
@end
SAStatus.h
[Objective-C] 纯文本查看 复制代码 //
// SAStatus.h
// SianWeibo
//
// Created by yusian on 14-4-16.
// Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "SAStatusUser.h"
@interface SAStatus : NSObject
@property (nonatomic, copy) NSString *text;
@property (nonatomic, strong) SAStatusUser *user;
- (id)initWithDict:(NSDictionary *)dict;
+ (id)statusWithDict:(NSDictionary *)dict;
@end
SAStatus.m
[Objective-C] 纯文本查看 复制代码 //
// SAStatus.m
// SianWeibo
//
// Created by yusian on 14-4-16.
// Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import "SAStatus.h"
@implementation SAStatus
- (id)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
_text = dict[@"text"];
_user = [SAStatusUser statusUserWithDict:dict[@"user"]];
}
return self;
}
+ (id)statusWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
@end
SAStatusUser.h
[Objective-C] 纯文本查看 复制代码 //
// SAStatusUser.h
// SianWeibo
//
// Created by yusian on 14-4-16.
// Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface SAStatusUser : NSObject
@property (nonatomic, copy) NSString *screenName;
- (id)initWithDict:(NSDictionary *)dict;
+ (id)statusUserWithDict:(NSDictionary *)dict;
@end
SAStatusUser.m
[Objective-C] 纯文本查看 复制代码 //
// SAStatusUser.m
// SianWeibo
//
// Created by yusian on 14-4-16.
// Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import "SAStatusUser.h"
@implementation SAStatusUser
- (id)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
_screenName = dict[@"screen_name"];
}
return self;
}
+ (id)statusUserWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
@end
SAStatusTool.h
[Objective-C] 纯文本查看 复制代码 //
// SAStatusTool.h
// SianWeibo
//
// Created by yusian on 14-4-16.
// Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import <Foundation/Foundation.h>
typedef void(^StatusSuccess)(NSArray * array);
typedef void(^StatusFailurs)(NSError * error);
@interface SAStatusTool : NSObject
- (void)initWithHttpToolStatusSuccess:(StatusSuccess)success failurs:(StatusFailurs)failure;
+ (void)statusToolGetStatusSuccess:(StatusSuccess)success failurs:(StatusFailurs)failure;
@end
SAStatusTool.m
[Objective-C] 纯文本查看 复制代码 //
// SAStatusTool.m
// SianWeibo
//
// Created by yusian on 14-4-16.
// Copyright (c) 2014年 小龙虾论坛. All rights reserved.
//
#import "SAStatusTool.h"
#import "SAStatus.h"
#import "SAHttpTool.h"
@implementation SAStatusTool
+ (void)statusToolGetStatusSuccess:(StatusSuccess)success failurs:(StatusFailurs)failure
{
[[self alloc] initWithHttpToolStatusSuccess:success failurs:failure];
}
- (void)initWithHttpToolStatusSuccess:(StatusSuccess)success failurs:(StatusFailurs)failure
{
// 调用SAHttpTool这个工具类,发送相关请求返回数组内容
[SAHttpTool httpToolPostWithBaseURL:kBaseURL path:@"2/statuses/home_timeline.json" params:
nil success:^(id JSON) {
// 如果方法调用没有实现success部分,则方法直接返回
if (success == nil) return;
// 1、将返回的JSON转换成微博模型并保存到数组
NSMutableArray *statuses = [NSMutableArray array];
for (NSDictionary *dict in JSON[@"statuses"]) {
SAStatus *status = [SAStatus statusWithDict:dict];
[statuses addObject:status];
}
// 2、将数组返回给Block形参供方法调用者使用
success(statuses);
} failure:^(NSError *error) {
if (failure == nil) return;
failure(error);
} method:@"GET"];
}
@end
SAHomeController.m
[Objective-C] 纯文本查看 复制代码 //
// SAHomeController.m
// SianWeibo
//
// Created by yusian on 14-4-12.
// Copyright (c) 2014年 小龙虾论坛. All rights reserved.
// 首页控制器
#import "SAHomeController.h"
#import "NSString+SA.h"
#import "UIBarButtonItem+SA.h"
#import "SAStatus.h"
#import "SAStatusTool.h"
@interface SAHomeController ()
{
NSArray *_status;
}
@end
@implementation SAHomeController
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_status = [NSMutableArray array];
// 1、设置基本界面
[self loadBasicUI];
// 2、加载数据
[self loadStatusData];
}
#pragma mark 加载基本界面
- (void)loadBasicUI
{
self.title = @"首页";
// 用自定的分类方法给导航条添加左边按钮
self.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithImageName:@"navigationbar_compose.png" highLightedImageName:@"navigationbar_compose_highlighted.png" addTarget:self action:@selector(leftButtonClick) forControlEvents:UIControlEventTouchUpInside];
// 用自定的分类方法给导航条添加右边按钮
self.navigationItem.rightBarButtonItem = [UIBarButtonItem barButtonItemWithImageName:@"navigationbar_pop.png" highLightedImageName:@"navigationbar_pop_highlighted.png" addTarget:self action:@selector(rightButtonClick) forControlEvents:UIControlEventTouchUpInside];
}
#pragma mark 加载微博数据
- (void)loadStatusData
{
// 调用SAStatusTool方法直接加载数据到模型数组
[SAStatusTool statusToolGetStatusSuccess:^(NSArray *array) {
_status = [NSArray arrayWithArray:array];
[self.tableView reloadData];
} failurs:^(NSError *error) {
MyLog(@"%@", [error localizedDescription]);
}];
}
#pragma mark 首页导航左按钮事件
- (void)leftButtonClick
{
MyLog(@"首页左按钮");
}
#pragma mark 首页导航右按钮事件
- (void)rightButtonClick
{
MyLog(@"首页右按钮");
}
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// MyLog(@"%d", _status.count);
return _status.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *Identifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Identifier];
}
// 使用数据模型取内容
SAStatus *status = _status[indexPath.row];
cell.textLabel.text = status.user.screenName;
cell.detailTextLabel.text = status.text;
return cell;
}
@end
4、源码下载
相关主题链接
1、ios实战开发之仿新浪微博(第一讲:新特性展示)
2、ios实战开发之仿新浪微博(第二讲:主框架搭建)
3、ios实战开发之仿新浪微博(第三讲:更多界面搭建)
4、ios实战开发之仿新浪微博(第四讲:OAuth认证)
5、ios实战开发之仿新浪微博(第五讲:微博数据加载)
6、ios实战开发之仿新浪微博(第六讲:微博数据展示一)
7、ios实战开发之仿新浪微博(第七讲:微博数据展示二)
8、ios实战开发之仿新浪微博(第八讲:微博数据展示三)
9、ios实战开发之仿新浪微博(第九讲:微博功能完善一)
10、ios实战开发之仿新浪微博(第十讲:微博功能完善二)
11、ios实战开发之仿新浪微博(第十一讲:微博功能完善三)
12、ios实战开发之仿新浪微博(小龙虾发布版)
|