[iOS 多线程 & 网络 - 3.0] - 在线动画Demo

A.需求

  • 所有数据都从服务器下载
  • 动画列表包含:图片、动画名标题、时长副标题
  • 点击打开动画观看

code source: https://github.com/hellovoidworld/VideoOnlineDemo

server source:  https://github.com/hellovoidworld/MyOnlineVideoDemoServer

B.实现

1.显示图片和基本信息

服务器端的json信息:

{ "videos": [

{

"name":"驯龙高手1",

"length":"16秒",

"image":"images/[20150124-180852-0].PNG",

"video":"videos/1.MP4"

},

{

"name":"驯龙高手2",

"length":"21秒",

"image":"images/[20150124-180905-1].PNG",

"video":"videos/2.MP4"

},

{

"name":"驯龙高手3",

"length":"14秒",

"image":"images/[20150124-180908-2].PNG",

"video":"videos/3.MP4"

},

...

]

}

(1)使用tableView来布置界面

(2)创建一个模型,用来装载录像信息

 1 //
 2 //  HVWVideo.h
 3 //  VideoOnlineDemo
 4 //
 5 //  Created by hellovoidworld on 15/1/24.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface HVWVideo : NSObject
12
13 @property(nonatomic, strong) NSString *name;
14 @property(nonatomic, strong) NSString *length;
15 @property(nonatomic, strong) NSString *image;
16 @property(nonatomic, strong) NSString *video;
17
18 + (instancetype) videoWithDict:(NSDictionary *) dict;
19
20 @end

(3)发送请求 & 接收服务器信息

  • 使用代理方法发送请求,接收json数据
  • 解析json数据,封装到模型中
  • 使用SDWebImage框架加载服务器图片
  1 //
  2 //  HVWVideoViewController.m
  3 //  VideoOnlineDemo
  4 //
  5 //  Created by hellovoidworld on 15/1/25.
  6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
  7 //
  8
  9 #import "HVWVideoViewController.h"
 10 #import "HVWVideo.h"
 11 #import "UIImageView+WebCache.h"
 12
 13 #define ServerIP @"http://192.168.0.21:8080/MyTestServer"
 14
 15 @interface HVWVideoViewController () <UITableViewDataSource, UITableViewDelegate, NSURLConnectionDataDelegate>
 16
 17 /** 接收到的二进制数据 */
 18 @property(nonatomic, strong) NSMutableData *data;
 19
 20 /** 所有的录像模型数据 */
 21 @property(nonatomic, strong) NSArray *videos;
 22
 23 @end
 24
 25 @implementation HVWVideoViewController
 26
 27 - (void)viewDidLoad {
 28     [super viewDidLoad];
 29
 30     self.tableView.dataSource = self;
 31     self.tableView.delegate = self;
 32
 33     // 读取服务器数据
 34     [self acceptDataFromServer];
 35 }
 36
 37 - (void)didReceiveMemoryWarning {
 38     [super didReceiveMemoryWarning];
 39     // Dispose of any resources that can be recreated.
 40 }
 41
 42 /** 读取服务器数据 */
 43 - (void) acceptDataFromServer {
 44     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/video", ServerIP]];
 45     NSURLRequest *request = [NSURLRequest requestWithURL:url];
 46     NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
 47     [connection start];
 48 }
 49
 50 #pragma mark - UITableViewDataSource
 51 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
 52     return 1;
 53 }
 54
 55 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 56     return self.videos.count;
 57 }
 58
 59 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 60     static NSString *ID = @"VideoCell";
 61
 62     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
 63     if (nil == cell) {
 64         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
 65     }
 66
 67     HVWVideo *video = self.videos[indexPath.row];
 68     // 设置标题 & 副标题
 69     cell.textLabel.text = video.name;
 70     cell.detailTextLabel.text = video.length;
 71
 72     // 下载图片
 73     NSString *imageUrlStr = [NSString stringWithFormat:@"%@/%@", ServerIP, video.image];
 74     NSURL *imageUrl = [NSURL URLWithString:imageUrlStr];
 75     [cell.imageView setImageWithURL:imageUrl placeholderImage:[UIImage imageNamed:@"placeholder"]];
 76
 77
 78     // 下载录像
 79
 80
 81     return cell;
 82 }
 83
 84 #pragma mark - UITableViewDelegate
 85
 86
 87
 88 #pragma mark - NSURLConnectionDataDelegate 代理方法
 89 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
 90     NSLog(@"开始接收数据");
 91     self.data = [NSMutableData data];
 92 }
 93
 94 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
 95     NSLog(@"接收数据中...");
 96     [self.data appendData:data];
 97 }
 98
 99 - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
