41.AFN的使用和收藏工具

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.简单截图

这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值