一、回调函数:
class A
{
f1();
f2();
B *b;//A中定义B的对象为成员变量
}
A:f1()
{
b->f3(&f2);//调用B中的函数f3,并把f2的地传给B;
}
class B
{
void* func;
f3();
f4();
}
B:f3()
{
func = &f2;//B中保存A中传过来的f2的地址;
}
当函数f4被调用时:
f4()
{
func();//回调执行A中的f2;
}
二、利用回调函数代替ios中的代理机制
1、以有http请求为例,DataSource类中有http成员变量,http实现对网络的访问,同时DataSource是http的代理,实现requestFinish和requestFaild代理函数。DataSource对外提供了一个接口函数PA_first.
在Controler类中,定义DataSource对象成员变量ds.并定义了从DataSource中提取http返回的数据的函数loadData,实现了取得http返回的数据,并且显示。我们不能直接调用loadData拿数据,因为我们不知道http是否已返回数据,因此,可利用回调函数机制为:
ds.PA_first(&loadData)
在DataSource中:PA_first()
{
保存loadData函数地址。
}
在DataSource中,当http返回成功时,会调用requestFinish,在requestFinish中回调执行loadData函数提取数据,并显示数据。
2、通过ios代理实现:
Controler是DataSource的代理,DataSource是Http的代理,因此,当http返回时,会执行DataSource中的代理函数,时而会执行Controller中的代理函数,取得数据,展现。
三、cllocationmanager利用GPS取得当前位置的经度和纬度信息,但在模拟器上,startUpdatingLocation也是不能更新到用户当前位置的,而是一直更新到旧金山的某个位置。利用cllocationmanager取得的用户当前位置不如MKmapView取得的用户当前位置准确,因此,当有map存在时,最好用map提供的位置信息。利用MKReverseGeocoder可以由经度和纬度反编译出名称信息。同一时刻只能存在一个MKReverseGeocoder实例。