关于cocoapods的使用

本文介绍如何利用CocoaPods管理iOS项目的依赖关系,包括安装RubyGems、更新命令行工具、安装CocoaPods、创建工程及Podfile等内容,通过实例演示如何高效地整合第三方库,提升开发效率。


  

http://ijavascripter.com/?p=47

本文会介绍如何使用CocoaPods。CocoaPods一个依赖关系管理工具。

那么什么是依赖关系管理工具?我们为什么需要这个工具?

作为一个iOS开发者,你肯定会使用第三方库。通常,我们直接把第三方库的源代码直接加入到我们的项目中(手动创建一个staticlibrary还是很无聊滴),但是这么做有一些缺点:

  • 浪费空间。源代码可能已经存在你的代码托管中
  • 有些时候,很难获得某个具体版本的第三方库
  • 没有一个集中的地方可以查看哪些库现在可以使用
  • 更新新版本的时候,是件无聊的事情,有些时候还很痛苦

一个依赖关系管理工具可以帮助你克服大部分上面提到的问题。它会帮你下载你所用到的库的源代码、创建和维护你所需要的环境。

本文会用cocoapod来创建一个应用,这个应用用于获取你在trakt.tv上收听的节目信息。

等会你就会发现使用cocoaPods所带来的好处

CocoaPods的官网是这么描述它自己的”The best way to manage library dependenciesin Objective-C projects”。 就目前来看,所言非虚。

与其你自己每次从Github中下载代码,然后拷贝到你的项目中,还不如让CocoaPods来帮你完成这个工作。

trakt.tv这个应用的需求就是-我们希望创建一个应用,可以显示将要播放的电视节目的信息。

安装CocoaPods

安装RubyGems

CocoaPods需要ruby环境,幸运的是所有的mac电脑都已经预装了ruby,所以你需要更新一下你的RubyGems(如果你的系统版本低于OSX Lion)

只需要输入如下命令就可以更新你的RubyGems:

sudo gem update --system

安装commandline工具

确保你在你的Xcode中安装了command line tool(命令行工具)。在最新的Mac OS XLion和Xcode中,命令行工具默认没有安装。可以通过如下方式安装command line tool:

  • 这里下载,然后安装
  • 打开xcode,打开components界面。Xcode->Preferences->Downloads->Components.里面应该有一个选项是”CommandLineTools”,后面应该“Install”或者“Update”按钮,点一下按钮就行。安装完成后,按钮的文字会变成“Installed”。如下图:
    Xcode downloads

安装CocoaPods

完成以上步骤后,只需要输入如下命令就可以安装CocoaPods了:

sudo gem install cocoapods

pod setup

第一次安装可能需要一些时间,耐心等待一下

Install cocoapods

创建一个“CocoaPodsExample”工程

打开Xcode,然后创建一个基于“Single ViewApplication”的工程。工程的名字“CocoaPodsExample”,“DeviceFamily”选为“iPhone”,选中“Use Storyboards”和“Use Automatic ReferenceCounting”。如下图:

Create CocoaPodsExample

点击下一步然后选择一个地方存放你的工程。

找一张图片作为Launch Images。如果没有合适的可以下载这一张-placeholder.png。把这张图片拖到工程中,选中“Copyitems into destination group’s folder(if needed)”。

下面打开MainStoryboard.storyboard,并按照如下步骤进行修改:

  1. 添加一个scrollview。确保这个scroll view的宽度和高度是100%
  2. 修改scrollview的属性。打开属性选择器,不选“Shows Horizontal Scrollers”,”Shows VerticallScollers”。选中“Scrolling Enabled”, “Paging Enabled”, “Direction LockEnabled”
  3. 添加一个pagecontrol。确保这个page control是之前scroll view的兄弟视图,而不是scrollview的子视图,并且page control应该在scroll view的前面,不然你就看不到page control了。

storyboard应该看起来像下图:

Storyboard

最后把scroll view和page view连接到一个outlet中,我们把scrollview的outlet命名为showsScrollView,并且把当前的view controller做为scrollview的delegate。把page control的outlet命名为showPageControl,给pagecontrol的“Value Changed”事件绑定一个方法,方法名称是pageChanged。

现在你可以关了你的Xcode了,接下来就是开始创建你的Podfile了。

创建你的第一个依赖关系

打开终端,并且打开存放你的“CocoaPodsExample”工程的文件夹。输入如下命令:

touch Podfile 
open -e Podfile

