ios中的代理与回调函数

来源:互联网 发布:西门子苏州研究院数据 编辑:程序博客网 时间:2024/06/05 12:40

一、回调函数:

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实例。


原创粉丝点击