1.AFN的简单使用
MovieViewController.m文件
#import "MovieViewController.h"
#import "AFNetworking.h"//网络请求数据
#import "Movie.h"
#import "MocieDetailViewController.h"
#import "AFNetworkReachabilityManager.h"//判断当前网络状态
@interface MovieViewController ()<UITableViewDataSource,UITableViewDelegate>
@property(nonatomic,retain)NSMutableArray *movArr;
@end
@implementation MovieViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.navigationBar.translucent = NO;
self.title = @"电影";
UITableView *tableView = [[UITableView alloc ] initWithFrame:CGRectMake(0, 0, 375, 603-49) style:UITableViewStylePlain];
tableView.delegate = self;
tableView.tag = 100;
tableView.dataSource = self;
[self.view addSubview:tableView];
[tableView release];
//用AFN来判断网络情况和请求数据
[self reach];
[self createData];
}
- (void)reach{
//判断当前网络状态
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//开始检测网络
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
//在这里面判断当前的网络情况
if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
NSLog(@"当前网络到:WIFI");
}
}];
//停止检测(一定要停止)
[manager stopMonitoring];
}
- (void)createData{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//进行网络进行GET请求,因为这里的接口问题,需要在AFURLResponseSerialization.m文件的222行加一句"text/html"
[manager GET:@"http://project.lanou3g.com/teacher/yihuiyun/lanouproject/movielist.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//把数据放到model里面,responseObject在这里就是请求下来的一个字典(不是Data)
NSMutableDictionary *movDic = responseObject;
self.movArr = [NSMutableArray array];
for (NSDictionary *dic in movDic[@"result"]) {
Movie *mov = [[Movie alloc] init];
[mov setValuesForKeysWithDictionary:dic];
[self.movArr addObject:mov];
[mov release];
}
UITableView *tableView = (UITableView *)[self.view viewWithTag:100];
//请求完数据后要刷新表格
[tableView reloadData];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@",error);
}];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.movArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *ID = @"movCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
Movie *mov = self.movArr[indexPath.row];
cell.textLabel.text = mov.movieName;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
MocieDetailViewController *mov = [[MocieDetailViewController alloc] init];
mov.mov = self.movArr[indexPath.row];
[self.navigationController pushViewController:mov animated:YES];
[mov release];
}
2.收藏工具的简单封装
MocieDetailViewController文件
#import <UIKit/UIKit.h>
@class Movie;
@interface MocieDetailViewController : UIViewController
@property(nonatomic,retain)Movie *mov;
@end
#import "MocieDetailViewController.h"
#import "Movie.h"
#import "SaveTool.h"
@interface MocieDetailViewController ()<UIAlertViewDelegate>
@property(nonatomic,assign)BOOL isSelected;
@end
@implementation MocieDetailViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.navigationBar.translucent = NO;
self.title = self.mov.movieName;
//知道model当前有没有被收藏,从而确定显示图标类型
self.isSelected = [SaveTool isHaveModel:self.mov fileName:FileMovie];
//接下来根据收藏的状态选取不同的按钮图片
if (self.isSelected == 0) {
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"iconfont-favorfill"] style:UIBarButtonItemStylePlain target:self action:@selector(click)];
}
else if (self.isSelected == 1) {
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"iconfont-favor"] style:UIBarButtonItemStylePlain target:self action:@selector(click)];
}
}
- (void)click{
if (self.isSelected) {
[SaveTool addOrCancelModel:self.mov isSelect:self.isSelected fileName:FileMovie];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"iconfont-favorfill"] style:UIBarButtonItemStylePlain target:self action:@selector(click)];
//做完相关操作后修改当前的状态
self.isSelected = !self.isSelected;
}
else if(!self.isSelected){
[SaveTool addOrCancelModel:self.mov isSelect:self.isSelected fileName:FileMovie];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"iconfont-favor"] style:UIBarButtonItemStylePlain target:self action:@selector(click)];
self.isSelected = !self.isSelected;
}
NSString *name = (self.isSelected == 0 ? @"收藏成功" : @"取消收藏成功");
NSString *cancel = (self.isSelected == 0 ? @"确定" : @"确定");
UIAlertView *saveAler = [[UIAlertView alloc] initWithTitle:name message:nil delegate:self cancelButtonTitle:cancel otherButtonTitles:nil, nil];
[saveAler show];
[saveAler release];
}
Movie.h和Movie.m文件
#import <Foundation/Foundation.h>
@interface Movie : NSObject<NSCoding>
@property(nonatomic,copy)NSString *movieName;
@property(nonatomic,copy)NSString *pic_url;
@property(nonatomic,copy)NSString *movieId;
@end
#import "Movie.h"
@implementation Movie
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_movieName forKey:@"movieName"];
[aCoder encodeObject:_movieId forKey:@"movieId"];
[aCoder encodeObject:_pic_url forKey:@"pic_url"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.movieId = [aDecoder decodeObjectForKey:@"movieId"];
self.movieName = [aDecoder decodeObjectForKey:@"movieName"];
self.pic_url = [aDecoder decodeObjectForKey:@"pic_url"];
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"movieName = %@, movieId = %@, pic_url = %@", _movieName,_movieId,_pic_url];
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
}
- (void)dealloc{
[_movieId release];
[_movieName release];
[_pic_url release];
[super dealloc];
}
@end
SaveTool.h和SaveTool.m文件
#import <Foundation/Foundation.h>
//写枚举的时候前面空一行在打nsenum选择有type的那个
typedef NS_ENUM(NSUInteger, FileName) {
FileMovie,
FileActivity,
FileCinema,
};
@class Movie;
@interface SaveTool : NSObject
//通过一个类方法去收藏某个活动(收藏->YES 已收藏->NO)
+ (BOOL)saveMovie:(Movie *)movie;
//写一个统一的类方法来供多个文件调用判断是否收藏某个活动(收藏->NO 没有->YES)
+ (BOOL)isHaveModel:(id)model fileName:(FileName)type;
//通过传个收藏的转态来进行取消或者收藏
+ (void)addOrCancel:(Movie *)movie isSelect:(BOOL)isSelect;
+ (void)addOrCancelModel:(id)model isSelect:(BOOL)isSelect fileName:(FileName)type;
@end
#import "SaveTool.h"
#import "Movie.h"
@implementation SaveTool
+ (BOOL)saveMovie:(Movie *)movie{
//沙盒路径和拼接路径
NSArray *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documentPath[0] stringByAppendingPathComponent:@"Movie.plist"];
//如果进行反归档之后返回的数组是空,那么当前文件就为空,所以空的话要先创建数组
NSMutableArray *movArr = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if (movArr == nil) {
movArr = [NSMutableArray array];
[movArr addObject:movie];
[NSKeyedArchiver archiveRootObject:movArr toFile:path];
return YES;
}
else{
//当数组中有数据的时候,那么就要先判断是否已经收藏
for (Movie *temp in movArr) {
if ([temp.movieId isEqualToString:movie.movieId]) {
return NO;
}
}
//如果没有收藏下面的方法才会执行
[movArr addObject:movie];
[NSKeyedArchiver archiveRootObject:movArr toFile:path];
return YES;
}
}
+ (BOOL)isHaveModel:(id)model fileName:(FileName)type{
//成员变量不能使用在类方法里
NSArray *sandBoxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *strPath = [NSString stringWithFormat:@"%@.plist",[model class]];
NSString *path = [sandBoxPath[0] stringByAppendingPathComponent:strPath];
NSMutableArray *modelArr = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
switch (type) {
case FileMovie:
{
Movie *movie = model;
//当第一次modelArr为nil时下面的for循环不会走
for (Movie *tempMovew in modelArr) {
if ([tempMovew.movieId isEqualToString:movie.movieId]) {
return NO;
}
}
break;
}
case FileActivity:
{
NSLog(@"FileActivity");
break;
}
case FileCinema:
{
NSLog(@"FileCinema");
break;
}
}
return YES;
}
+ (void)addOrCancel:(Movie *)movie isSelect:(BOOL)isSelect{
NSArray *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documentPath[0] stringByAppendingPathComponent:@"Movie.plist"];
NSMutableArray *movArr = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if (movArr == nil) {
movArr = [NSMutableArray array];
}
//根据状态判断是移除还是添加
if (isSelect) {
[movArr addObject:movie];
}else{
for (Movie *mov in movArr) {
if ([movie.movieId isEqualToString:mov.movieId]) {
[movArr removeObject:mov];
NSLog(@"%ld",movArr.count);
NSLog(@"%@",path);
break;//移除后一定要break,有时候可能会出错
}
}
}
//最后把数据进行归档
[NSKeyedArchiver archiveRootObject:movArr toFile:path];
}
+ (void)addOrCancelModel:(id)model isSelect:(BOOL)isSelect fileName:(FileName)type{
NSArray *sandBoxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *strPath = [NSString stringWithFormat:@"%@.plist",[model class]];
NSString *path = [sandBoxPath[0] stringByAppendingPathComponent:strPath];
NSMutableArray *modelArr = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
//如果进行反归档之后返回的数组是空,那么当前文件就为空,所以空的话要先创建数组
if (modelArr == nil) {
modelArr = [NSMutableArray array];
}
//根据状态判断是移除还是添加
if (isSelect) {
[modelArr addObject:model];
}else{
switch (type) {
case FileMovie:
{
Movie *mov = model;
for (Movie *movieTemp in modelArr) {
if ([movieTemp.movieId isEqualToString:mov.movieId]) {
[modelArr removeObject:movieTemp];
break;//移除后一定要break,有时候可能会出错
}
}
break;
}
case FileActivity:
{
NSLog(@"FileActivity");
break;
}
case FileCinema:
{
NSLog(@"FileCinema");
break;
}
}
}
//最后把数据进行归档
[NSKeyedArchiver archiveRootObject:modelArr toFile:path];
}
@end
3.简单截图