TextEdit会被打开,你可以往打开的空白Podfile中添加内容了。

我们往Podfile中加入如下内容:

platform :iOS
pod 'AFNetworking', '0.9.1'

如你所见,Podfile的格式很简单。首先,你设置platform为ios(因为有一些框架只支持iOS或者Mac OSX中的一个,而不是都有)。然后,你添加你的第一个依赖-“AFNetworking”,并且指定了,你需要的是0.9.1。

编辑Podfile,除了上面的方法,你还可以使用别的你喜欢的编辑工具,比如vim

有关Podfile的格式,你可以在APodfilePodfile(frames)中得到更详细信息

保存Podfile之后,我们可以开始配置你的工程了。

在终端中执行如下命令:

pod install

执行完后,你应该会在终端中看到下图:

Pod Install Log

如果这个时候,你打开你工程所在的文件夹会看到下图:

CocoaPods Project Folder

CocoaPods创建了一个文件夹-“Pods”,这个文件夹存放了所有的依赖的库和一个workspace文件,CocoaPodsExample.xcworkspace

VERYIMPORTANT!

从现在开始,你必须用workspace文件(CocoaPodsExample.xcworkspace)打开工程,而不是在是用工程文件(CocoaPodsExample.xcodeproj)

测试AFNetworking

测试AFNetworking是否成功加入已经CocoaPods是否真的工作,可以创建一个基于iOS/CocoaTouch/Objective-Cclass的类,我们称之为SKTraktAPIClient,并且是这个类是NSObject的子类。切记把这个类加入到CocoaPodsExample中而不是Pods工程中。如果你现在看一下你工程文件的导航,你会看到有两个独立的项目:CocoaPodsExample和Pods

打开SKTraktAPIClient.h,并且用如下代码替换已有代码:

#import 
#import 

extern NSString *const kTraktAPIKey;
extern NSString *const kTraktBaseURLString;

@interface SKTrakeAPIClient : AFHTTPClient

+(SKTrakeAPIClient *)sharedClient; 

@end

上面的代码做了如下事情:

  1. 第一行代码导入Foundation头文件
  2. 第二行代码导入AFNetworking的头文件,AFNetworking将会是SKTraktAPIClient的头文件
  3. 接下来的两行定了两个变量
  4. 最后我们定义了一个方法,该方法会返回一个独立的SKTraktAPIClient实力

为什么在已经有AFNetworking可以处理所有的HTTP请求的情况下,我们还要创建一个SKTraktAPIClient类?原因就在于,我们希望有一个类可以处理所有我们和trakt.tv的请求,可以使用同样的BaseURL和api key。这样子可以方便之后的维护。

现在打开SKTraktAPIClient.m,并且用如下的代码替换已有的代码:

#import "SKTraktAPIClient.h"
#import 

NSString *const kTraktAPIKey = @"fc3df235908f83107cedd7914950d7a0";
NSString *const kTraktBaseURLString = @"http://api.trakt.tv";

@implementation SKTraktAPIClient

+(SKTraktAPIClient *)sharedClient{
    static SKTraktAPIClient *_sharedClient = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:kTraktBaseURLString]];
    });
    return _sharedClient;
}

-(id)initWithBaseURL:(NSURL *)url{
    self = [super initWithBaseURL:url];
    if(!self){
        return nil;
    }
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
    [self setDefaultHeader:@"Accept" value:@"application/json"];
    self.parameterEncoding = AFJSONParameterEncoding;
    return self;
}
@end

首先我们导入了AFJSONRequestOperation.h,这样子所有的返回值都是JSON格式的。我们创建了sharedClient,这里使用了GCD(GrandCentralDispatch),确保了实现SKTraktAPIClient的单例,随意只要是通过sharedClient方法获得的SKTraktAPIClient都是同一个实例,不会重复创建。除了这个以外,我们还重写了initWithBaseURL方法,原因就是之后所有用initiWithBaseURL创建的方法,它们都有同样的response格式-json格式

下面打开AppDelegate.m加入下面代码:

#import 

application:didFinishLaunchingWithOptions:加入如下代码:

