Sian 发表于 2014-4-17 21:09:47

ios实战开发之仿新浪微博(第五讲:微博数据加载)

1、效果演示

http://player.youku.com/player.php/sid/XNzAwMTkzNDc2/v.swf

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
//
//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 = [ initWithBaseURL:];
   
   
    NSMutableDictionary *paramsDict = [ initWithDictionary:params];
   
    SAAccountTool *accountTool = [ init];
   
    // 如果本在沙盒存在AccessToken则自动将AccessToken加入Request请求中
    if (accountTool.account.accessToken) {
   
      ;
      
    }
   
    NSURLRequest *post = ;
   
    // 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调用
      }];
   
    ;
}

@end

SAStatus.h
//
//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
//
//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 = ) {
      _text = dict[@"text"];
      _user = ];
    }
    return self;
}

+ (id)statusWithDict:(NSDictionary *)dict
{
    return [ initWithDict:dict];
}

@end

SAStatusUser.h
//
//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
//
//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 = ) {
      _screenName = dict[@"screen_name"];
    }
    return self;
}

+ (id)statusUserWithDict:(NSDictionary *)dict
{
    return [ initWithDict:dict];
}

@end

SAStatusTool.h
//
//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
//
//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
{
    [ 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 = ;
         for (NSDictionary *dict in JSON[@"statuses"]) {
             SAStatus *status = ;
             ;
         }
         
         // 2、将数组返回给Block形参供方法调用者使用
         success(statuses);
         
   } failure:^(NSError *error) {
         
         if (failure == nil) return;
         
         failure(error);
         
   } method:@"GET"];
   
}
@end

SAHomeController.m
//
//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 = ;
    if (self) {
      // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    ;
    _status = ;
   
    // 1、设置基本界面
    ;
   
    // 2、加载数据
   
    ;
   
}

#pragma mark 加载基本界面
- (void)loadBasicUI
{
   
    self.title = @"首页";
   
    // 用自定的分类方法给导航条添加左边按钮
    self.navigationItem.leftBarButtonItem = ;
   
    // 用自定的分类方法给导航条添加右边按钮
    self.navigationItem.rightBarButtonItem = ;
   
}

#pragma mark 加载微博数据
- (void)loadStatusData
{
    // 调用SAStatusTool方法直接加载数据到模型数组
    [SAStatusTool statusToolGetStatusSuccess:^(NSArray *array) {
      
      _status = ;
      ;
      
    } failurs:^(NSError *error) {
      
      MyLog(@"%@", );
      
    }];
   
}

#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 = ;
    if (!cell) {
      cell = [ initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Identifier];
    }
    // 使用数据模型取内容
    SAStatus *status = _status;
    cell.textLabel.text = status.user.screenName;
    cell.detailTextLabel.text = status.text;
   
    return cell;
}

@end


4、源码下载
**** Hidden Message *****

相关主题链接
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实战开发之仿新浪微博(小龙虾发布版)

panzilong 发表于 2014-10-24 16:00:56

继续感谢!!!!!!

zhwyaoyao 发表于 2014-11-4 13:11:56

嗯,不错,学习中...

yipangzi 发表于 2014-11-20 20:33:08

、、、、、、、、、、、、、、

wintelsui 发表于 2014-11-25 13:22:02

Oh,已经铺不急待

warmlight 发表于 2014-11-28 09:49:41

学习怎么加载数据中……!!!

朱彬磊 发表于 2014-11-28 12:41:49

学习学习:)

qiulibi 发表于 2014-11-30 09:41:11

学习加载数据~~~~

hnxyzhw 发表于 2014-12-20 20:00:44

支持个,学习学习

lihaitao 发表于 2014-12-24 09:15:01

楼主今天心情很好啊
页: [1] 2 3 4 5 6
查看完整版本: ios实战开发之仿新浪微博(第五讲:微博数据加载)