
在Xcode6中构建Utility Application类型的Application
Xcode6中已经没有Utility Application类型应用向导,这里描述了一个从Single View Application开始手工构造Utility Application的步骤:
1、新建Project,选择Single View Application,输入项目名(我的是Utility Application)。
2、新建File,选择Cocoa Touch Class,Class名:FlipsideViewController 继承自: UIViewController。
修改FlipsideViewController.h
#import <UIKit/UIKit.h>
@class FlipsideViewController
//构造一个翻转视图控制器代理协议,功能是翻转视图完成以后通知父视图
@protocol FlipsideViewControllerDelegate
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
@end
@interface FlipsideViewController : UIViewController
//对实现翻转视图控制器代理协议对象的应用属性
@property (weak, nonatomic) id <FlipsideViewControllerDelegate>delegate
//导航栏中Done按钮的 *** 作方法
- (IBAction)done:(id)sender
@end
修改FlipsideViewController.m,在末尾增加Done按钮的 *** 作方法的实现:
#pragma mark - Actions
- (IBAction)done:(id)sender
{
//通过代理协议通知父视图翻转视图已完成
[self.delegate flipsideViewControllerDidFinish:self]
}
3、修改ViewController.h
#import <UIKit/UIKit.h>
#import "FlipsideViewController.h"
@interface ViewController : UIViewController<FlipsideViewControllerDelegate>
@end
修改ViewController.m,在末尾怎增加:
#pragma mark - Flipside View
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
[self dismissViewControllerAnimated:YES completion:nil]
}
#pragma mark - Navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showAlternate"]) {
[[segue destinationViewController] setDelegate:self]
}
}
4、增加View Controller,修改Custom Class为:FlipsideViewController;并在最上面添加一个Navigation Bar,将Style改为Black,建立到top、left、right的约束,并在导航栏上左边增加一个Bar Button,Identifier为Done,并将该button的Sent Actions中的selector连接到上面FlipsideViewController.m中的done *** 作。
5、在向导创建的View Controller中的右下角增加一个Button,Style改为Info Dark,增加right、bottom约束。从这个button增加一个到Flipside View Controller的转场,类型为Action Segue中的Present modally,修改该转场的Identifier为showAlternate。
由于xcode不支持http请求所以我们需要通过修改info.plist文件来让xcode支持http请求,我们需要在info.plist文件中增加如下键值对
只要完成以上三步就可以实现GET的请求了
下面只列举出GET方式的协议代理的请求方式,POST的请求方式只需要另外设置一下NSMutableURLRequest请求的方式,再设置一个参数就可以了,具体的协议代理的方法,和GET请求时使用的是一样的 在使用协议的方法请求数据的时候,我们需要先遵循 <NSURLSessionTaskDelegate,NSURLSessionDataDelegate> 这两个协议
至此,只要完成了以上六个步骤,并且实现了三个协议方法,就可以成功的通过协议代理的方式请求回来数据了。
java静态代理模式,举例给你,看下如何理解:public class Ts {
public static void main(String[] args) throws Exception {
// 通过中介公司生产一批衣服
ClothingProduct cp = new ProxCompany( new LiNingCompany())
cp.productClothing()
}
}
/**
* 定义生产一批衣服功能的接口
*
*/
interface ClothingProduct {
void productClothing() // 有生产一批衣服的功能
}
/**
*
* 代理类:中介公司
*
*/
class ProxCompany implements ClothingProduct {
private ClothingProduct cp // 中介公司不会生产衣服,需要找一家真正能生产衣服的公司
ProxCompany(ClothingProduct cp) {
super ()
this . cp = cp
}
@Override
public void productClothing() {
System. out .println( "收取1块钱的中介费" )
cp .productClothing()
}
}
/**
*
* 李宁公司是生产服装的目标类
*
*/
class LiNingCompany implements ClothingProduct {
@Override
public void productClothing() {
System. out .println( "生产一批衣服。。。。" )
}
}
上面程序的做法,使用的模式是静态代理模式
静态代理模式在现实编程中的弊端:
它的特征是代理类和目标对象的类都是在编译期间确定下来的,不利于程序上的扩展,上面示例中,如果客户还想找一个逗生产一批鞋子地的工厂,那么还需要新增加一个代理类和一个目标类。如果客户还需要很多其他的服务,就必须一一的添加代理类和目标类。那就需要写很多的代理类和目标类
代理模式到底做了什么看
我眼中的代理模式只有两个关注点:协议和代理者
协议定义了一组方法,由某一个类负责实现。
代理者作为某个类的一个属性,通常是另一个类的实例对象,可以负责完成原来这个类不方便或者无法完成的任务。
首先谈一谈代理者,在脑中重新回想一下代理模式的实现过程。在页面B中定义一个代理对象的时候,好像和定义一个普通的property非常类似(除了 weak和id《delegate》>)。这也正是我对代理的概括:代理本来就是一个属性而已,并没有非常神秘。
当然,代理者并不只是一个类普通的属性,否则我只需要重写一下B的初始化方法即可达到同样的效果:
self.BVC = [[BViewController alloc]initWithDelegate:self]
然后在BViewController.m中定义一个AViewController *AVC并在初始化方法中赋值即可。
注意到代理者在定义的时候,格式往往是这样的:
id <SomeDelegate>delegate
所以我对代理的优势的理解是:
代理的核心优势在于解耦
与直接声明一个属于某个固定的类的代理者相比,声明为id的代理者具备两个明星的优势。
允许多个不同的类成为本类的代理。试想一下在本文例子中,如果页面B可以跳转回N个页面,如果还是通过声明一个普通对象的方式,那怎么办看
允许代理者的类还不固定。试想一下,UITableView也有delegate,它根本不知道那个类会成为它的代理者。
再看一看协议。协议更加简单了。协议只是定义了一组方法。在代理模式中,完全可以不用在页面B中定义一个协议,然后A再去遵循这个协议。直接调用A的方法即可。
个人认为协议的优点在于以下几点:
可以利用Xcode的检查机制。对于定义为@required的方法,如果实现了协议而没有实现这个方法,编译器将会有警告。这样可以防止因为疏忽,忘记实现某个代码的情况,而由于OC的运行时特性,这样的错误往往在运行阶段才会导致程序崩溃。
有利于代码的封装。如果一个类,实现了某个协议,那么这个协议中的方法不必在.h中被声明,就可以被定义协议的类调用。这样可以减少一个类暴露给外部的方法。
有利于程序的结构化与层次化。一个协议往往是解决问题的某个方法,对于一个其他的不过却类似的问题,我们只用再次实现协议即可,避免了自己再次构思一组方法。协议的继承机制使得这一有点更加强大。
说了怎么多,总结起来只有一句:代理模式并不神秘,只是一个经过了优化的小技巧(让某个类持有另一个类的指针)。代理和协议也只是让程序耦合度更低,结构感更强而已。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)