[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;

以上代码开启了automatic network activity indicationmanager,这个是AFNetworking支持的功能。通过这种方法,你就不需要每次发送请求打开activityindication,完成后关闭activity indication。

现在打开ViewController.m,并且加入如下代码:

#import "SKTraktAPIClient.h"
#import 

并用如下代码替换viewDidLoad

-(void)viewDidLoad {
    [super viewDidLoad];
    // 1 - Create trakt API client
    SKTraktAPIClient* client = [SKTraktAPIClient sharedClient];
    // 2 - Create date instance with today's date
    NSDate* today = [NSDate date];
    // 3 - Create date formatter
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyyMMdd";
    NSString* todayString = [formatter stringFromDate:today];
    // 4 - Create API query request
    NSString* path = [NSString stringWithFormat:@"user/calendar/shows.json/%@/%@/%@/%d", kTraktAPIKey, @"marcelofabri", todayString, 3];
    NSURLRequest* request = [client requestWithMethod:@"GET" path:path parameters:nil];
    // 5 - Create JSON request operation
    AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        // 6 - Request succeeded block
        NSLog(@"%@", JSON);
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        // 7 - Request failed block
    }];
    // 8 - Start request
    [operation start];
}

编译运行之后,你可以在你的控制台中看到类似下图的日志:

trakt.tv shows.json log

可见,CocoaPods正确帮我们配置了AFNetworking。


附件:http://vdisk.weibo.com/s/kvEHc

【SCI复现】含可再生能源与储能的区域微电网最优运行:应对不确定性的解鲁棒性与非预见性研究(Matlab代码实现)内容概要:本文围绕含可再生能源与储能的区域微电网最优运行展开研究,重点探讨应对不确定性的解鲁棒性与非预见性策略,通过Matlab代码实现SCI论文复现。研究涵盖多阶段鲁棒调度模型、机会约束规划、需求响应机制及储能系统优化配置,结合风电、光伏等可再生能源出力的不确定性建模,提出兼顾系统经济性与鲁棒性的优化运行方案。文中详细展示了模型构建、算法设计(如C&CG算法、大M法)及仿真验证全过程,适用于微电网能量管理、电力系统优化调度等领域的科研与工程实践。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事微电网、能源管理相关工作的工程技术人员。; 使用场景及目标:①复现SCI级微电网鲁棒优化研究成果,掌握应对风光负荷不确定性的建模与求解方法;②深入理解两阶段鲁棒优化、分布鲁棒优化、机会约束规划等先进优化方法在能源系统中的实际应用;③为撰写高水平学术论文或开展相关课题研究提供代码参考和技术支持。; 阅读建议:建议读者结合文档提供的Matlab代码逐模块学习,重点关注不确定性建模、鲁棒优化模型构建与求解流程,并尝试在不同场景下调试与扩展代码,以深化对微电网优化运行机制的理解。
个人防护装备实例分割数据集 一、基础信息 数据集名称:个人防护装备实例分割数据集 图片数量: 训练集:4,524张图片 分类类别: - Gloves(手套):工作人员佩戴的手部防护装备。 - Helmet(安全帽):头部防护装备。 - No-Gloves(未戴手套):未佩戴手部防护的状态。 - No-Helmet(未戴安全帽):未佩戴头部防护的状态。 - No-Shoes(未穿安全鞋):未佩戴足部防护的状态。 - No-Vest(未穿安全背心):未佩戴身体防护的状态。 - Shoes(安全鞋):足部防护装备。 - Vest(安全背心):身体防护装备。 标注格式:YOLO格式,包含实例分割的多边形坐标和类别标签,适用于实例分割任务。 数据格式:来源于实际场景图像,适用于计算机视觉模型训练。 二、适用场景 工作场所安全监控系统开发:数据集支持实例分割任务,帮助构建能够自动识别工作人员个人防护装备穿戴状态的AI模型,提升工作环境安全性。 建筑与工业安全检查:集成至监控系统,实时检测PPE穿戴情况,预防安全事故,确保合规性。 学术研究与创新:支持计算机视觉在职业安全领域的应用研究,促进AI与安全工程的结合。 培训与教育:可用于安全培训课程,演示PPE识别技术,增强员工安全意识。 三、数据集优势 精准标注与多样性:每个实例均用多边形精确标注,确保分割边界准确;覆盖多种PPE物品及未穿戴状态,增加模型鲁棒性。 场景丰富:数据来源于多样环境,提升模型在不同场景下的泛化能力。 任务适配性强:标注兼容主流深度学习框架(如YOLO),可直接用于实例分割模型开发,支持目标检测和分割任务。 实用价值高:专注于工作场所安全,为自动化的PPE检测提供可靠数据支撑,有助于减少工伤事故。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值