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;
}

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

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

时间: 2024-08-23 23:07:55

ios影视项目解析 主要为讲block的细节 如果了解了 block的定义等 但是对运用不是很熟悉可以参考本文章的相关文章

iOS开发项目篇—43子控件的细节处理

iOS开发项目篇—43子控件的细节处理 一.升级UI 把之前的UI图片删除,换上新的图片(图片命名一致,规范)没有其他的影响. 删除之后,添加. 替换之后,做一次clear操作. 建议把沙盒中的包删除,删除之后再做一次clear操作. 二.调整转发(模块) 1.设置背景(使用提供的素材图片进行平铺) 为转发微博部分设置背景,考虑到这个部分整体上是一个UIView,可以尝试以下设置. 第一种尝试: 但是这样设置,因为图片是平铺的,所以整个背景会出现线条效果,影响显示,不可行. 第二种尝试: 注意:

iOS开发——项目实用技术OC篇&将Block作为代理来使用,实现传值

将Block作为代理来使用,实现传值 在这里http://www.cnblogs.com/iCocos/p/4659878.html,笔者已经将代理,Block,通知传值的方式总结了一下,今天使用的不一样,我们这里使用的是在一个方法中将一个block代码保存起来,再回到blcok内部去执行. 这里使用的是在地图中,,,,好了不多说,开干 1:首先,定义一个blcok typedef void(^ResultBlock)(CLLocation *currentLoc, CLPlacemark *p

iOS开发——项目实战总结&Block使用注意点浅析

Block使用注意点浅析 1.在使用block前需要对block指针做判空处理. 不判空直接使用,一旦指针为空直接产生崩溃. if (!self.isOnlyNet) { if (succBlock == NULL) { //后面使用block之前要先做判空处理 return; } id data = [NSKeyedUnarchiver unarchiveObjectWithFile:[self favoriteFile]]; if ([data isKindOfClass:[NSMutabl

iOS Storyboard全解析(转)

来源:http://iaiai.iteye.com/blog/1493956 Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图:  现 在,你就可以清楚的看到这个应用究竟是干些什么的,也可以清楚的看到其中的各种关系,这就是Storyboard的强大之处了.如果你要制作一个页面很多 很复杂的App,Storyboard可以帮助你解决写很多重复的跳转方法的麻烦,节省很多时间,以便你

iOS Storyboard全解析 《转帖》

iOS Storyboard全解析 来源:http://iaiai.iteye.com/blog/1493956 Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图:  现 在,你就可以清楚的看到这个应用究竟是干些什么的,也可以清楚的看到其中的各种关系,这就是Storyboard的强大之处了.如果你要制作一个页面很多 很复杂的App,Storyboard可以帮助你解决写很多重复的

GitHub上史上最全的iOS开源项目分类汇总

学了这么久,还是抽时间把github上比较好用的第三方总结了一下: Category/Util sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错-       BFKit 又一套Category类型的 Kit,还有几个工具类       APUtils 又一套Category类型的 Kit       QSKit 又一套Category类型的 Kit       iOS-Categories 又一套Category类型的 Kit       BlocksKit 将B

iOS Storyboard全解析

原文地址:http://iaiai.iteye.com/blog/1493956 (Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图: 现在,你就可以清楚的看到这个应用究竟是干些什么的,也可以清楚的看到其中的各种关系,这就是Storyboard的强大之处了.如果你要制作一个页面很多很复杂的App,Storyboard可以帮助你解决写很多重复的跳转方法的麻烦,节省很多时间,以便你

iOS开发项目篇—38深层重构

iOS开发项目篇—38深层重构 一.简单说明 说明:可以发现每个工具类,内部方法的代码长相都差不多,可以考虑再抽取出一个处理业务的公共的工具类,让其他的业务类继承自这个工具类,降低代码的冗余度. 1.新建一个工具类 该基础业务处理工具类中的代码设计: YYBaseTool.h文件 1 // 2 // YYBaseTool.h 3 4 //最基本的业务工具类 5 6 #import <Foundation/Foundation.h> 7 8 @interface YYBaseTool : NSO

GitHub 上值得关注学习的 iOS 开源项目

特此声明,本文转自知乎,原文地址:http://www.zhihu.com/question/22914651,本人只是复制.粘贴. 1. ReactiveCocoa:ReactiveCocoa/ReactiveCocoa · GitHub:GitHub自家的函数式响应式编程范式的Objective-C实现,名字听着很高大上,学习曲线确实也比较陡,但是绝对会改变你对iOS编程的认知,首推之.2. Mantle:Mantle/Mantle · GitHub:又是GitHub自家的产物,轻量级建模的