您的位置:首页 > 其它

OC学习小总结

2014-08-16 21:26 253 查看
一、下载

下载的几种方式

同步下载三种方法

//网页下载
NSURL *url=[NSURL URLWithString:@"http://www.baidu.com/?tn=96581013_hao_pg"];
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil] ;
NSLog(@"000000%@",str);


2.//根据下载方法需要什么,定义什么
NSURL *url=[NSURL URLWithString:@"http://www.baidu.com/img/bdlogo.png"];
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//创建指针
NSURLResponse *response;
NSError *error;

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
//如果下载失败就打印fail
if (error) {
NSLog(@"fail");
return;
}

//将response强制转化为NSHTTPURLResponse类型,因为statusCode是NSHTTPURLResponse的一个属性
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//请求成功状态码为200,写入文件
if (httpResponse.statusCode == 200) {
[data writeToFile:@"/Users/apple/Desktop/test.png" atomically:YES];

}


3.
NSURL *url=[NSURL URLWithString:@"http://www.baidu.com/img/bdlogo.png"];
//读取网络URL里面的内容
NSData *data=[NSData dataWithContentsOfURL:url];
//将data内容写入文件
[data writeToFile:@"/Users/apple/Desktop/test.png" atomically:YES];


异步下载二种方法

2.根据协议封装下载文件

在down.h中

#import <Foundation/Foundation.h>
@class download;
//定义协议及协议方法
@protocol downloaddelegate<NSObject>
@optional
-(void)downloadprocess:(float)process;
@required
-(void)downloadfinished:(download *)down;

@end
//挂出下载协议方法
@interface download : NSObject <NSURLConnectionDataDelegate>
@property(nonatomic,weak)id<downloaddelegate>delege;
@property (nonatomic, copy) NSString *path;
@property (nonatomic, copy)NSMutableData *data1;

-(void)download;
- (void)start;
@end


在down.m中

#import "download.h"
@interface download()
{
NSURLConnection *connection;
long long totallegth;

}
@end
@implementation download

- (id)initWithPath:(NSString *)path
{
if (self = [super init]) {
self.path = path;
}

return self;
}

-(void)download
{
NSURL *url=[NSURL URLWithString:_path];
NSLog(@"路径%@",_path);
NSURLRequest *request=[NSURLRequest requestWithURL:url];
connection=[NSURLConnection connectionWithRequest:request delegate:self];

}

- (void)start
{
//    开始下载
[connection start];
}

//判断是否出错
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{

NSLog(@"下载出错%@",error);

}

//请求响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{

NSHTTPURLResponse *httprespose=(NSHTTPURLResponse *)response;
if (httprespose.statusCode==200) {
totallegth=httprespose.expectedContentLength;
}
NSLog(@"预计总长度%lld",totallegth);

}

//接收数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
_data1=[[NSMutableData alloc]init];

[_data1 appendData:data];

//对于Optional修饰的方法,需要做判断后才能调用

if (_delege && [_delege respondsToSelector:@selector(downloadprocess:)]){
NSLog(@"下载选择");

[_delege downloadprocess:(float)_data1.length/totallegth];
}

}

//下载完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//3. 使用指针调用协议方法

NSLog(@"调用协议的方法。。。");
[_delege downloadfinished:self];
}

@end


在ViewController.m中

#import "ViewController.h"
#import "download.h"
@interface ViewController() <downloaddelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
download *downloader = [[download alloc] init];
downloader.path=@"http://www.baidu.com";
[downloader download];
//在两个类中对象间建立联系
downloader.delege=self;

download *downloader2=[[download alloc] init];
downloader2.path=@"https://github.com/nicklockwood/iVersion";
[downloader2 download];
downloader2.delege=self;

// Do any additional setup after loading the view, typically from a nib.
}
//协议中必须实现的方法
-(void)downloadfinished:(download *)down
{
NSString *str = [[NSString alloc] initWithData:down.data1 encoding:NSUTF8StringEncoding];
NSLog(@"下载完成。。%@",str);
}
//协议中可选实现的方法
-(void)downloadprocess:(float)process
{
NSLog(@"下载正在进行。。");
NSLog(@"progress进程: %.2f", process);

}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


二、协议

OC协议:实际上就是两个对象直接的通信

一个对象的任务让另一个对象完成,也叫代理模式。

协议的工作流程:

类A 类B

类A不想实现,因此需要外包出去

1)先制定一个协议(方法列表)            1)如果类B想接单,需先具备资质(挂出协议)

2)类A的对象需要能找到类B的对象(delegate指针引用)  2)类B需要实现require的方法,可选实现optional的方法

