My solution 我的解决方法
首先我们还是新建一个命令行项目,把它命名为 SwiftyCommits,接着新建一个 Cocoa Class file,把它命名为 SCApp。我们会在这个文件里把所有的事情都做了,这个项目不需要用到属性,因为所有的东西我们都从 GitHub 获取,然后就直接打印出来。
但是项目中还是会需要用到方法,所以我们先来写一下 SCApp.h 文件:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface SCApp : NSObject
- (void)fetchCommitsForRepo:(NSString*)repo;
@end
NS_ASSUME_NONNULL_END
我在这里写了一个抓取数据的方法, fetchCommitsForRepo,它会根据命令行参数获取对应的数据。比如我们输入 apple/swift,就会获取官方的开源 Swift 项目。
要实现这个方法,需要做两件事情:首先是获取数据,用 https://api.github.com/repos/%@/commits 这个api,"%@" 这个地方是要用 repo 参数来代替的。第二件事情就是解析数据,然后把打印出来。这两步都不难,我会分两部分来写,这样更好理解一些。
我们的第一个任务就是下载 GitHub JSON 文件,也及时说我们要根据用户的输入新建 URL。在这里我会用到 NSData 的 dataWithContentsOfURL 方法,它会把所有复杂的工作都搞定,并且不需要多跑一个线程,毕竟这只是一个命令行程序嘛~下载完数据的时候,可能会有各种各样的原因导致下载失败,所以我们还需要处理这些问题。
我们还是来看 fetchCommitsForRepo 的第一部分:
- (void)fetchCommitsForRepo:(NSString*)repo {
NSString *urlString = [NSString stringWithFormat:@"https://
api.github.com/repos/%@/commits", repo];
NSURL *url = [NSURL URLWithString:urlString];
NSError *error;
NSData *data = [NSData dataWithContentsOfURL:url
options:NSDataReadingUncached error:&error];
if (error != nil) {
NSLog(@"Fatal error 1: %@", [error localizedDescription]);
exit(0);
} }