100     NSLog(@"接收数据完毕");
101
102     if (self.data) {
103         // 加载录像资料
104         NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:self.data options:NSJSONReadingMutableLeaves error:nil];
105
106         //        NSLog(@"%@", jsonDict);
107         NSArray *jsonArray = jsonDict[@"videos"];
108         //        NSLog(@"%@", jsonArray);
109
110         NSMutableArray *videoArray = [NSMutableArray array];
111         for (NSDictionary *dict in jsonArray) {
112             NSLog(@"%@", dict);
113             HVWVideo *video = [HVWVideo videoWithDict:dict];
114             [videoArray addObject:video];
115         }
116         self.videos = videoArray;
117
118         [self.tableView reloadData];
119     }
120
121 }
122
123 @end

(4)调整cell高度,创建自定义cell类,调整尺寸、分割线

 1 //
 2 //  HVWVideoCell.m
 3 //  VideoOnlineDemo
 4 //
 5 //  Created by hellovoidworld on 15/1/25.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "HVWVideoCell.h"
10 #import "UIImageView+WebCache.h"
11
12 #define ServerIP @"http://192.168.0.21:8080/MyTestServer"
13
14 @interface HVWVideoCell()
15
16 /** 分割线 */
17 @property(nonatomic, strong) UIView *separatorLine;
18
19 @end
20
21 @implementation HVWVideoCell
22
23 + (instancetype) cellWithTableView:(UITableView *) tableView {
24     static NSString *ID = @"VideoCell";
25
26     HVWVideoCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
27     if (nil == cell) {
28         cell = [[HVWVideoCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
29     }
30
31     return cell;
32 }
33
34 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
35     if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
36         // 重写样式
37         // 自定义分割写
38         UIView *separatorLine = [[UIView alloc] init];
39         separatorLine.backgroundColor = [UIColor lightGrayColor];
40         separatorLine.alpha = 0.3;
41         [self.contentView addSubview:separatorLine];
42
43         self.separatorLine = separatorLine;
44     }
45
46     return self;
47 }
48
49 /** 重写内部子控件的位置尺寸 */
50 - (void)layoutSubviews {
51     [super layoutSubviews];
52
53     // 设置图片
54     CGFloat imageWidth = 100;
55     CGFloat imageHeight = 56;
56     CGFloat imageX = 10;
57     CGFloat imageY = (self.frame.size.height - imageHeight) / 2;
58     CGRect imageFrame = CGRectMake(imageX, imageY, imageWidth, imageHeight);
59     self.imageView.frame = imageFrame;
60
61     // 设置标题
62     CGRect textFrame = self.textLabel.frame;
63     textFrame.origin.x = imageX + imageWidth + 10;
64     self.textLabel.frame = textFrame;
65
66     // 设置副标题
67     CGRect detailFrame = self.detailTextLabel.frame;
68     detailFrame.origin.x = self.textLabel.frame.origin.x;
69     self.detailTextLabel.frame = detailFrame;
70
71     // 设置分割线
72     CGFloat separatorLineY = self.frame.size.height - 1;
73     self.separatorLine.frame = CGRectMake(0, separatorLineY, self.frame.size.width, 1);
74 }
75
76 /** 设置数据 */
77 - (void)setVideo:(HVWVideo *)video {
78     _video = video;
79
80     // 设置标题 & 副标题
81     self.textLabel.text = video.name;
82     self.detailTextLabel.text = video.length;
83
84     // 下载图片
85     NSString *imageUrlStr = [NSString stringWithFormat:@"%@/%@", ServerIP, video.image];
86     NSURL *imageUrl = [NSURL URLWithString:imageUrlStr];
87     [self.imageView setImageWithURL:imageUrl placeholderImage:[UIImage imageNamed:@"placeholder"]];
88 }
89
90 @end

2.播放视频

(1)引入MediaPlayer类

1 #import <MediaPlayer/MediaPlayer.h>

(2)使用MPMoviePlayerViewController 播放视频

 1 - (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 2     // 加载视频
 3     HVWVideo *video = self.videos[indexPath.row];
 4     NSString *videoUrlStr = [NSString stringWithFormat:@"%@/%@", ServerIP, video.video];
 5     NSURL *videoUrl = [NSURL URLWithString:videoUrlStr];
 6
 7     NSLog(@"%@", videoUrlStr);
 8
 9     // 使用MediaPlayer框架播放视频
10     MPMoviePlayerViewController *mvController = [[MPMoviePlayerViewController alloc] initWithContentURL:videoUrl];
11     [self presentMoviePlayerViewControllerAnimated:mvController];
12 }

(3)阻止app进入后台之后退出视频

a.默认app进入后台之后,会自动把视频播放的view缩回去

b.自定义一个集成MPMoviePlayerViewController的类,通过取消接收“进入后台”消息来阻止此操作

 1 //
 2 //  HVWMoviePlayerViewController.m
 3 //  VideoOnlineDemo
 4 //
 5 //  Created by hellovoidworld on 15/1/25.
 6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "HVWMoviePlayerViewController.h"
