ios urlvue route回调 怎么回调

谈谈iOS的回调 - 简书
谈谈iOS的回调
开始之前先讲一个小故事:
有一天你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。
在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
由此我们就容易理解一些代码中的回调,通俗地来讲就是:
一般写程序是你调用系统的API,如果把关系反过来,你写一个函数,让系统调用你的函数,那就是回调,那个被系统调用的函数就是回调函数。
好滴~理解了回调的概念,我们就正式进入主题,谈谈iOS中几种常见的回调:
1.目标-动作对
terget-action
当特定的事件x发生时,向指定对象发送特定的消息,这里接收消息的对象是目标target,消息的选择器就是动作action。这种回调是比较常见的,我们使用在Xcode中的IB图形编译器会用到如下的代码。
- (IBAction)callback:(id)sender {
//do something you like~
不用IB图形编译器,用代码就是:
[_shopBtn addTarget:self
action:@selector(enterShop)
forControlEvents:UIControlEventTouchUpInside];
2.委托协议 protocol
当特定的事件x发生时,像遵守相应协议的辅助对象为发送消息,委托对象delegate和数据源dataSource都是常见的辅助对象。这种回调方式最典型的是tableView的协议,内容较多,本文就不再赘述了,可以参见
3.通告 Notification
运用观察者模式,将自己注册为Observer。eg:
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(outputWithNote:)
name:@"OutputArrayNotification" object:nil];
- (void)viewWillDisappear:(BOOL)animated{
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:@"OutputArrayNotification"
object:nil];
- (IBAction)notificationCallback:(id)sender {
NSString *s = @"NitificationCallback";
[[NSNotificationCenter defaultCenter]
postNotificationName:@"OutputArrayNotification"
object:s];
- (void)outputWithNote:(NSNotification *)aNotification
NSString *s = [aNotification object];
_textLabel.text =
4.代码块block
其实block可以理解成C语言的函数指针。^_^
double (^divBlock) (double, double) = ^(double a, double b) {
return a/b;
double quotient = divBlock(4.0, 2.0);
附上介绍block的官方文档:
什么时候用什么方式?1,对于只对一个对象发出回调时,用目标-动作对。2,对于对一个对象发出多条回调时,用协议。3,对于要触发多个对象的回调时,用通告。1001人阅读
iOS(165)
一、NSURLConnection的常用类
(1)NSURL:请求地址
(2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....
(3)NSMutableURLRequest:NSURLRequest的子类
(4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据
二、NSURLConnection的使用
1.简单说明
使用NSURLConnection发送请求的步骤很简单
(1)创建一个NSURL对象,设置请求路径(设置请求路径)
(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)
(3)使用NSURLConnection发送NSURLRequest(发送请求)
使用block回调方法发送异步请求
#import &YYViewController.h&
#import &MBProgressHUD+MJ.h&
@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UITextField *
@property (weak, nonatomic) IBOutlet UITextField *
- (IBAction)
@implementation YYViewController
- (IBAction)login {
1.提前的表单验证
if (self.username.text.length==0) {
[MBProgressHUD showError:@&请输入用户名&];
if (self.pwd.text.length==0) {
[MBProgressHUD showError:@&请输入密码&];
2.发送请求给服务器(带上账号和密码)
//添加一个遮罩,禁止用户操作
[MBProgressHUD showMessage:@&正在努力加载中....&];
1.设置请求路径
NSString *urlStr=[NSString stringWithFormat:@&http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@&,self.username.text,self.pwd.text];
NSURL *url=[NSURL URLWithString:urlStr];
2.创建请求对象
NSURLRequest *request=[NSURLRequest requestWithURL:url];
3.发送请求
//3.1发送同步请求,在主线程执行
NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
//(一直在等待服务器返回数据,这行代码会卡住,如果服务器没有返回数据,那么在主线程UI会卡住不能继续执行操作)
//3.1发送异步请求
//创建一个队列(默认添加到该队列中的任务异步执行)
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
//获取一个主队列
NSOperationQueue *queue=[NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//当请求结束的时候调用(有两种结果,一个是成功拿到数据,也可能没有拿到数据,请求失败)
NSLog(@&--block回调数据--%@---%d&, [NSThread currentThread],data.length);
//隐藏HUD,刷新UI的操作一定要放在主线程执行
[MBProgressHUD hideHUD];
//解析data
{&success&:&登录成功&}
{&error&:&用户名不存在&}
{&error&:&密码不正确&}
if (data) {//请求成功
NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSLog(@&%@&,dict);
//判断后,在界面提示登录信息
NSString *error=dict[@&error&];
if (error) {
[MBProgressHUD showError:error];
NSString *success=dict[@&success&];
[MBProgressHUD showSuccess:success];
//请求失败
[MBProgressHUD showError:@&网络繁忙,请稍后重试!&];
NSLog(@&请求发送完毕&);
@end代码说明:
block代码段:当服务器有返回数据的时候调用会开一条新的线程去发送请求,主线程继续往下走,当拿到服务器的返回数据的数据的时候再回调block,执行block代码段。这种情况不会卡住主线程。
队列的作用:决定这个block操作放在哪个线程执行?
刷新UI界面的操作应该放在主线程执行,不能放在子线程,在子线程处理UI相关操作会出现一些莫名的问题。
(1)创建一个操作,放在NSOperation队列中执行,默认是异步执行的。
(2)mainqueue & 返回一个和主线程相关的队列,即主队列。
说明:使用NSJSONSerialization 返回的对象,取决于最外层是什么,如果是{}那就是字典,[]那就是数组等。
补充说明:
首先确定请求路径,然后创建请求对象(默认发送的时get请求),使用异步方法(一调用这个方法,它会自动开启一个子线程去发送请求,当请求成功,数据返回的时候自动调用内部的代码段,这个代码段在那个线程执行取决于队列,如果是主队列,那么在子线程发送请求成功拿到服务器的数据后,回到主线程中解析数据,刷新UI界面)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1272585次
积分:23430
积分:23430
排名:第305名
原创:1234篇
转载:156篇
评论:123条
(9)(9)(19)(8)(14)(19)(35)(30)(51)(54)(60)(76)(27)(57)(96)(80)(33)(14)(40)(83)(83)(82)(106)(36)(26)(41)(82)(44)(26)(19)(24)(7)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'今天看啥 热点:
IOS实现打电话后回调,IOS实现打电话回调
UIWebView *callWebview =[[UIWebView alloc] init] ;
或者 tel://
NSURL *telURL =[NSURL URLWithString:@&tel://10086&];
[callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
[self.view addSubview:callWebview];
你这个是返回主界面的,UIWebView *callWebView=[[UIWebView alloc]init];if(!callWebView){callWebView=[[UIWebView alloc]initWithFrame:CGRectZero];}[callWebView loadRequest:[NSURLRequest requestWithURL:@&tel:&]];[self.view addSubview:callWebView];这个是返回程序的
你越狱了吗,一般不会出现这个问题的!要是总这样的话,你就要重新刷机了!
相关搜索:
相关阅读:
相关频道:
Android教程最近更新IOS回调机制
我的图书馆
IOS回调机制
Xcode5.0正式版
IOS7和Xcode5正式版在昨天正式可以下载。IOS7不多说了,交互设计,界面风格,操作的简化程度都属于比较领先的水平。
这里来说说Xcode5正式版,和以前的Xcode5测试版来比,正式版改动不大,不过也有稍许变化。
整体来讲,跟Xcode4.6比,属于换了一个时代- -(因为以前的工程换到这里编译需要改很多地方)
Xcode5给我的感觉就是:界面简洁扁平化,配置工程图形化,还有就是。。白。
为什么说白,看看配置IB和配置工程就知道了。。。
相比4.6来讲,5在操作上还是有很多大的改进。也可以用于开发旧版本的项目,需要把arm64去掉,把XIB文件设置成之前的版本就好。不过也有一些细节需要注意。所以嫌麻烦的话可以用之前版本的- -。
言归正传,这里来认识下三种IOS常见的回调模式。
作为IOS中最常见的通讯模式,代理几乎无处不在。
这里有一个数组,我们首先通过代理的方式将数组传递到其他方法中去。
设置协议及方法
@protocol CallBackD
@interface ViewController : UIViewController
@property (weak, nonatomic) id&CallBackDelegate&
@protocol CallBackDelegate &NSObject&
- (void)showArrayWithDelegate:(NSArray *)
@interface ViewController () &CallBackDelegate&
点击按钮传递数组让其显示
- (IBAction)delegateCallBack
NSDictionary *dict = @{@"array": @[@"Chelsea", @"MUFC", @"Real Madrid"]};
NSArray *array = dict[@"array"];
[self.delegate showArrayWithDelegate:array];
调用,显示
- (void)showArrayWithDelegate:(NSArray *)array
_outputLabel.text = array[2];
最重要也是最容易忽略的,就是一定要设置delegate的指向。
完成后屏幕显示
使用通知中心
通知中心的方式可以不用设置代理,但是需要设置观察者和移除观察者。
- (IBAction)callBack
NSDictionary *dict = @{@"array": @[@"Chelsea", @"MUFC", @"Real Madrid"]};
NSArray *array = dict[@"array"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"OutputArrayNotification" object:array];
注册和移出观察者
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(outputWithNote:) name:@"OutputArrayNotification" object:nil];
- (void)viewDidDisappear:(BOOL)animated
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"OutputArrayNotification" object:nil];
- (void)outputWithNote:(NSNotification *)aNotification
NSArray *receiveArray = [aNotification object];
_outputLabel.text = receiveArray[0];
什么是Block:
块代码以闭包得形式将各种内容进行传递,可以是代码,可以是数组无所不能。块代码十分方便将不同地方的代码集中统一,使其易读性增强。
来看这里怎么进行数组传递。
typedef void (^Arr_Block)(NSArray *array);
- (void)showArrayUsingBlock:(Arr_Block)block
NSDictionary *dict = @{@"array": @[@"Chelsea", @"MUFC", @"Real Madrid"]};
NSArray *array = dict[@"array"];
block(array);
调用方法,显示
- (IBAction)blockCallBack
[self showArrayUsingBlock:^(NSArray *array) {
_outputLabel.text = array[1];
三种模式都很轻松~
以上就是本篇博客全部内容,欢迎指正和交流。转载注明出处~
TA的最新馆藏
喜欢该文的人也喜欢--- 消息推送
消息推送集成参考友盟&
注意测试环境下,(友盟)设备在手机启动程序的时候已经在友盟服务器注册了,但是还需要手动添加设备方可推送
消息推送方法回调
一共有以下情况
应用启动,在前台显示收到推送消息&
应用会alert出来(这里我没有做处理)
应用启动,退到后台收到推送消息&
在方法里面
- (void) application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)notification
//数据在notification里面
应用未启动收到推送信息(由于我的工程是用了covadova框架,所以这里主要说一下如何在covadova框架的适配)
首先,这里的前提是由于应用关闭的状态下来接收推送消息的,所以要明白一点
&Each device establishes an accredited and encrypted IP connection with the service and&receives notifications over this persistent connection. If a notification for an app arrives&when that app is not running, the device alerts the user that the app has data waiting for&it.&&意思就是,每个设备都会与苹果的provider(服务器)加密连接,如果一个app的推送消息送达,但是app没有运行,那么设备就会提醒用户去处理该app的推送消息,简而言之,无论多少个应用有推送功能,无论该应用是运行或关闭,设备都会与苹果服务器进行加密连接。
二,在方法&
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOption
其实我们在里面设置一些UI全局参数以及自定义控制器,如果之前没有接触过消息推送的话,可能没留意到这个启动参数,如果没有接收到推送消息,那么这个启动参数(字典就为null),如果应用关闭的时候接收到推送消息然后点击这个推送消息来启动应用,那么里面的字典就存储了该推送消息。
三,我要实现页面跳转,由于covadova框架只有一个UIWebView实例,所以我要等webView加载完毕之后才能执行目标跳转,这里我需要了解控制器与AppDelegate里面个方法的执行顺序,这哥们在这方面做了些功夫,帮了不少忙&只是我在xcode7.1.1里面运行多次,都是viewDidAppearance运行在最后而非applicationDidBecomeActive,于是我觉得还是以自己当前的版本为准,在viewDidAppearace里面加载目标页面,但失败了,于是乎我猜想,可能是在加载目标url后,程序还在继续执行和面的代码,导致覆盖掉了效果,于是我想到了利用异步线程处理,当然由于是界面渲染,所以最后一定要回到主线程执行。像这样
dispatch_queue_t queue = dispatch_queue_create("some", DISPATCH_QUEUE_CONCURRENT);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), queue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
UIWebView * webView = window.rootViewController.view.subviews[0];
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.location='%@'",_targetUrl]];
最后我发现,无论在viewDidAppearance还是在applicationDidBecomeActive方法里面执行该段代码,均可获得一样的效果,于是乎为了方便,我最终在appdelegate里面完成跳转。
阅读(...) 评论()

我要回帖

更多关于 vue route回调 的文章

 

随机推荐