IOS设计模式第十篇之命令行设计模式

简介: 命令行设计模式: 命令设计模式将一个请求或行动作封装为对象。这个封装请求比原始的请求要灵活并且可以在对象之前被传递,存储,动态修改或者放进队列里面。苹果 苹果公司实现这种模式使用Target-Action机制和Invocation。

命令行设计模式:

命令设计模式将一个请求或行动作封装为对象。这个封装请求比原始的请求要灵活并且可以在对象之前被传递,存储,动态修改或者放进队列里面。苹果

苹果公司实现这种模式使用Target-Action机制和Invocation。

你可以阅读更多关于Target-Action机制在苹果的文档但是Invocation类可以包含一个目标对象,方法选择器和一些参数。当需要的时候这个对象可以被动态的改变。

这是一个完美的命令模式的例子。它将发送对象从接收对象和对象和可以持续请求或一连串的请求。

怎么使用命令设计模式?

在你进入invocation 操作之前。你需要设置framework来支持撤销操作。你必须定义一个UIToolBar 和NSMutableArray 来作为撤销栈。

在Viewcontroller实现文件延展里添加其他的实例变量:

UIToolbar *toolbar;

// We will use this array as a stack to push and pop operation for the undo option

NSMutableArray *undoStack;

创建一个toolbar 来展示按钮和新的操作。以及一个数组作为命令队列。

添加下面代码在ViewDidLoad:

toolbar = [[UIToolbar alloc] init];

    UIBarButtonItem *undoItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemUndo target:self action:@selector(undoAction)];

    undoItem.enabled = NO;

    UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

    UIBarButtonItem *delete = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(deleteAlbum)];

    [toolbar setItems:@[undoItem,space,delete]];

    [self.view addSubview:toolbar];

    undoStack = [[NSMutableArray alloc] init];

上面代码创建一个toolbar带两个按钮和在他们之间添加一个灵活的空间。它还创建一个空撤销堆栈。这里的撤销按钮被禁用,因为撤销堆栈开始空了。

注意,工具栏没有用坐标初始化,由于在ViewDidLoad设置的坐标大小不是最终的。因此最后的设置通过下面代码:

- (void)viewWillLayoutSubviews

{

    toolbar.frame = CGRectMake(0, self.view.frame.size.height-44, self.view.frame.size.width, 44);

    dataTable.frame = CGRectMake(0, 130, self.view.frame.size.width, self.view.frame.size.height - 200);

}

您将添加三个ViewController方法。m处理专辑管理操作:添加、删除和撤销。

第一个方法用来添加新专辑

- (void)addAlbum:(Album*)album atIndex:(int)index

{

    [[LibraryAPI sharedInstance] addAlbum:album atIndex:index];

    currentAlbumIndex = index;

    [self reloadScroller];

}

在这里你添加一个新专辑,并且设置为当前的索引,并且加载这个滑动视图。

下面是删除方法:

- (void)deleteAlbum

{

// 1

    Album *deletedAlbum = allAlbums[currentAlbumIndex];

// 2

NSMethodSignature *sig = [self methodSignatureForSelector:@selector(addAlbum:atIndex:)];

NSInvocation *undoAction = [NSInvocation invocationWithMethodSignature:sig];

    [undoAction setTarget:self];

    [undoAction setSelector:@selector(addAlbum:atIndex:)];

    [undoAction setArgument:&deletedAlbum atIndex:2];

    [undoAction setArgument:&currentAlbumIndex atIndex:3];

    [undoAction retainArguments];

// 3

    [undoStack addObject:undoAction];

// 4

    [[LibraryAPI sharedInstance] deleteAlbumAtIndex:currentAlbumIndex];

    [self reloadScroller];

// 5

    [toolbar.items[0] setEnabled:YES];

}

对上面做下解释:

1:让这张专辑删除

2:定义一个NSMethodSignature 类型为了创建NSInvocation。为了撤销删除操作。这个

NSInvocation需要知道三个事情:选择器(什么消息被发送),目标(谁发送这个消息)还有消息的参数。这个例子中一旦你撤销删除

他消息发送删除的相反您需要添加删除专辑。

3:撤销操作被创建后添加到空栈里面。这个操作被调价到数组的组后,就像正常的栈。

4:

用libraryAPI来删除专辑从数据架构中并且加载滑动视图。

5:自撤销堆栈的操作,您需要启用撤销按钮

注意:对于NSInvocation你需要注意下面几点:

1:参数必须通过指针传递

2:参数从2的索引开始,指数0和1都保留在目标和选择器。

3:果有机会,参数将被收回,那么你应该叫retainArguments。

最后添加撤销操作:

- (void)undoAction
{
    if (undoStack.count > 0)
    {
NSInvocation *undoAction = [undoStack lastObject];
        [undoStack removeLastObject];
        [undoAction invoke];
    }
    if (undoStack.count == 0)
    {
        [toolbar.items[0] setEnabled:NO];
    }}

撤消操作“弹出”中的最后一个对象栈。这个对象总是NSInvocation类型,可以通过调用调用…调用。这张专辑删除时调用的命令很早被创建。并添加删除专辑专辑列表。因为你也删除最后一个对象在堆栈“弹出”时,你现在看看栈是空的。如果是,这就意味着没有更多的行动取消。所以你禁用撤销按钮。构建和运行您的应用程序来测试你的撤销机制,删除一个专辑(或两个),点击取消按钮看它的实际应用:

Image

这也是一个不错的测试是否保留更改相册数据之间的会话。现在,如果你删除一个专辑,将应用程序发送到后台,然后终止应用程序,下次启动应用程序显示专辑列表应该反映删除。

相关文章
|
设计模式 测试技术 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
285 0
|
设计模式 搜索推荐 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
547 1
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
458 0
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
315 0
|
设计模式 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(6)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(6)
287 0
|
设计模式 iOS开发 UED
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)
280 0
|
设计模式 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)
286 0
|
网络安全 开发工具 数据安全/隐私保护
iOS开发 - 最简洁的用命令行提交代码到Github,加详细说明
iOS开发 - 最简洁的用命令行提交代码到Github,加详细说明
149 0
iOS开发 - 最简洁的用命令行提交代码到Github,加详细说明
|
设计模式 测试技术 API
淘宝iOS扫一扫架构升级 - 设计模式的应用
本文在“扫一扫功能的不断迭代,基于设计模式的基本原则,逐步采用设计模式思想进行代码和架构优化”的背景下,对设计模式在扫一扫中新的应用进行了总结。
290 0
淘宝iOS扫一扫架构升级 - 设计模式的应用
|
设计模式 安全 程序员
iOS开发篇 - 单例设计模式(上)
所谓单例就是确保在程序运行过程中只创建一个对象实例,可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类、工具类、以及其他管理类。在iOS开发中,单例模式是非常有用的设计模式
iOS开发篇 - 单例设计模式(上)
下一篇
DataWorks