首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

IOS设计方式之三(适配器模式,观察者模式)

2013-10-01 
IOS设计模式之三(适配器模式,观察者模式)???为了开始实现它,在工程导航视图中右键点击View组,选择New File

IOS设计模式之三(适配器模式,观察者模式)

?

?

?

为了开始实现它,在工程导航视图中右键点击View组,选择New File...使用iOS\Cocoa Touch\Objective-C class 模板创建一个类。命名这个新类为HorizontalScroller,并且设置它是UIView的子类。

?

打开HorizontalScroller.h文件,在@end 行后面插入如下代码:

?

?

对了,等等。水平滚动视图没问题,但是为什么没有显示封面呢?
??? 是的,那就对了-你还没有实现下载封面的代码。为了实现这个功能,你需要去新增一个下载图片的方法。因为所有对服务的访问都通过LibraryAPI,那我们就可以在LibraryAPI中实现新的方法。然而我们首先需要虑一些事情:

?

1.?AlbumView不应该直接和LibraryAPI交互。你不想混淆显示逻辑和网络交互逻辑。2.?同样的原因,LibraryAPI也不应该知道AlbumView。3.?一旦封面已经下载,LibraryAPI需要通知AlbumView,因为AlbumView显示专辑封面。听上去是不是挺糊涂的?不要灰心。你将学习如何使用观察者模式来实现它。

?

观察者(Observer)模式

?

在观察者模式中,一个对象任何状态的变更都会通知另外的对改变感兴趣的对象。这些对象之间不需要知道彼此的存在,这其实是一种松耦合的设计。当某个属性变化的时候,我们通常使用这个模式去通知其它对象。此模式的通用实现中,观察者注册自己感兴趣的其它对象的状态变更事件。当状态发生变化的时候,所有的观察者都会得到通知。苹果的推送通知(Push Notification)就是一个此模式的例子。如果你要遵从MVC模式的概念,你需要让模型对象和视图对象在不相互直接引用的情况下通信。这正是观察者模式的用武之地。
Cocoa通过通知(Notifications)和Key-Value Observing(KVO)来实现观察者模式。

?

通知(Notifications不要和远程推送以及本地通知所混淆,通知是一种基于订阅-发布模式的模型,它让发布者可以给订阅者发送消息,并且发布者不需要对订阅者有任何的了解。通知在苹果官方被大量的使用。举例来说,当键盘弹出或者隐藏的时候,系统会独立发送UIKeyboardWillShowNotification/UIKeyboardWillHideNotification通知。当你的应用进入后台运行的时候,系统会发送一个UIApplicationDidEnterBackgroundNotification通知。

?

注意:打开UIApplication.h,在文件的末尾,你将看到一个由系统发出的超过20个通知组成的列表。

?

如何使用通知(Notifications打开AlbumView.m,在initWithFrame:albumCover::方法的[self addSubview:indicator];语句之后加入如下代码:
?
这个是观察者模式中两部分的另外一部分:观察者。每次AlbumView发送一个BLDownloadImageNotification通知,因为LibraryAPI已经注册为同样的通知的观察者,那么系统就会通知LibraryAPI,LibraryAPI又会调用downloadImage:来响应。然而在你实现downloadImage:方法之前,你必须在你的对象销毁的时候,退订所有之前订阅的通知。如果你不能正确的退订的话,一个通知发送给一个已经销毁的对象会导致你的app崩溃。在Library.m中增加下面的代码:

?


?

?

?

?

停止你的应用再一次运行它,你会注意到不会存在加载图片的延迟,因为它们都已经被保存到了本地。甚至你可以断开网络,你的应用也可以完美地运行。然而这里有点奇怪,图片上的提示转盘一直在转动,出了什么问题呢?当开始下载图片的时候,你启动了提示图片正在加载的旋转提示器,但是你还没有实现图片下载完成后停止它的逻辑。你应该在每次图片下载完成的时候发送一个通知,但是这里你使用KVO这种观察者模式。

?

Key-Value Observing(KVO)模式在KVO中,一个对象可以要求在它自身或者其它对象的属性发送变化的时候得到通知。如果你对KVO感兴趣的话,你可以更进一步的阅读这篇文章:Apple’s KVO Programming Guide.如何使用KVO正如上面所说的,KVO机制让对象可以感知到属性的变化。在本例中,你可以使用KVO去观察UIImageView的image属性的变化。打开AlbumView.m文件,在initWithFrame:albumCover:方法[self addSubview:indicator]这一行后,增加下面的代码:
这里它增加了它自己(当前的类)作为image属性的观察者。当完成的时候,你同样需要注销相应的观察者。仍然在AlbumView.m中增加下面的代码:

?

?

注意:你要总是记得去移除已经销毁的观察者,否则当给不存在的观察者发送消息的时候,你的应用可能会崩溃。如果你玩一回你的应用后终止它,你会发现你的应用状态没有被保存,你上次查看的专辑不是下次启动时候的缺省专辑。为了修正这个问题,你可以使用列表中的下个模式:备忘录(Memento)模式.??????? 1 楼 umeit 2013-09-26   你好,请教一个问题:

文中这句话应该怎么理解?
引用苹果通过一个稍微不同的方式来实现它-苹果使用了协议的方式来实现。你可能已经熟悉UITableViewDelegate, UIScrollViewDelegate, NSCoding 和 NSCopying协议。举个例子,使用NSCopying协议,任何类都可以提供一个标准的copy方法。

例子中的 HorizontalScroller 是否就是一个适配器?用来适配 controller 与 UIScrollView ?

热点排行