1.UIStoryBoard
2. segue跳轉傳值
3. UIColor配色
//1. 十進位制配色
[UIColor colorWithRed:163.0/255.0 green:148.0/255.0 blue:128.0/255.0 alpha:1.0];
//2. 設定16進位制顏色(同上)
[UIColor colorWithRed:0xba/255.0 green:0x21/255.0 blue:0xd5/255.0 alpha:1.0];
4. XML解析
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic,copy) NSString *pid;
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *sex;
@property(nonatomic,copy) NSString *age;
@end
#import <Foundation/Foundation.h>
#import "Person.h"
@interface XMLUtil : NSObject<NSXMLParserDelegate>
@property(nonatomic,strong) NSXMLParser *par;
@property(nonatomic,strong) Person *person;
//存放每個person
@property(nonatomic,strong) NSMutableArray *list;
//標記當前標籤,以索引找到XML檔案的內容
@property(nonatomic,copy) NSString *currentElement;
//宣告parse方法,通過它實現解析
-(void)parse;
@end
@implementation XMLUtil
-(instancetype)init {
self = [super init];
if (self) {
//獲取事先準備好的XML檔案
NSBundle *b = [NSBundle mainBundle];
NSString *path = [b pathForResource:@"test" ofType:@".xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
self.par = [[NSXMLParser alloc] initWithData:data];
//新增代理
self.par.delegate = self;
//初始化陣列,存放解析後的資料
self.list = [NSMutableArray arrayWithCapacity:5];
}
return self;
}
//幾個代理方法的實現,是按邏輯上的順序排列的,但實際呼叫過程中中間三個可能因為迴圈等問題亂掉順序
//(1).開始解析
-(void)parseDiaStartCocument:(NSXMLParser *)parser {
NSLog(@"parserDidStartDocument...");
}
//(2).準備節點
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
self.currentElement = elementName;
if ([self.currentElement isEqualToString:@"student"]) {
self.person = [[Person alloc] init];
}
}
//(3). 獲取節點內容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if ([self.currentElement isEqualToString:@"pid"]) {
[self.person setPid:string];
}else if ([self.currentElement isEqualToString:@"name"]) {
[self.person setName:string];
}else if ([self.currentElement isEqualToString:@"sex"]) {
[self.person setSex:string];
}else if ([self.currentElement isEqualToString:@"age"]) {
[self.person setAge:string];
}
}
//(4). 解析完一個節點
-(void)parseDidEndDocument:(NSXMLParser *)parser {
NSLog(@"parserDidEndDocument...");
}
//外部呼叫藉口
-(void)parse {
[self.par parse];
}
@end
5. JSON解析
//1. Json資料封包
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];
//isValidJSONSerialization判斷物件是否可以構建成json物件
if ([NSJSONSerialization isValidJSONObject:dic]) {
NSError *error;
//建立一個json從Data,NSJSONWritingPrettyPrinted指定的JSON資料產的空白,使輸出更具可讀性
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];
NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"json data:%@",json);
}
//2. Json資料解析
NSError *error;
//載入一個NSURL物件
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.weather.com.cn/data/101120101.html"]];
//將請求的url資料放到NSData物件中
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//IOS自帶解析類NSJSONSerialization從response中解析出資料放到字典中 - crash here - TBD
NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
NSDictionary *weatherInfo = [weatherDic objectForKey:@"weatherinfo"];
// NSDictionary *text = [NSString stringWithFormat:@"今天是%@ %@ %@ 的天氣狀況是:%@ %@",
// [weatherInfo objectForKey:@"day_y"],
// [weatherInfo objectForKey:@"week"],
// [weatherInfo objectForKey:@"city"],
// [weatherInfo objectForKey:@"weather1"],
// [weatherInfo objectForKey:@"temp1"]];
NSDictionary *text = [NSString stringWithFormat:@"今天是 %@ %@ %@ 的天氣狀況是: %@ %@",[weatherInfo objectForKey:@"day_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"],[weatherInfo objectForKey:@"temp1"]
];
NSLog(@"weatherInfo: %@",text);
6. 多執行緒
//// 1.NSThread - 蘋果封裝後,並且完全面向物件
// //(1). 先建立執行緒類,在啟動
// //建立
// NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:nil];
//
// //啟動
// [thread start];
//
// //(2). 建立並啟動
// [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil];
//2. GCD - 蘋果為多核的並行運算提出的解決方案
//在GCD中,加入了2個非常重要的概念:任務和佇列.
//佇列:分序列和並行2種
//(1). 主佇列:用於重新整理UI
//建立
// dispatch_queue_t queue = dispatch_get_main_queue();
//(2).自己建立的佇列:用於耗時漸咋
//序列佇列
// dispatch_queue_t queue = dispatch_queue_create("tk.bourne.testQueue", NULL);
//並行佇列
// dispatch_queue_t queue = dispatch_queue_create("tk.courne.testQueue", DISPATCH_QUEUE_SERIAL);
//(3). 全域性並行佇列:只要是並行佇列任務一般都加入到這個佇列,這是系統提供的一個併發佇列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_SERIAL, 0);
//任務:分同步和非同步兩種
//(1).同步任務:不會另開執行緒,會阻塞當前執行緒
dispatch_sync(queue, ^{
//code here
});
//(2).非同步任務:會另開執行緒,不會阻塞當前執行緒
dispatch_sync(queue, ^{
//code here
});
//3. NSOperation和NSOperationQueue
/*
對GCD的封裝,完全面向物件,NSOperation和NSOperationQueue分別對應GCD的任務和佇列。
操作步驟: 1. 將要執行的任務封裝到一個NSOperation物件中.
2. 將此任務新增到一個NSOperationQueue物件中.
注意:NSOperation只是一個抽象類,所以不能封裝任務。但它有2個子類用於封裝任務。
分別是:NSInvocationOperation 和 NSBlockOperation。建立一個Operation後,
需要呼叫start方法來啟動任務,它會預設在當前佇列同步執行。當然可以在中途取消一個任務,
只需要呼叫起cancel方法即可.
*/
//NSInvocationOperation:需要傳入一個方法名
//1.建立NSInvocation物件
// NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
//
// //2.開始執行
// [operation start];
//1.建立NSBlockOperation物件
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
}];
//可以新增多個block
for (NSInteger i = 0; i < 5; i ++ ) {
[operation addExecutionBlock:^{
NSLog(@"第%ld次: %@",i,[NSThread currentThread]);
}];
}
//2.開始執行
[operation start];
7.動畫效果
8. NSUserDefaults
//.簡介
/*
NSUserDefaults是一個單例
他可以用於資料的永久儲存,而且簡單實用,這是它可以讓資料自由傳遞的一個前提,
也是大家喜歡用它儲存簡單資料的一個主要原因.
*/
//1. NSUserDefaults
// NSUserDefaults支援的資料型別有: NSNumber(NSInteger、float、double),NSString、NSDate、NSArray、NSDictionary、BOOL;
//將NSString物件儲存到NSUserDefaults中
// NSString *passWord = @"123456";
// NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
// [user setObject:passWord forKey:@"userPassWord"];
//將資料取出來
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *passWord = [user objectForKey:@"userPassWord"];
//2.NSUserDefaults儲存物件
//NSUserDafaults本身不支援自定義物件的儲存,不過它支援NSData的型別,所以可以選擇使用歸檔,將自定義物件轉為NSData型別後存入NSUserDefaults.
//(1).將Student類的資料歸檔
//(2).將Student物件存入NSUserDefaults
Student *student = [[Student alloc] int];
student.name = @"ladyO";
student.sex = @"女";
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:data forKey:@"oneStudent"];
//(3).從NSUserDefaults取出Student物件
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSData *data = [user objectForKey:@"oncStudent"];
Student *student = [NSKeyedArchiver unarchiveObjectWithData:data];
9. 網路請求