zoukankan      html  css  js  c++  java
  • ios影视项目解析 主要为讲block的细节 如果了解了 block的定义等 但是对运用不是很熟悉可以参考本文章

    源于github上的影视项目解析

    此项目在4app  和  github上都可以下载

     

    项目截图:

    此处为程序刚运行界面

    程序应有一个discover控制器

    找到discover控制器,然后可以根据项目的流程熟悉此项目的原理,从而学习到他们的架构思想

     

    1 - (void)setupTableView
    2 {
    3     if (!_refreshControl)
    4     {
    5         _refreshControl = [[UIRefreshControl alloc] initWithFrame:CGRectMake(0, -44, 320, 44)];
    6         [self.refreshControl addTarget:self action:@selector(refreshFeed) forControlEvents:UIControlEventValueChanged];
    7         [self.tableView addSubview:_refreshControl];
    8     }
    9 }

     

    此处可看出是一个刷新空间的添加  采用懒加载的方式

    - (void)refreshFeed
    {
        [self requestMovies];
    }

    他在viewdidload  还有刷新控件 改变的时刻调用requestMovies这个方法

    找到这个方法

    - (void)requestMovies
    {
        KMDiscoverListCompletionBlock completionBlock = ^(NSArray* data, NSString* errorString)
        {
            [self.refreshControl endRefreshing];
            if (data != nil)
                [self processData:data];
            else
                [self.networkLoadingViewController showErrorView];
        };
        KMDiscoverSource* source = [KMDiscoverSource discoverSource];
        [source getDiscoverList:@"1" completion:completionBlock];
    }

    在这里 看了好久才明白  前面的 block 是对后面的调用来用的

    也可以这样写   运行完全没错误

     KMDiscoverSource* source = [KMDiscoverSource discoverSource];
        [source getDiscoverList:@"1" completion:^(NSArray *data, NSString *errorString) {
            [self.refreshControl endRefreshing];
            if (data != nil)
                [self processData:data];
            else
                [self.networkLoadingViewController showErrorView];
        }
        
         ];
        

    这里面的意思

    在这里他将 下载数据的方法  封装为一个block  这个是我主要要看的方法  总是对block不是很熟悉

    点进去看一下  

    #import "KMBaseSource.h"
    
    typedef void (^KMDiscoverListCompletionBlock)(NSArray* data, NSString* errorString);
    
    @interface KMDiscoverSource : KMBaseSource
    
    + (KMDiscoverSource*)discoverSource;
    
    - (void)getDiscoverList:(NSString*)pageLimit completion:(KMDiscoverListCompletionBlock)completionBlock;
    
    @end

    这个应该是一个工具类  用来返回discover 的数据

     1 - (void)getDiscoverList:(NSString*)pageLimit completion:(KMDiscoverListCompletionBlock)completionBlock;
     2 {
     3     if (completionBlock)
     4     {
     5         NSDictionary* parameters = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:pageLimit, nil] forKeys:[NSArray arrayWithObjects:@"page", nil]];
     6         
     7         [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
     8         
     9         AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    10         [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    11         
    12         [manager GET:[self prepareUrl] parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
    13          {
    14              NSLog(@"JSON: %@", responseObject);
    15              NSDictionary* infosDictionary = [self dictionaryFromResponseData:operation.responseData jsonPatternFile:@"KMDiscoverSourceJsonPattern.json"];
    16              dispatch_async(dispatch_get_main_queue(), ^{
    17                  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    18                  completionBlock([self processResponseObject:infosDictionary], nil);
    19              });
    20          }
    21              failure:^(AFHTTPRequestOperation *operation, NSError *error)
    22          {
    23              NSLog(@"Error: %@", error);
    24              dispatch_async(dispatch_get_main_queue(), ^{
    25                  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    26                  NSString* errorString = error.localizedDescription;
    27                  if ([errorString length] == 0)
    28                      errorString = nil;
    29                  completionBlock(nil, errorString);
    30              });
    31          }];
    32     }
    33 }

    这里使用了第三方框架AFN  

    第一句是传入一个字典参数 

    第7行是 让状态栏的  网络传输图标  显示  

    第12行为  发送一个get请求 

    第15行是对json经行解析的封装 因为AFN是在异步执行  所以要得到主线程更新ui 把block的参数中的 data  给block  然后 在别的控制器调用这个block时候就会有参数  还可以进行自己的操作  可以在下面看到这个方法,还可以监听这个数据下载好没有

    因为在err的参数里传的是nil  在运行的时候经行判断就好了

    - (NSArray*)processResponseObject:(NSDictionary*)data
    {
        if (data == nil)
            return nil;
        NSArray* itemsList = [NSArray arrayWithArray:[data objectForKey:@"results"]];
        NSMutableArray* sortedArray = [[NSMutableArray alloc] init];
        for (NSDictionary* item in itemsList)
        {
            KMMovie* movie = [[KMMovie alloc] initWithDictionary:item];
            [sortedArray addObject:movie];
        }
        return sortedArray;
    }

    可以清楚的看到这个函数  传出了一个字典  

                                                                                      -------------------未完待续

     

  • 相关阅读:
    抖音圈圈乐 系统搭建H5微信小游戏圈圈乐系统介绍
    GPS NMEA-0183标准详解
    GPS定位的偏移校正(WGS84与火星坐标互转)
    Complete_NGINX_Cookbook
    GBT32960-2016电动汽车远程服务与管理系统技术规范 第3部分:通信协议及数据格式
    Redis 到底是怎么实现“附近的人”这个功能的呢?
    NETGEAR R7800路由器TFTP刷回原厂固件方法
    JT/T 808-2013 道路运输车辆卫星定位系统北斗兼容车载终端通讯协议技术规范
    如何正确地使用设计模式?
    各常用分类算法的优缺点总结:DT/ANN/KNN/SVM/GA/Bayes/Adaboosting/Rocchio
  • 原文地址:https://www.cnblogs.com/miaoqiang/p/4507677.html
Copyright © 2011-2022 走看看