NSUrlSession-Study

学习NSUrlSession的使用

我的服务器是搭建在本地的,所以可以看到我访问的都是localhost,数据也是写死的

  • 基本使用
1
2
3
4
5
6
7
8
9
//  下面的代码,放进一个按钮点击事件中执行

NSURLSession *session = [NSURLSession sharedSession];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://localhost/studing/1.php"]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);
}];
[task resume];

打印的内容,就是http请求所返回的所有内容

  • next,感受异步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//按钮点击
- (void)buttonRequestAction:(UIButton *)sender
{
NSURLSession *session = [NSURLSession sharedSession];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://localhost/studing/1.php"]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
sleep(3); // 延迟
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", string);
}];
[task resume];

}
// 按钮点击
- (void)otherAction:(UIButton *)sender
{
NSLog(@"并没有阻塞主线程");
}

点击request请求服务器,再点击另一个按钮的时候,并没有阻塞主线程
这就是NSUrlSession的强大之处,next,后面继续

view和layer缠绵

view 的 frame bounds center

要先讲解frame,还是得讲解bounds;

当一个view添加到viewcontroller.view时,其实是基于viewcontroller.view的坐标系;

就像viewcontrolelr.view添加到uiwindow,其实是基于uiwindow的坐标系;

view的bounds属性就是添加子view的时候,给子视图参照的坐标系;

该坐标系是由bounds和center计算,frame只是方便描述这两个值而已

iOS7新特性UIDynamic

iOS-UIDynamic

初试

UIDynamic是iOS7引入的UIKit动力学,目的是将2D物理引擎引入UIKit.
最明显的就是短信界面,拖动的时候有物理效果.
通常的时候我们仅使用CA和UIView的动画即可,除非我们需要引入非常逼真的交互设计的时候才使用
来看看新的基本概念:

  • UIDynamicItem:用来描述一个力学物体的状态,其实就是实现了UIDynamicItem委托的对象,或者抽象为有面积有旋转的质点.
  • UIDynamicBehavior:动力行为的描述,用来指定UIDynamicItem应该如何运动,定义适用的物理规则.一般使用该类的子类对象来对一组UIDynamicItem对象应该遵守的行为规则进行描述.
  • UIDynamicAnimator:动画的播放者,动力行为(UIDynamicBehavior)的容器,添加到容器的行为将发挥作用
  • ReferenceView:等同于力学参考系,当添加力学的UIView是ReferenceView的子view或就是它本身的时候,动力就会发生作用.但如果是它本身,虽然能发挥作用,但这个力学仿真就不逼真了

喵神原文: http://onevcat.com/2013/06/uikit-dynamics-started/ onevcat

关于iOS屏幕方向让你找到存在感

关于iOS屏幕方向,让你找到方向感

看了这篇文章,可能是我太笨,有可能是作者太牛逼,反正我是没看懂,都没下他写的demo
写的什么鬼,自己来搞一搞
原文链接:http://lvwenhan.com/ios/458.html

新建一个空项目,在target->General->Deployment Info中勾选

  • Protrait
  • Landscape Left
  • Landscape Right

不然只会支持你所选择的方向(那就没得玩了)
然后再Main.storyboard中拖入一个按钮,放到左上角一些,why?因为不在界面上放个东西,改变方向你会晕的
现在run,手动改变方向command+⬅️,效果给你个截图

可以看到屏幕的方向会随着设备的方向而改变,Landscape Left(顺时针转,home键在左),如果用户锁定了屏幕旋转,那就不用讨论设备转向的情况下屏幕跟随转向的问题了

1
2
3
4
5
6
7
//file ViewController.m
...
- (BOOL)shouldAutorotate
{
return NO;
}
...

显而易见的,这个方法控制我们的页面是否跟随设备转动而改变方向

ReactiveCocoa初体验

Reactive的学习和使用

Podfile文件内容:

1
2
3
platform :ios, '7.0'

pod 'ReactiveCocoa', '2.1.8'

运行$ pod install

安装完成后使用xcworkspace文件打开项目

RWViewController.m文件

1
#import <ReactiveCocoa/ReactiveCocoa.h>

在viewDidLoad中添加代码

1
2
3
[self.usernameTextField.rac_textSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];

现在我们就能体验到信号编程了

httpbody中字符编码问题-iOS解决方案

httpbody中字符编码问题

在工作中遇到一个问题,本来可以直接将字典转换成json,再转换成nsdata,设置到httpbody中
就可以请求服务器了,可是服务器不方便解析(其实是做服务器开发的不知道怎么解析收到的数据|_|)
最后只能将字典遍历键值对变成查询字符串的样子设置在body中

For Example:

1
2
3
4
5
6
{
"username" : "yutiya",
"age" : 18
}
变成:
username=yutiya&age=18

通常上传到服务器的数据都需要编码一次,不过我上传的数据全是[a-zA-Z0-9]等等,不用编码也是可以的
可是问题出现了,上传到服务器的数据中有+号,看了阮一峰的博客,从中可以看到+在服务器会被自动解析成空格
简直是见了鬼,然后就得改代码呗

1
2
3
4
NSString *str = @"username=yutiya&lock=abc+bbc+ccc";
NSLog(@"%@", [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]);
console >>>:
2015-07-30 14:51:07.212 httpbody中的字符编码[6470:156038] username=yutiya&lock=abc+bbc+ccc

然而并没有什么卵用,好,我换了一个方法

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×