国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ios影視項目解析主要為講block的細節如果了解了block的定義等但是對運用不是很熟悉可以參考本文章

2019-11-14 19:02:25
字體:
來源:轉載
供稿:網友

源于github上的影視項目解析

此項目在4app  和  github上都可以下載

 

項目截圖:

此處為程序剛運行界面

程序應有一個discover控制器

找到discover控制器,然后可以根據項目的流程熟悉此項目的原理,從而學習到他們的架構思想

 

1 - (void)setupTableView2 {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;}

可以清楚的看到這個函數  傳出了一個字典  

                                                                                  -------------------未完待續

 

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洮南市| 定日县| 陈巴尔虎旗| 沾化县| 定西市| 普陀区| 鄢陵县| 茶陵县| 河津市| 铁岭市| 赤城县| 十堰市| 洞头县| 莲花县| 东乡| 临海市| 手机| 孟连| 营山县| 辽中县| 四子王旗| 荥阳市| 津南区| 九龙坡区| 方山县| 东乡| 买车| 崇阳县| 綦江县| 岐山县| 荥阳市| 锦屏县| 竹溪县| 南雄市| 沁源县| 马边| 荆门市| 改则县| 合作市| 新津县| 福鼎市|