10
11 @interface HVWMoviePlayerViewController ()
12
13 @end
14
15 @implementation HVWMoviePlayerViewController
16
17 - (void)viewDidLoad {
18     [super viewDidLoad];
19     // Do any additional setup after loading the view.
20
21     // 取消接收程序进入后台的通知
22     [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
23 }
24
25 /** 重写屏幕方向方法 */
26 - (NSUInteger)supportedInterfaceOrientations {
27     // 横屏,向左/右
28     return UIInterfaceOrientationMaskLandscape;
29 }
30
31 @end

(4)强制使用横屏播放

(默认是3个方向都可以播放)

1 /** 重写屏幕方向方法 */
2 - (NSUInteger)supportedInterfaceOrientations {
3     // 横屏,向左/右
4     return UIInterfaceOrientationMaskLandscape;
5 }

时间: 2024-10-16 10:47:17

[iOS 多线程 & 网络 - 3.0] - 在线动画Demo的相关文章

[iOS 多线程 &amp; 网络 - 2.0] - 发送接收 服务器信息

A.搭建java服务器 使用eclipse.tomcat和struts2框架搭建一个简单的服务器 1.准备好合适版本的JDK.eclipse EE.tomcat.struts2 框架包 2.配置JDK和tomcat系统变量 3.在eclipse中创建一个Dynamic Web Project, 勾选创建web.xml 4.解压一个struts2中的app范例,参考其中的web.xml和struts.xml配置 5.配置tomcat,注意配置正确的服务器的路径和发布路径,不要使用默认的eclips

[iOS 多线程 &amp; 网络 - 1.0] - 多线程概述

A.进程 什么是进程进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活动监视器"可以查看Mac系统中所开启的进程 B.线程 主线程.子线程占用内存分别是1M和512K 1.什么是线程1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中

iOS 多线程 &amp; 网络 - 4.0 - AFN框架简单使用

A.AFN基本知识 1.概念 AFNetworking 是对NSURLConnection的封装 运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单 AFN支持ARC B.基本请求使用 1.基本使用 (1)头文件 AFNetworking.h (2)管理者类:AFHTTPRequestOperationManager (3)“GET”方法发送GET请求,使用“POST”方法发送POST请求 (4)使用字典发送参数 (5)block处理请求成功/失败 1 /** 发送 GET/

[iOS 多线程 &amp; 网络 - 2.9] - ASI框架

A.ASI基本知识 1.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大. ASI的实现基于底层的CFNetwork框架,因此运行效率很高. ASI的github地址 https://github.com/pokeb/asi-http-request ASI的使用参考http://www.cnblogs.com/dotey/archive/2011/05/10/2041966.html http://www.oschina.net/question

[iOS 多线程 &amp; 网络 - 2.1] - 解析json

A.iOS中json的基本使用 1.解析json数据 (1)json反序列化 对象{}格式 {key : value, key : value,...} 的键值对的结构可以反序列化为OC中的NSDictionary数组[]格式 ["java","javascript","vb",...]可以反序列化为OC中的NSArray 提示JSON的数据格式与OC中的快速包装方法非常类似JSON的数据格式同样支持嵌套 (2)json工具 从iOS 5开始,使

[iOS 多线程 &amp; 网络 - 1.1] - 多线程NSThread

A.NSThread的基本使用 1.创建和启动线程 一个NSThread对象就代表一条线程 创建.启动线程NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];[thread start];// 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法+ (NSThread *)mainThread; // 获得主线程- (BOOL)isMain

[iOS 多线程 &amp; 网络 - 2.7] - NSURLCache

A.基本知识 1.为什么需要缓存? 有时候一个url会请求多次,得到的内容确实一样的 2.缓存的概念 3.缓存数据的过程 当服务器返回数据时,需要做以下步骤(1)使用服务器的数据(比如解析.显示)(2)将服务器的数据缓存到硬盘(沙盒)此时缓存的情况是:内存缓存中有数据,硬盘缓存中有数据.再次请求数据分为两种情况:(1)如果程序并没有被关闭,一直在运行 那么此时内存缓存中有数据,硬盘缓存中有数据.如果此时再次请求数据,直接使用内存缓存中的数据即可(2)如果程序重新启动 那么此时内存缓存已经消失,没

[iOS 多线程 &amp; 网络 - 2.8] - 检测网络状态

A.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的:(1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能)(2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体验 WIFI\3G网络:自动下载高清图片 低速网络:只下载缩略图 没有网络:只显示离线的缓存数据 苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态https://developer.apple.com/library/ios/samplecode/Reachability

[iOS 多线程 &amp; 网络 - 2.10] - ASI框架下载文件

A.ASI框架中的下载 1.实现步骤 在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可. (1)创建请求对象:(2)设置下载文件保存的路径:(3)发送下载文件的网络请求(异步).按照上面的几个步骤执行,程序会自动开启异步线程,一点一点的把数据写入到指定的文件路径,而且不论是下载多大的文件都不会占用大量的内存空间. ASI框架是基于底层的cfnoteworking的,性能很好.当然也可以设置block,或者是监听下载的进度. 自动会使用“边下边写” 使用进度