3)类A的对象想完成这些工作时,通过代理让类B的对象干活



列子如下:

先制定协议

@protocol BiteDelegate <NSObject>
//可选实现方法
@optional
- (void)bitepeople:(id)someone;

@end


在Person.h中

#import <Foundation/Foundation.h>
#import "BiteDelgate.h"
#import "Dog.h"
#import "Cat.h"

@interface Person : NSObject
//设置Dog属性
@property(nonatomic,strong) Dog *dog;
@property(nonatomic,strong) Cat *cat;
@property(nonatomic,strong)id<BiteDelegate>delegate;

@end


在Person.m中

#import "Person.h"
#import "Dog.h"
#import "Cat.h"
@implementation Person

@end


在Dog.h中

#import <Foundation/Foundation.h>
#import "BiteDelgate.h"
//挂出协议
@interface Dog : NSObject <BiteDelegate>

@end


在Dog.m中

#import "Dog.h"

@implementation Dog

-(void)bitepeople:(id)someone
{

NSLog(@"咬死他");
}

@end


在Cat.h中

#import <Foundation/Foundation.h>

@interface Cat : NSObject

@end


在Cat.m中

#import "Cat.h"

@implementation Cat

@end


三、数据解析

1.Json解析

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// json里面只有5种数据类型NSsting、NSdictiongnary,NSnumber、NSarray、Bool;
NSString *jsonStr = @"{\"name\":\"Zhangsan\",\"age\":20,\"dog\":{\"name\":[\"XiaoHei\", \"XiaoQiang\"]}}";
NSData *data = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
//将Json数据转化为OC的对象
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
//    打印字典
NSLog(@"%@", dict);
//    打印字典内键为“dog”的内容
NSLog(@"%@", dict[@"dog"][@"name"]);

//    创建字典对象,并用字典dict的dog字典对其初始化

NSDictionary *dogDict = [dict objectForKey:@"dog"];
//    把字典里的name键所对应内容放入数组内
NSArray *array = [dogDict objectForKey:@"name"];
NSLog(@"%@", array);

//    创建字符串并把数组的第一个元素对其进行初始化
NSString *name = [array objectAtIndex:0];
NSLog(@"%@", name);
//  创建一个NSNumber对象,并将dict中age所指向的内容对其进行初始化
NSNumber *num = [dict objectForKey:@"age"];
NSLog(@"%@", num);

//字典、数组、数值、字符串
NSArray *arr = @[@123, @"123", @{@"name": @"Lisi", @"age": @30}];
//将OC的对象转化为Json数据
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:nil];
NSString *str = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@", str);

//    将str写入"/Users/apple/Desktop/test.json"内
[str writeToFile:@"/Users/apple/Desktop/test.json" atomically:YES encoding:NSUTF8StringEncoding error:nil];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


2.xml解析



<>表示标签,开标签和闭标签
1)添加解析工具



2).引入头文件
3).开始解析

#import "ViewController.h"
#import "XMLDictionary.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
NSString  *xmlstr=@"<person sex=\"female\"><firstname>Anna</firstname><lastname>Smith</lastname></person><person><sex>female</sex><firstname>Anna</firstname><lastname>Smith</lastname></person>;";

//xml 都是转化为字典
NSDictionary *dic=[NSDictionary dictionaryWithXMLString:xmlstr];
NSLog(@"%@",dic);
NSLog(@"%@",[dic objectForKey:@"firstname"]);

// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


3.HTML解析

1)1.引入解析工具



2)添加如图所示框架



3)在build setting中加入"/usr/include/libxml2" 到 "header search paths"



4)引入头文件

#import "ViewController.h"
#import "HTMLParser.h"
#import "HTMLNode.h"
#import <libxml/HTMLtree.h>


5)开始解析

#import "ViewController.h"
#import "HTMLParser.h"
#import "HTMLNode.h"
#import <libxml/HTMLtree.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
NSError *error=nil;

NSString *html=[[NSString alloc]initWithContentsOfURL:[NSURL URLWithString:@"http://dict.youdao.com/search?le=eng&q=interaction&keyfrom=dict.top"] encoding:NSUTF8StringEncoding error:nil];
// 将HTML转为oc语言
HTMLParser *parser=[[HTMLParser alloc]initWithString:html error:nil];
if (error) {
NSLog(@"error:%@",error);
return;
}
// NSLog(@"%@",html);
//找body
HTMLNode *bodeNode=[parser body];
//根据class找到一个子节点
HTMLNode *htmlnode=[bodeNode findChildOfClass:@"keyword"];
//打印htmlnode里面的内容
NSLog(@"%@",[htmlnode contents]);
HTMLNode *html1=[bodeNode findChildOfClass:@"trans-container"];
NSArray *array=[html1 findChildTags:@"li" ];
//将标签里面的东西例举出来
for(HTMLNode *aa in array){
NSLog(@"%@",[aa contents]);
}


