美文网首页开发技术iOS网络篇
iOS 开发中界面层与网络相关的部分通用功能的的设计

iOS 开发中界面层与网络相关的部分通用功能的的设计

作者: windgo | 来源:发表于2015-08-02 15:35 被阅读749次

    iOS 开发中界面层与网络相关的部分通用功能的的设计

    这里网络请求库是指AFNetworking, 它实际上也是现在iOS开发中最主流的库。

    界面开发中和网络相关的,通用的常常有这么两个地方:

    1. 网络请求时的活动指示器(UIActivityIndicatorView)显示。在很多的应用中,一旦网络请求开始,app就会显示一个小菊花不停的转动,网络请求结束之后,小菊花消失。
      当然, 也有app使用了有比小菊花更精美复杂的动画来表示网络请求正在进行。

      活动指示器, 有的也称为加载动画。

    2. 网络请求开始后,需要禁用某些视图或者控件的用户交互; 请求结束后,重新启用界面或者控件的用户交互。
      比如你点击某个按钮来发布一条点评,这时候,需要在请求结束之前禁用按钮,防止用户再次点击产生两个同样的点评。当点评在服务器端创建成功或者失败返回给客户端之后, 按钮再被重新启用。

    设计的目标:

    简化

    减少重复工作。避免在所有的网络请求的位置,都编写显示指示器显示和消失的代码;减少禁用和启用控件所需要编写的代码量。

    松耦合

    不能让网络层和界面层产生强耦合,如果在网络层的代码里,出现了界面层的代码,就将两个层面的问题耦合关联了。

    实现思路

    1 提供统一的网络请求方法。
    2 增加所有网络请求开始,结束两个事件,让相关对象能够接收到消息。
    3 在界面层,创建显示指示器,停止指示器的方法,在网络的访问开始,访问结束事件里调用。
    4 创建一个集合,用来存储需要在网络请求期间仅用,在网络访问结束之后启用的视图和控件。
    5 在开始请求的事件里,禁用所有在集合里的控件,在开始网络请求的时候,将这些控件恢复启用,并从集合中删除。

    实现示例:

    注意: 以下代码仅供参考, 用来说明设计思路, 肯定不能拿来就用.

    //网络层代码示例
     @protocol QIHttpRequestDelegate
    -(void) onRequestStart: …
    -(void) 
    @end
    
    @interface QIHttpManager...
    @property(weak,noautomatic) id<QIHttpRequestDelegate>  requestDelegate;
    -(void) post:...;
    …
    @end
     
    @@implementation
    {
    AFHTTPSessionManager* _httpManager;
    }
    -(void) post:…
    {
    …
            if(_requestDelegate){
                [_requestDelegate onRequestStart:…] 
            }
            …       
    … [_httpManager POST:…
            success:^(NSURLSessionDataTask *task, id responseObject) {
            …
                if(_requestDelegate){
                    [_requestDelegate onRequestStop:…] 
                }
            …       
            }
            failure:^(NSURLSessionDataTask *task, NSError *error) {
            …
                if(_requestDelegate){
                    [_requestDelegate onRequestStop:…] 
                }
            …       
        }
            …
    }
    …
    @end
    //界面层代码示例
    @interface QIUIManager:NSObject<QIHttpRequestDelegate>
    @property(readonly) NSMutableSet* viewsNeedDisableWhileRequestingSet;
    -(void) onRequestStart: …
    {
        [self startActivityIndicatorView];
        for( View* v in _viewsNeedDisableWhileRequestingSet){
            v.userInteractionEnabled=NO;
        }
    }
    -(void) onRequestStop: …
    {
        [self stopActivityIndicatorView];
        for( View* v in _viewsNeedDisableWhileRequestingSet){
            v.userInteractionEnabled=TRUE;
        }
    }
    @end
    // 在app启动的位置增加:
    [QIHttpManager shareManager].requestDelegate=[QIUIManager shareManager];
    

    相关文章

      网友评论

      • windgo:呵呵, 如果想实用, 肯定要增加不少细节的处理.

        如果针对不同的网络请求, 其实可以利用一个字典, 存储不同网络请求需要禁用和启用的视图和控件什么的.
      • 王大先森:应该还有更好的办法吧,文章浅显易懂,可是针对不同的网络请求应该怎么搞

      本文标题:iOS 开发中界面层与网络相关的部分通用功能的的设计

      本文链接:https://www.haomeiwen.com/subject/wprvqttx.html