四、对象之间的传参

1)第一个页面传到第二个页面

在ViewController.m里面

#import "ViewController.h"
#import "SecondViewController.h"

@interface ViewController ()
{
//设置全局变量
int i;

}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem];
btn.frame=CGRectMake(100, 200, 100, 40);
btn.backgroundColor=[UIColor greenColor];
[btn addTarget:self action:@selector(didclicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
i=10;
}

-(void)didclicked{

SecondViewController *sec=[[SecondViewController alloc]init];
//    将i的值赋值给第一个页面的属性t
sec.t=i;
[self presentViewController:sec animated:YES completion:nil];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


在SecondViewController.h中

#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
//设置属性
@property int t;
@end


在SecondViewController.m中

#import "SecondViewController.h"

@interface SecondViewController ()@end

@implementation SecondViewController

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem];
btn.backgroundColor=[UIColor orangeColor];
btn.frame=self.view.bounds;
[btn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
//打印第一个页面传来的t值
NSLog(@"%d",_t);
}
-(void)back
{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}

@end


2.将第二个页面的值传给第一个页面

在ViewController.h里面

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
//设置属性
@property int n;
@end


在ViewController.m里面

#import "ViewController.h"
#import "SecondViewController.h"

@interface ViewController ()@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem];
btn.frame=CGRectMake(100, 200, 100, 40);
btn.backgroundColor=[UIColor greenColor];
[btn addTarget:self action:@selector(didclicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}

-(void)didclicked{

SecondViewController *sec=[[SecondViewController alloc]init];
//    将第二个页面的对象的属性指向第一个页面,实现第二个页面的值传到第一页面必须的留下的地址
sec.viewctr=self;
[self presentViewController:sec animated:YES completion:nil];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


在SecondViewController.h中

#import <UIKit/UIKit.h>
#import "ViewController.h"
@class ViewController;
@interface SecondViewController : UIViewController
//创建第二个页面的一个属性,使其能够使用这个类的属性,能够实现的第二个页面传到第一个页面
@property ViewController *viewctr;
//设置属性
@property int m;
@end


在SecondViewController.m中

#import "SecondViewController.h"

@interface SecondViewController ()
{
//设置全局变量
int k;

}
@end

@implementation SecondViewController

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {

}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem];
btn.backgroundColor=[UIColor orangeColor];
btn.frame=self.view.bounds;
[btn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
k=5;
//    将k的值赋值给给第一个页面的n
self.viewctr.n=k;
//打印传给第一个页面的值
NSLog(@"n=%d",self.viewctr.n);

}
-(void)back
{
[self dismissViewControllerAnimated:YES completion:nil];

}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end


3.通过协议传参

在ViewController.h里面

#import "ViewController.h"
#import "SecondViewController.h"

@interface ViewController ()<translatedelegate>
{
SecondViewController *secondCtrl ;
int k;
}

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
btn.frame = CGRectMake(10, 100, 100, 40);
[btn setTitle:@"按钮" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(didClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];

// Do any additional setup after loading the view, typically from a nib.
}
- (void)didClick
{
secondCtrl = [[SecondViewController alloc] init];
//在两个协议间建立联系
secondCtrl.delegate = self;
[self presentViewController:secondCtrl animated:YES completion:nil];
}
- (int)fetchValue:(int)value
{
//传值
k=value;
NSLog(@"+++second%@---%d",secondCtrl, k);
return 123;

}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


在SecondViewController.h中

#import <UIKit/UIKit.h>
//定义协议
@protocol translatedelegate
@optional
- (int)fetchValue:(int)value;
@end

@interface SecondViewController : UIViewController
//定义指针用来指向实现协议的对象
@property (nonatomic,weak)id<translatedelegate>delegate;
@property (nonatomic, assign) int value;
@end


在SecondViewController.m中

#import "SecondViewController.h"

@interface SecondViewController ()
{
int k;
}

@end

@implementation SecondViewController

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.view.backgroundColor=[UIColor whiteColor];
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
btn.frame = CGRectMake(10, 100, 100, 40);
[btn setTitle:@"按钮" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(didClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
// Do any additional setup after loading the view.
}

- (void)didClick
{

_value=30;
//使用指针来调用协议里面的方法
[self.delegate fetchValue:_value];
[self dismissViewControllerAnimated:YES completion:nil];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: