From d2cd8a0ecb4d22c760bcd4d02dfd5f6808b2f111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Thu, 2 Apr 2015 14:17:12 +0800 Subject: [PATCH 01/45] =?UTF-8?q?=E6=9B=B4=E6=96=B0blog=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=A2=9E=E5=8A=A0=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iOSStudy/Bean/versionBean/VersionBean.h | 23 +++ iOSStudy/Bean/versionBean/VersionBean.m | 24 +++ iOSStudy/Tools/HttpVersionTools.h | 13 ++ iOSStudy/Tools/HttpVersionTools.m | 71 ++++++++ iOSStudy/iOSStudy.xcodeproj/project.pbxproj | 20 +++ iOSStudy/iOSStudy/Constants .h | 12 +- iOSStudy/iOSStudy/FirstViewController.m | 2 +- .../ViewModel/FirstViewControllerViewModel.h | 25 ++- .../iOSStudy.xcdatamodel/contents | 10 +- iOSStudyJsonData/blogs.json | 152 +++++++++--------- 10 files changed, 272 insertions(+), 80 deletions(-) create mode 100644 iOSStudy/Bean/versionBean/VersionBean.h create mode 100644 iOSStudy/Bean/versionBean/VersionBean.m create mode 100644 iOSStudy/Tools/HttpVersionTools.h create mode 100644 iOSStudy/Tools/HttpVersionTools.m diff --git a/iOSStudy/Bean/versionBean/VersionBean.h b/iOSStudy/Bean/versionBean/VersionBean.h new file mode 100644 index 0000000..8866057 --- /dev/null +++ b/iOSStudy/Bean/versionBean/VersionBean.h @@ -0,0 +1,23 @@ +// +// VersionBean.h +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import +#import +#import +@interface VersionBean : MTLModel +/** + * 当前请求地址的URL + */ +@property(nonatomic,copy)NSString *url; + +/** + * 当前请求地址URL版本号 + */ +@property(nonatomic,copy)NSString *urlVersion; + +@end diff --git a/iOSStudy/Bean/versionBean/VersionBean.m b/iOSStudy/Bean/versionBean/VersionBean.m new file mode 100644 index 0000000..7c7641c --- /dev/null +++ b/iOSStudy/Bean/versionBean/VersionBean.m @@ -0,0 +1,24 @@ +// +// VersionBean.m +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "VersionBean.h" + +@implementation VersionBean + + ++ (NSDictionary *)JSONKeyPathsByPropertyKey{ + + + return @{ + @"url": @"url", + @"urlVersion": @"urlVersion" + }; +} + + +@end diff --git a/iOSStudy/Tools/HttpVersionTools.h b/iOSStudy/Tools/HttpVersionTools.h new file mode 100644 index 0000000..9378953 --- /dev/null +++ b/iOSStudy/Tools/HttpVersionTools.h @@ -0,0 +1,13 @@ +// +// HttpVersionTools.h +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +@interface HttpVersionTools : NSObject + +@end diff --git a/iOSStudy/Tools/HttpVersionTools.m b/iOSStudy/Tools/HttpVersionTools.m new file mode 100644 index 0000000..575f195 --- /dev/null +++ b/iOSStudy/Tools/HttpVersionTools.m @@ -0,0 +1,71 @@ +// +// HttpVersionTools.m +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "HttpVersionTools.h" +#import "NetWorkTools.h" +#import "JsonTools.h" +#import +#import "VersionBean.h" +@implementation HttpVersionTools + +-(NSArray*)getVersions{ + + + __block NSMutableArray*versionArr = [NSMutableArray arrayWithCapacity:5]; + + [NetWorkTools postHttp:Adress_versions success:^(AFHTTPRequestOperation *operation, id responseObject) { + + NSLog(@"JSON: %@", [operation responseString]); + + NSArray *dic = [JsonTools getJsonNSDictionary:[operation responseString]]; + + //将JSON数据和Model的属性进行绑定 + + NSArray *arr = [MTLJSONAdapter modelsOfClass:[VersionBean class] fromJSONArray:dic error:nil]; + + + + versionArr = [arr copy]; + + + for (VersionBean *bean in arr) { + NSLog(@"%@",bean.urlVersion); + { + NSManagedObject *managerObjt =[NSEntityDescription insertNewObjectForEntityForName:CD_VersionsEntity inManagedObjectContext:SharedApp.managedObjectContext]; + + + [managerObjt setValue:bean.url forKey:@"url"]; + [managerObjt setValue:bean.urlVersion forKey:@"url_version"]; + + NSError *error; + if (![SharedApp.managedObjectContext save:&error]) + { + NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); + } + + } + } + + + + + } error:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); + + + + } isNetworking:^(BOOL isNetwork) { + + + + }]; + + + return versionArr; +} +@end diff --git a/iOSStudy/iOSStudy.xcodeproj/project.pbxproj b/iOSStudy/iOSStudy.xcodeproj/project.pbxproj index 77fbb5b..c539b50 100644 --- a/iOSStudy/iOSStudy.xcodeproj/project.pbxproj +++ b/iOSStudy/iOSStudy.xcodeproj/project.pbxproj @@ -33,6 +33,7 @@ 18B23B361A7A14D100E80854 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 18B23B341A7A14D100E80854 /* LaunchScreen.xib */; }; 18B23B421A7A14D100E80854 /* iOSStudyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B411A7A14D100E80854 /* iOSStudyTests.m */; }; 18B23B4D1A7A234800E80854 /* BaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B4C1A7A234800E80854 /* BaseViewController.m */; }; + 18C845091ACCFC690053884F /* HttpVersionTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C845081ACCFC690053884F /* HttpVersionTools.m */; }; 18CECC0A1A91ACB7005598E4 /* FirstViewControllerViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 18CECC091A91ACB7005598E4 /* FirstViewControllerViewModel.m */; }; 18D201161A95A6F400D5F095 /* icon_29.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2010D1A95A6F400D5F095 /* icon_29.png */; }; 18D201171A95A6F400D5F095 /* icon_40.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2010E1A95A6F400D5F095 /* icon_40.png */; }; @@ -65,6 +66,7 @@ 18DF6D3F1A80D40D005751E8 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18DF6D3E1A80D40D005751E8 /* SystemConfiguration.framework */; }; 18E016AA1ACAA898002A6E59 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18E016A91ACAA898002A6E59 /* CoreData.framework */; }; 18E016E51ACAAB35002A6E59 /* iOSStudy.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 18E016E31ACAAB35002A6E59 /* iOSStudy.xcdatamodeld */; }; + 18E6A0B51ACCF7FD00B28D32 /* VersionBean.m in Sources */ = {isa = PBXBuildFile; fileRef = 18E6A0B41ACCF7FD00B28D32 /* VersionBean.m */; }; 54A0444849F1931415392FC1 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E83ED1B8EA89BC57ACF91BA5 /* libPods.a */; }; /* End PBXBuildFile section */ @@ -128,6 +130,8 @@ 18B23B411A7A14D100E80854 /* iOSStudyTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iOSStudyTests.m; sourceTree = ""; }; 18B23B4B1A7A234800E80854 /* BaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BaseViewController.h; path = Base/BaseViewController.h; sourceTree = ""; }; 18B23B4C1A7A234800E80854 /* BaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BaseViewController.m; path = Base/BaseViewController.m; sourceTree = ""; }; + 18C845071ACCFC690053884F /* HttpVersionTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HttpVersionTools.h; path = Tools/HttpVersionTools.h; sourceTree = ""; }; + 18C845081ACCFC690053884F /* HttpVersionTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HttpVersionTools.m; path = Tools/HttpVersionTools.m; sourceTree = ""; }; 18CECC081A91ACB6005598E4 /* FirstViewControllerViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirstViewControllerViewModel.h; path = iOSStudy/ViewModel/FirstViewControllerViewModel.h; sourceTree = ""; }; 18CECC091A91ACB7005598E4 /* FirstViewControllerViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FirstViewControllerViewModel.m; path = iOSStudy/ViewModel/FirstViewControllerViewModel.m; sourceTree = ""; }; 18CECC101A921272005598E4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; }; @@ -166,6 +170,8 @@ 18DF6D3E1A80D40D005751E8 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; 18E016A91ACAA898002A6E59 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 18E016E41ACAAB35002A6E59 /* iOSStudy.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = iOSStudy.xcdatamodel; sourceTree = ""; }; + 18E6A0B31ACCF7FD00B28D32 /* VersionBean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VersionBean.h; path = Bean/versionBean/VersionBean.h; sourceTree = ""; }; + 18E6A0B41ACCF7FD00B28D32 /* VersionBean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VersionBean.m; path = Bean/versionBean/VersionBean.m; sourceTree = ""; }; 2E2CC00A58FD0A745C574BAD /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; E83ED1B8EA89BC57ACF91BA5 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -203,6 +209,7 @@ 189EF82F1A83994B00F19327 /* Bean */ = { isa = PBXGroup; children = ( + 18E6A0B21ACCF7C600B28D32 /* VersionBean */, 18AB47921A99965A00E4C030 /* videoBean */, 184F48B51A93341B00C5C22F /* webBean */, 189EF8301A83996500F19327 /* blogBean */, @@ -239,6 +246,8 @@ 189EF8351A839FC600F19327 /* JsonTools.m */, 18AB47A61A9DA40500E4C030 /* DBUtils.h */, 18AB47A71A9DA40500E4C030 /* DBUtils.m */, + 18C845071ACCFC690053884F /* HttpVersionTools.h */, + 18C845081ACCFC690053884F /* HttpVersionTools.m */, ); name = Tools; sourceTree = ""; @@ -442,6 +451,15 @@ name = libs; sourceTree = ""; }; + 18E6A0B21ACCF7C600B28D32 /* VersionBean */ = { + isa = PBXGroup; + children = ( + 18E6A0B31ACCF7FD00B28D32 /* VersionBean.h */, + 18E6A0B41ACCF7FD00B28D32 /* VersionBean.m */, + ); + name = VersionBean; + sourceTree = ""; + }; 910A021243EF9C731476BCA9 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -638,6 +656,8 @@ 18AB47951A99969600E4C030 /* VideoBean.m in Sources */, 18CECC0A1A91ACB7005598E4 /* FirstViewControllerViewModel.m in Sources */, 189EF8361A839FC600F19327 /* JsonTools.m in Sources */, + 18C845091ACCFC690053884F /* HttpVersionTools.m in Sources */, + 18E6A0B51ACCF7FD00B28D32 /* VersionBean.m in Sources */, 18DF6D3D1A80D3BC005751E8 /* Reachability.m in Sources */, 18B23B281A7A14D100E80854 /* AppDelegate.m in Sources */, 184F48AF1A93321700C5C22F /* SecondViewControllerViewModel.m in Sources */, diff --git a/iOSStudy/iOSStudy/Constants .h b/iOSStudy/iOSStudy/Constants .h index c7e120e..6f97cf5 100644 --- a/iOSStudy/iOSStudy/Constants .h +++ b/iOSStudy/iOSStudy/Constants .h @@ -14,9 +14,19 @@ #define Address_blogs @"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/blogs.json" #define Adress_webs @"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json" #define Adress_videos @"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json" + +#define Adress_versions @"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/versions.json" + #define SharedApp ((AppDelegate *)[[UIApplication sharedApplication] delegate]) #define PATH_OF_DOCUMENT [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] - +/** + * 收藏的数据库表明 + */ #define CD_FAVOURITE_BEAN @"FavouriteBean" + +/** + * http版本号数据库表明 + */ +#define CD_VersionsEntity @"VersionsEntity" #endif diff --git a/iOSStudy/iOSStudy/FirstViewController.m b/iOSStudy/iOSStudy/FirstViewController.m index 619faa1..d3edb54 100644 --- a/iOSStudy/iOSStudy/FirstViewController.m +++ b/iOSStudy/iOSStudy/FirstViewController.m @@ -26,7 +26,7 @@ @implementation FirstViewController - (void)viewDidLoad { [super viewDidLoad]; - + _tableView.delegate = self; _tableView.dataSource = self; diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h index cfbfc30..5d0fe18 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h @@ -10,8 +10,20 @@ #import "NetWorkTools.h" #import "JsonTools.h" #import "BlogBean.h" +/** + * 网络请求成功回调 + */ typedef void (^modelSuccess)(); +/** + * 网络请求失败回调 + */ typedef void (^modelError)(); + +/** + * 网络是否链接回调 + * + * @param isNetWorking YES 有网络 NO 没有网络 + */ typedef void (^modelNetWorking)(BOOL isNetWorking); @interface FirstViewControllerViewModel : NSObject @@ -44,8 +56,19 @@ typedef void (^modelNetWorking)(BOOL isNetWorking); - +/** + * 添加收藏到数据库 + * + * @param indexPath indexPath + */ -(void)saveFavourite:(NSIndexPath*)indexPath; +/** + * 此链接是否在数据库已经存在 + * + * @param url url地址 + * + * @return YES 存在 NO 不存在 + */ -(BOOL)isExistURL:(NSString*)url; @end diff --git a/iOSStudy/iOSStudy/iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents b/iOSStudy/iOSStudy/iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents index 6944e80..423b29f 100644 --- a/iOSStudy/iOSStudy/iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents +++ b/iOSStudy/iOSStudy/iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -7,7 +7,13 @@ + + + + + - + + \ No newline at end of file diff --git a/iOSStudyJsonData/blogs.json b/iOSStudyJsonData/blogs.json index 99d8a03..c90196e 100644 --- a/iOSStudyJsonData/blogs.json +++ b/iOSStudyJsonData/blogs.json @@ -1,75 +1,77 @@ - [ - { - "name": "破船之家", - "title": "破船之家的技术博客", - "subTitle": "去留无意,漫随天外云卷云舒", - "image": "https://avatars1.githubusercontent.com/u/3365146?v=3&s=460", - "url": "http://beyondvincent.com/", - "rssUrl": "http://beyondvincent.com/atom.xml", - "date": "2015-01-30 17:08:03" - }, - { - "name": "唐巧", - "title": "唐巧的技术博客", - "subTitle": "唐巧的技术博客记录下自己学习的点滴", - "image": "http://blog.devtang.com/images/weixin-qr.jpg", - "url": "http://blog.devtang.com", - "rssUrl": "http://blog.devtang.com/atom.xml", - "date": "2015-01-30 17:08:03" - }, - { - "name": "OneV's Den", - "title": "OneV's Den的技术博客", - "subTitle": "嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。", - "image": "http://onevcat.com/content/images/2014/May/200.jpg", - "url": "http://onevcat.com/", - "rssUrl": "http://onevcat.com/rss/", - "date": "2015-01-30 17:08:03" - }, - { - "name": "Limboy", - "title": "Limboy的技术博客", - "subTitle": "对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。", - "image": "https://avatars2.githubusercontent.com/u/35974?v=3&s=460", - "url": "http://limboy.me/", - "rssUrl": "http://feeds.feedburner.com/lzyy", - "date": "2015-01-30 17:08:03" - }, - { - "name": "刘坤", - "title": "刘坤的技术博客", - "subTitle": "嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意", - "image": "http://blog.cnbluebox.com/images/face_liukun.jpeg", - "url": "http://blog.cnbluebox.com/", - "rssUrl": "http://blog.cnbluebox.com/atom.xml", - "date": "2015-01-30 17:08:03" - }, - { - "name": "叶孤城___", - "title": "叶孤城___", - "subTitle": "ios开发者。Vim学习中", - "image": "http://tp1.sinaimg.cn/1438670852/180/5695641016/1", - "url": "http://www.jianshu.com/users/b82d2721ba07/latest_articles", - "rssUrl": "http://www.jianshu.com/users/b82d2721ba07/latest_articles", - "date": "2015-01-30 17:08:03" - - }, - { - "name": "王轲", - "title": "王轲的技术博客", - "subTitle": "王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性", - "image": "http://www.iwangke.me/img/GithubForMacIcon.png", - "url": "http://www.iwangke.me/", - "rssUrl": "http://www.iwangke.me/atom.xml", - "date": "2015-01-30 17:08:03" - }, - { - "name": "txx's blog", - "title": "txx's blog", - "subTitle": "90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看", - "image": "http://www.iwangke.me/img/GithubForMacIcon.png", - "url": "http://blog.txx.im/", - "rssUrl": "http://blog.txx.im/atom.xml", - "date": "2015-01-30 17:08:03" - } - ] \ No newline at end of file +{ + "version": "1", + "bloglists": [ + { + "name": "破船之家", + "title": "破船之家的技术博客", + "subTitle": "去留无意,漫随天外云卷云舒", + "image": "https://avatars1.githubusercontent.com/u/3365146?v=3&s=460", + "url": "http://beyondvincent.com/", + "rssUrl": "http://beyondvincent.com/atom.xml", + "date": "2015-01-30 17:08:03" + }, + { + "name": "唐巧", + "title": "唐巧的技术博客", + "subTitle": "唐巧的技术博客记录下自己学习的点滴", + "image": "http://blog.devtang.com/images/weixin-qr.jpg", + "url": "http://blog.devtang.com", + "rssUrl": "http://blog.devtang.com/atom.xml", + "date": "2015-01-30 17:08:03" + }, + { + "name": "OneV's Den", + "title": "OneV's Den的技术博客", + "subTitle": "嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。", + "image": "http://onevcat.com/content/images/2014/May/200.jpg", + "url": "http://onevcat.com/", + "rssUrl": "http://onevcat.com/rss/", + "date": "2015-01-30 17:08:03" + }, + { + "name": "Limboy", + "title": "Limboy的技术博客", + "subTitle": "对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。", + "image": "https://avatars2.githubusercontent.com/u/35974?v=3&s=460", + "url": "http://limboy.me/", + "rssUrl": "http://feeds.feedburner.com/lzyy", + "date": "2015-01-30 17:08:03" + }, + { + "name": "刘坤", + "title": "刘坤的技术博客", + "subTitle": "嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意", + "image": "http://blog.cnbluebox.com/images/face_liukun.jpeg", + "url": "http://blog.cnbluebox.com/", + "rssUrl": "http://blog.cnbluebox.com/atom.xml", + "date": "2015-01-30 17:08:03" + }, + { + "name": "叶孤城___", + "title": "叶孤城___", + "subTitle": "ios开发者。Vim学习中", + "image": "http://tp1.sinaimg.cn/1438670852/180/5695641016/1", + "url": "http://www.jianshu.com/users/b82d2721ba07/latest_articles", + "rssUrl": "http://www.jianshu.com/users/b82d2721ba07/latest_articles", + "date": "2015-01-30 17:08:03" + }, + { + "name": "王轲", + "title": "王轲的技术博客", + "subTitle": "王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性", + "image": "http://www.iwangke.me/img/GithubForMacIcon.png", + "url": "http://www.iwangke.me/", + "rssUrl": "http://www.iwangke.me/atom.xml", + "date": "2015-01-30 17:08:03" + }, + { + "name": "txx's blog", + "title": "txx's blog", + "subTitle": "90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看", + "image": "http://www.iwangke.me/img/GithubForMacIcon.png", + "url": "http://blog.txx.im/", + "rssUrl": "http://blog.txx.im/atom.xml", + "date": "2015-01-30 17:08:03" + } + ] +} From a16e7443304264eb4414ea8fea458f3b36bb167c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Fri, 3 Apr 2015 13:54:20 +0800 Subject: [PATCH 02/45] Blog+CoreData+Version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit blog模块增加Coredata 支持 增加了版本判断 --- iOSStudy/Bean/blogBean/BlogBean.h | 2 + iOSStudy/Bean/blogBean/BlogBean.m | 1 + iOSStudy/Bean/blogBean/BlogJsonBean.h | 15 ++ iOSStudy/Bean/blogBean/BlogJsonBean.m | 22 +++ iOSStudy/Tools/CoreDataUtils.h | 22 +++ iOSStudy/Tools/CoreDataUtils.m | 49 +++++ iOSStudy/Tools/HttpVersionTools.h | 66 +++++++ iOSStudy/Tools/HttpVersionTools.m | 170 +++++++++++++++--- iOSStudy/Tools/NetWorkTools.m | 1 + iOSStudy/iOSStudy.xcodeproj/project.pbxproj | 24 +++ iOSStudy/iOSStudy/AppDelegate.h | 4 + iOSStudy/iOSStudy/AppDelegate.m | 7 +- iOSStudy/iOSStudy/Base.lproj/Main.storyboard | 35 +++- iOSStudy/iOSStudy/Constants .h | 2 +- iOSStudy/iOSStudy/MainTabBarViewController.h | 13 ++ iOSStudy/iOSStudy/MainTabBarViewController.m | 37 ++++ .../ViewModel/FirstViewControllerViewModel.m | 129 ++++++------- iOSStudy/iOSStudy/WelcomeViewController.h | 13 ++ iOSStudy/iOSStudy/WelcomeViewController.m | 70 ++++++++ iOSStudyJsonData/.versions.json.swp | Bin 0 -> 12288 bytes iOSStudyJsonData/versions.json | 2 +- 21 files changed, 587 insertions(+), 97 deletions(-) create mode 100644 iOSStudy/Bean/blogBean/BlogJsonBean.h create mode 100644 iOSStudy/Bean/blogBean/BlogJsonBean.m create mode 100644 iOSStudy/Tools/CoreDataUtils.h create mode 100644 iOSStudy/Tools/CoreDataUtils.m create mode 100644 iOSStudy/iOSStudy/MainTabBarViewController.h create mode 100644 iOSStudy/iOSStudy/MainTabBarViewController.m create mode 100644 iOSStudy/iOSStudy/WelcomeViewController.h create mode 100644 iOSStudy/iOSStudy/WelcomeViewController.m create mode 100644 iOSStudyJsonData/.versions.json.swp diff --git a/iOSStudy/Bean/blogBean/BlogBean.h b/iOSStudy/Bean/blogBean/BlogBean.h index a5d9180..5e4d6ae 100644 --- a/iOSStudy/Bean/blogBean/BlogBean.h +++ b/iOSStudy/Bean/blogBean/BlogBean.h @@ -38,4 +38,6 @@ * 博客地址 */ @property(nonatomic,copy)NSString*date; + +@property(nonatomic,copy)NSString*version; @end diff --git a/iOSStudy/Bean/blogBean/BlogBean.m b/iOSStudy/Bean/blogBean/BlogBean.m index 6e26d6f..c0152c9 100644 --- a/iOSStudy/Bean/blogBean/BlogBean.m +++ b/iOSStudy/Bean/blogBean/BlogBean.m @@ -13,6 +13,7 @@ + (NSDictionary *)JSONKeyPathsByPropertyKey{ return @{ + @"version":@"version", @"name": @"name", @"title": @"title", @"subTitle": @"subTitle", diff --git a/iOSStudy/Bean/blogBean/BlogJsonBean.h b/iOSStudy/Bean/blogBean/BlogJsonBean.h new file mode 100644 index 0000000..c8b122e --- /dev/null +++ b/iOSStudy/Bean/blogBean/BlogJsonBean.h @@ -0,0 +1,15 @@ +// +// BlogJsonBean.h +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import +#import +#import +@interface BlogJsonBean : MTLModel +@property(nonatomic,copy)NSString *version; +@property(nonatomic,strong)NSArray *bloglists; +@end diff --git a/iOSStudy/Bean/blogBean/BlogJsonBean.m b/iOSStudy/Bean/blogBean/BlogJsonBean.m new file mode 100644 index 0000000..11ecbd3 --- /dev/null +++ b/iOSStudy/Bean/blogBean/BlogJsonBean.m @@ -0,0 +1,22 @@ +// +// BlogJsonBean.m +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "BlogJsonBean.h" + +@implementation BlogJsonBean + ++ (NSDictionary *)JSONKeyPathsByPropertyKey{ + + + return @{ + @"version": @"version", + @"bloglists": @"bloglists" + }; +} + +@end diff --git a/iOSStudy/Tools/CoreDataUtils.h b/iOSStudy/Tools/CoreDataUtils.h new file mode 100644 index 0000000..5b7af68 --- /dev/null +++ b/iOSStudy/Tools/CoreDataUtils.h @@ -0,0 +1,22 @@ +// +// CoreDataUtils.h +// iOSStudy +// +// Created by chenguandong on 15/4/3. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +@interface CoreDataUtils : NSObject +/** + * 检查数据是否在表中已经存在 + * + * @param url http地址 + * @param tableName 表名 + * @param rowName 数据所在的列名 + * + * @return YES 存在 NO 不存在 + */ ++(BOOL)dataisExist:(NSString*)url inTable:(NSString*)tableName tableRowName:(NSString*)rowName; +@end diff --git a/iOSStudy/Tools/CoreDataUtils.m b/iOSStudy/Tools/CoreDataUtils.m new file mode 100644 index 0000000..6847c74 --- /dev/null +++ b/iOSStudy/Tools/CoreDataUtils.m @@ -0,0 +1,49 @@ +// +// CoreDataUtils.m +// iOSStudy +// +// Created by chenguandong on 15/4/3. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "CoreDataUtils.h" +#import +#import "Constants .h" +@implementation CoreDataUtils + +/** + * 检查数据是否在表中已经存在 + * + * @param url http地址 + * @param tableName 表名 + * @param rowName 数据所在的列名 + * + * @return YES 存在 NO 不存在 + */ ++(BOOL)dataisExist:(NSString*)url inTable:(NSString*)tableName tableRowName:(NSString*)rowName{ + + NSError *error; + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription *entity = [NSEntityDescription + entityForName:tableName inManagedObjectContext:SharedApp.managedObjectContext]; + [fetchRequest setEntity:entity]; + + NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + + + + NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"%@ = %@",rowName, url]; + + + NSArray *resultArr = [fetchedObjects filteredArrayUsingPredicate:titlePredicate]; + if (resultArr.count!=0) { + // NSLog(@"111%lu",resultArr.count); + return YES; + }else{ + // NSLog(@"222%lu",resultArr.count); + return NO; + } + + +} +@end diff --git a/iOSStudy/Tools/HttpVersionTools.h b/iOSStudy/Tools/HttpVersionTools.h index 9378953..fbb382d 100644 --- a/iOSStudy/Tools/HttpVersionTools.h +++ b/iOSStudy/Tools/HttpVersionTools.h @@ -8,6 +8,72 @@ #import + +/** + * 网络请求成功回调 + */ +typedef void (^versionSuccess)(NSArray*versionLists); +/** + * 网络请求失败回调 + */ +typedef void (^versionError)(); + +/** + * 网络是否链接回调 + * + * @param isNetWorking YES 有网络 NO 没有网络 + */ +typedef void (^versionNetWorking)(BOOL isNetWorking); + + @interface HttpVersionTools : NSObject + +/** + * 得到当前服务器版本号列表 + * + * @return 服务器版本号列表 + */ ++(void)getVersions:(versionSuccess)v_success v_error:(versionError)v_error v_netWork:(versionNetWorking)v_netWork; + + +/** + * 判断版本号是否向服务器请求最新数据 + * + * @param url http请求地址 + * + * @return YES 发送请求 NO 不发送请求 + */ ++(BOOL)checkHttpVersion:(NSString*)url nowVersion:(NSString*)nowVersion; + + +/** + * 返回服务器当前url版本号 + * + * @param url http请求地址 + * + * @return 服务器当前url版本号 + */ ++(NSString*)getNowHttpVersion:(NSString*)url; + + +/** + * 得到URL本地版本号 + * + * @param url URL地址 + * + * @return !nil 本地版本号 nil 没有本地版本号 + */ ++(NSString*)getLocalHttpVersion:(NSString*)url; + + + +/** + * 存储当前服务器返回的版本号 + * + * @param url http 请求地址 + * @param version 版本号 + */ ++(void)saveNowHttpVersion:(NSString*)url version:(NSString*)version; + @end diff --git a/iOSStudy/Tools/HttpVersionTools.m b/iOSStudy/Tools/HttpVersionTools.m index 575f195..e79dde9 100644 --- a/iOSStudy/Tools/HttpVersionTools.m +++ b/iOSStudy/Tools/HttpVersionTools.m @@ -11,9 +11,10 @@ #import "JsonTools.h" #import #import "VersionBean.h" +#import "CoreDataUtils.h" @implementation HttpVersionTools --(NSArray*)getVersions{ ++(void)getVersions:(versionSuccess)v_success v_error:(versionError)v_error v_netWork:(versionNetWorking)v_netWork{ __block NSMutableArray*versionArr = [NSMutableArray arrayWithCapacity:5]; @@ -28,44 +29,163 @@ -(NSArray*)getVersions{ NSArray *arr = [MTLJSONAdapter modelsOfClass:[VersionBean class] fromJSONArray:dic error:nil]; + versionArr = [arr copy]; +// for (VersionBean *vBean in versionArr) { +// NSLog(@"version =%@",vBean.urlVersion); +// } - versionArr = [arr copy]; + v_success(versionArr); - - for (VersionBean *bean in arr) { - NSLog(@"%@",bean.urlVersion); - { - NSManagedObject *managerObjt =[NSEntityDescription insertNewObjectForEntityForName:CD_VersionsEntity inManagedObjectContext:SharedApp.managedObjectContext]; - - - [managerObjt setValue:bean.url forKey:@"url"]; - [managerObjt setValue:bean.urlVersion forKey:@"url_version"]; - - NSError *error; - if (![SharedApp.managedObjectContext save:&error]) - { - NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); - } - - } - } + } error:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); + v_error(); + } isNetworking:^(BOOL isNetwork) { + + v_netWork(isNetwork); + }]; + + +} + +/** + * 返回服务器当前url版本号 + * + * @param url http请求地址 + * + * @return 服务器当前url版本号 + */ ++(NSString*)getNowHttpVersion:(NSString*)url{ + + NSString *versionStr ; + for (VersionBean *vBean in SharedApp.versionLists) { + + NSLog(@"url=%@",url); + NSLog(@"%@",vBean.url); + + if ([vBean.url isEqualToString:url]) { + + versionStr = vBean.urlVersion; + + }else{ + versionStr = nil; + } + } + NSLog(@"nowVersion = %@",versionStr); + return versionStr; +} + + +/** + * 存储当前服务器返回的版本号 + * + * @param url http 请求地址 + * @param version 版本号 + */ ++(void)saveNowHttpVersion:(NSString*)url version:(NSString*)version{ + + + //当数据存在事后执行更新操作 + if ([CoreDataUtils dataisExist:url inTable:CD_VersionsEntity tableRowName:@"url"]) - } error:^(AFHTTPRequestOperation *operation, NSError *error) { - NSLog(@"Error: %@", error); + { + NSManagedObject *updateObjt = [[NSManagedObject alloc]init]; + [updateObjt setValue:url forKey:@"url"]; + [updateObjt setValue:version forKey:@"url_version"]; - } isNetworking:^(BOOL isNetwork) { + NSError *error; + if (![SharedApp.managedObjectContext save:&error]) + { + NSLog(@"版本号更新失败: %@", [error localizedDescription]); + + } + + } + else + //当数据不存在的事后执行插入操作 + { + NSManagedObject *managerObjt =[NSEntityDescription insertNewObjectForEntityForName:CD_VersionsEntity inManagedObjectContext:SharedApp.managedObjectContext]; + + + [managerObjt setValue:url forKey:@"url"]; + [managerObjt setValue:version forKey:@"url_version"];; + + NSError *error; + if (![SharedApp.managedObjectContext save:&error]) + { + NSLog(@"版本号存储失败: %@", [error localizedDescription]); + + } + } + + +} + + + +/** + * 判断版本号是否向服务器请求最新数据 + * + * @param url http请求地址 + * + * @return YES 发送请求 NO 不发送请求 + */ ++(BOOL)checkHttpVersion:(NSString*)url nowVersion:(NSString*)nowVersion{ + + + //从数据库拿到URL 版本号 如果没有说明第一次请求 直接发送请求 + + if ([[self getLocalHttpVersion:url]floatValue]!=[nowVersion floatValue]) { + + return YES; + }else{ + return NO; + } + - }]; +} + +/** + * 得到URL本地版本号 + * + * @param url URL地址 + * + * @return !nil 本地版本号 nil 没有本地版本号 + */ ++(NSString*)getLocalHttpVersion:(NSString*)url{ + NSError *error; + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription *entity = [NSEntityDescription + entityForName:CD_VersionsEntity inManagedObjectContext:SharedApp.managedObjectContext]; + [fetchRequest setEntity:entity]; + + NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + + + NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url = %@", url]; - return versionArr; + NSArray *resultArr = [fetchedObjects filteredArrayUsingPredicate:titlePredicate]; + if (resultArr.count!=0) { + NSLog(@"111%lu",resultArr.count); + + NSManagedObject *objt = resultArr[0]; + + + return [objt valueForKey:@"url_version"]; + }else{ + NSLog(@"222%lu",resultArr.count); + return nil; + } + + } + @end diff --git a/iOSStudy/Tools/NetWorkTools.m b/iOSStudy/Tools/NetWorkTools.m index 0b30257..007d513 100644 --- a/iOSStudy/Tools/NetWorkTools.m +++ b/iOSStudy/Tools/NetWorkTools.m @@ -24,6 +24,7 @@ + (instancetype)sharedInstance { +(void)postHttp:(NSString*)httpUrl success:(success)success error:(error)error isNetworking:(isNetwork)isNetworking{ + if (SharedApp.isNetworking) { AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; diff --git a/iOSStudy/iOSStudy.xcodeproj/project.pbxproj b/iOSStudy/iOSStudy.xcodeproj/project.pbxproj index c539b50..8f770fd 100644 --- a/iOSStudy/iOSStudy.xcodeproj/project.pbxproj +++ b/iOSStudy/iOSStudy.xcodeproj/project.pbxproj @@ -34,6 +34,10 @@ 18B23B421A7A14D100E80854 /* iOSStudyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B411A7A14D100E80854 /* iOSStudyTests.m */; }; 18B23B4D1A7A234800E80854 /* BaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B4C1A7A234800E80854 /* BaseViewController.m */; }; 18C845091ACCFC690053884F /* HttpVersionTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C845081ACCFC690053884F /* HttpVersionTools.m */; }; + 18C8450C1ACD41C40053884F /* BlogJsonBean.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C8450B1ACD41C40053884F /* BlogJsonBean.m */; }; + 18C8450F1ACE3E580053884F /* CoreDataUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C8450E1ACE3E580053884F /* CoreDataUtils.m */; }; + 18C845121ACE4A580053884F /* WelcomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C845111ACE4A580053884F /* WelcomeViewController.m */; }; + 18C845151ACE56150053884F /* MainTabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C845141ACE56150053884F /* MainTabBarViewController.m */; }; 18CECC0A1A91ACB7005598E4 /* FirstViewControllerViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 18CECC091A91ACB7005598E4 /* FirstViewControllerViewModel.m */; }; 18D201161A95A6F400D5F095 /* icon_29.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2010D1A95A6F400D5F095 /* icon_29.png */; }; 18D201171A95A6F400D5F095 /* icon_40.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2010E1A95A6F400D5F095 /* icon_40.png */; }; @@ -132,6 +136,14 @@ 18B23B4C1A7A234800E80854 /* BaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BaseViewController.m; path = Base/BaseViewController.m; sourceTree = ""; }; 18C845071ACCFC690053884F /* HttpVersionTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HttpVersionTools.h; path = Tools/HttpVersionTools.h; sourceTree = ""; }; 18C845081ACCFC690053884F /* HttpVersionTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HttpVersionTools.m; path = Tools/HttpVersionTools.m; sourceTree = ""; }; + 18C8450A1ACD41C40053884F /* BlogJsonBean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlogJsonBean.h; path = Bean/blogBean/BlogJsonBean.h; sourceTree = ""; }; + 18C8450B1ACD41C40053884F /* BlogJsonBean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BlogJsonBean.m; path = Bean/blogBean/BlogJsonBean.m; sourceTree = ""; }; + 18C8450D1ACE3E580053884F /* CoreDataUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CoreDataUtils.h; path = Tools/CoreDataUtils.h; sourceTree = ""; }; + 18C8450E1ACE3E580053884F /* CoreDataUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CoreDataUtils.m; path = Tools/CoreDataUtils.m; sourceTree = ""; }; + 18C845101ACE4A580053884F /* WelcomeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WelcomeViewController.h; sourceTree = ""; }; + 18C845111ACE4A580053884F /* WelcomeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WelcomeViewController.m; sourceTree = ""; }; + 18C845131ACE56150053884F /* MainTabBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainTabBarViewController.h; sourceTree = ""; }; + 18C845141ACE56150053884F /* MainTabBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainTabBarViewController.m; sourceTree = ""; }; 18CECC081A91ACB6005598E4 /* FirstViewControllerViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirstViewControllerViewModel.h; path = iOSStudy/ViewModel/FirstViewControllerViewModel.h; sourceTree = ""; }; 18CECC091A91ACB7005598E4 /* FirstViewControllerViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FirstViewControllerViewModel.m; path = iOSStudy/ViewModel/FirstViewControllerViewModel.m; sourceTree = ""; }; 18CECC101A921272005598E4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; }; @@ -224,6 +236,8 @@ children = ( 189EF8311A8399B100F19327 /* BlogBean.h */, 189EF8321A8399B100F19327 /* BlogBean.m */, + 18C8450A1ACD41C40053884F /* BlogJsonBean.h */, + 18C8450B1ACD41C40053884F /* BlogJsonBean.m */, ); name = blogBean; sourceTree = ""; @@ -248,6 +262,8 @@ 18AB47A71A9DA40500E4C030 /* DBUtils.m */, 18C845071ACCFC690053884F /* HttpVersionTools.h */, 18C845081ACCFC690053884F /* HttpVersionTools.m */, + 18C8450D1ACE3E580053884F /* CoreDataUtils.h */, + 18C8450E1ACE3E580053884F /* CoreDataUtils.m */, ); name = Tools; sourceTree = ""; @@ -301,6 +317,8 @@ 18B23B211A7A14D000E80854 /* iOSStudy */ = { isa = PBXGroup; children = ( + 18C845101ACE4A580053884F /* WelcomeViewController.h */, + 18C845111ACE4A580053884F /* WelcomeViewController.m */, 18B23B261A7A14D100E80854 /* AppDelegate.h */, 18B23B271A7A14D100E80854 /* AppDelegate.m */, 18B23B291A7A14D100E80854 /* FirstViewController.h */, @@ -318,6 +336,8 @@ 18B23B341A7A14D100E80854 /* LaunchScreen.xib */, 18B23B221A7A14D000E80854 /* Supporting Files */, 18E016E31ACAAB35002A6E59 /* iOSStudy.xcdatamodeld */, + 18C845131ACE56150053884F /* MainTabBarViewController.h */, + 18C845141ACE56150053884F /* MainTabBarViewController.m */, ); path = iOSStudy; sourceTree = ""; @@ -651,6 +671,7 @@ 18AB47A81A9DA40500E4C030 /* DBUtils.m in Sources */, 18AB47A51A9C82FA00E4C030 /* AddBlogTableViewController.m in Sources */, 18D908A71A8A205600B42A42 /* ThirdTableViewController.m in Sources */, + 18C8450C1ACD41C40053884F /* BlogJsonBean.m in Sources */, 18AB479B1A9C59CB00E4C030 /* UIImage+Resize.m in Sources */, 18D201421A96143300D5F095 /* ThirdViewControllerViewModel.m in Sources */, 18AB47951A99969600E4C030 /* VideoBean.m in Sources */, @@ -664,9 +685,12 @@ 18B23B2B1A7A14D100E80854 /* FirstViewController.m in Sources */, 189EF83A1A83C3AF00F19327 /* BlogDetailViewController.m in Sources */, 185EEB4B1A98DC9900BFDB79 /* SettingTableViewController.m in Sources */, + 18C845121ACE4A580053884F /* WelcomeViewController.m in Sources */, 18B23B251A7A14D100E80854 /* main.m in Sources */, 18AB47AB1AA415A400E4C030 /* FavouriteBean.m in Sources */, 184F48B41A93340F00C5C22F /* WebBean.m in Sources */, + 18C845151ACE56150053884F /* MainTabBarViewController.m in Sources */, + 18C8450F1ACE3E580053884F /* CoreDataUtils.m in Sources */, 189EF8331A8399B100F19327 /* BlogBean.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/iOSStudy/iOSStudy/AppDelegate.h b/iOSStudy/iOSStudy/AppDelegate.h index a86a54a..5c21979 100644 --- a/iOSStudy/iOSStudy/AppDelegate.h +++ b/iOSStudy/iOSStudy/AppDelegate.h @@ -14,6 +14,10 @@ @property(nonatomic,assign)__block BOOL isNetworking; @property(nonatomic,copy)NSString *str; +#pragma mark --version list +@property(nonatomic,strong)NSArray *versionLists; + + #pragma mark --coreData @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; diff --git a/iOSStudy/iOSStudy/AppDelegate.m b/iOSStudy/iOSStudy/AppDelegate.m index 5ae2306..121b7e5 100644 --- a/iOSStudy/iOSStudy/AppDelegate.m +++ b/iOSStudy/iOSStudy/AppDelegate.m @@ -8,7 +8,6 @@ #import "AppDelegate.h" #import "NetWorkTools.h" - @interface AppDelegate () @end @@ -18,8 +17,7 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. - NSLog(@"------checkNetworking"); - + // Do any additional setup after loading the view. [NetWorkTools checkNetworking]; [self setGlobalStyle]; @@ -67,6 +65,7 @@ -(void)dealloc{ - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } - (void)applicationDidEnterBackground:(UIApplication *)application { @@ -82,6 +81,8 @@ - (void)applicationWillEnterForeground:(UIApplication *)application { - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + + } - (void)applicationWillTerminate:(UIApplication *)application { diff --git a/iOSStudy/iOSStudy/Base.lproj/Main.storyboard b/iOSStudy/iOSStudy/Base.lproj/Main.storyboard index 20f14c6..0276cb7 100644 --- a/iOSStudy/iOSStudy/Base.lproj/Main.storyboard +++ b/iOSStudy/iOSStudy/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + @@ -264,7 +264,7 @@ - + @@ -613,6 +613,35 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/iOSStudy/iOSStudy/Constants .h b/iOSStudy/iOSStudy/Constants .h index 6f97cf5..0dbc2d2 100644 --- a/iOSStudy/iOSStudy/Constants .h +++ b/iOSStudy/iOSStudy/Constants .h @@ -11,7 +11,7 @@ #ifndef iOSStudy_Constants__h #define iOSStudy_Constants__h -#define Address_blogs @"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/blogs.json" +#define Address_blogs @"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json" #define Adress_webs @"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json" #define Adress_videos @"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json" diff --git a/iOSStudy/iOSStudy/MainTabBarViewController.h b/iOSStudy/iOSStudy/MainTabBarViewController.h new file mode 100644 index 0000000..73bb465 --- /dev/null +++ b/iOSStudy/iOSStudy/MainTabBarViewController.h @@ -0,0 +1,13 @@ +// +// MainTabBarViewController.h +// iOSStudy +// +// Created by chenguandong on 15/4/3. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +@interface MainTabBarViewController : UITabBarController + +@end diff --git a/iOSStudy/iOSStudy/MainTabBarViewController.m b/iOSStudy/iOSStudy/MainTabBarViewController.m new file mode 100644 index 0000000..2fcd90a --- /dev/null +++ b/iOSStudy/iOSStudy/MainTabBarViewController.m @@ -0,0 +1,37 @@ +// +// MainTabBarViewController.m +// iOSStudy +// +// Created by chenguandong on 15/4/3. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "MainTabBarViewController.h" + +@interface MainTabBarViewController () + +@end + +@implementation MainTabBarViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m index 2426222..c9276b6 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m @@ -9,12 +9,17 @@ #import "FirstViewControllerViewModel.h" #import "FavouriteBean.h" #import "Constants .h" +#import "BlogJsonBean.h" +#import "HttpVersionTools.h" +#import "CoreDataUtils.h" @implementation FirstViewControllerViewModel - (instancetype)init { self = [super init]; if (self) { _array = [NSMutableArray array]; + + } return self; } @@ -32,50 +37,74 @@ -(BlogBean*)getBlogBean:(NSIndexPath *)indexPath{ } + + -(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring{ _array = [[self getPersistenceData]copy]; - modelDataSuccess(); + + __block NSString *versionStr; - - - // - [NetWorkTools postHttp:Address_blogs success:^(AFHTTPRequestOperation *operation, id responseObject) { - - NSLog(@"JSON: %@", [operation responseString]); - - NSArray *dic = [JsonTools getJsonNSDictionary:[operation responseString]]; + if ([HttpVersionTools checkHttpVersion:Address_blogs nowVersion:[HttpVersionTools getNowHttpVersion:Address_blogs]]) { - //将JSON数据和Model的属性进行绑定 - - NSArray *arr = [MTLJSONAdapter modelsOfClass:[BlogBean class] fromJSONArray:dic error:nil]; - - for (BlogBean *bean in arr) { - NSLog(@"%@",bean.image); - } - - _array = [arr copy]; - - - modelDataSuccess(); - - [self persistenceData]; + // + [NetWorkTools postHttp:Address_blogs success:^(AFHTTPRequestOperation *operation, id responseObject) { + + NSLog(@"JSON: %@", [operation responseString]); + + NSDictionary *dic = [JsonTools getJsonNSDictionary:[operation responseString]]; + + //NSLog(@"jsonVersion=%@",dic[@"version"]); + + + versionStr =dic[@"version"]; + + //将JSON数据和Model的属性进行绑定 + + // NSLog(@"%@arr=",dic[@"bloglists"]); + + NSArray *arr = [MTLJSONAdapter modelsOfClass:[BlogBean class] fromJSONArray:dic[@"bloglists"] error:nil]; + + + + // for (BlogBean *bean in arr) { + // NSLog(@"%@imae=",bean.image); + // } + + _array = [arr copy]; + + + modelDataSuccess(); + + //持久化数据 + [self persistenceData]; + + //当前最新版本号存入数据库 + + [HttpVersionTools saveNowHttpVersion:Address_blogs version:versionStr]; + + + } error:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); + + modelDataErrors(); + + } isNetworking:^(BOOL isNetwork) { + + + modelDataIsNetWoring(isNetwork); + + + }]; + }else{ + //直接显示持久化数据 数据显示完毕 + modelDataSuccess(); + } - } error:^(AFHTTPRequestOperation *operation, NSError *error) { - NSLog(@"Error: %@", error); - - modelDataErrors(); - - } isNetworking:^(BOOL isNetwork) { - - - modelDataIsNetWoring(isNetwork); - - - }]; + } @@ -177,37 +206,9 @@ -(void)saveFavourite:(NSIndexPath*)indexPath{ //检查这个URL在数据库是否存在 -(BOOL)isExistURL:(NSString*)url{ - NSError *error; - NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; - NSEntityDescription *entity = [NSEntityDescription - entityForName:CD_FAVOURITE_BEAN inManagedObjectContext:SharedApp.managedObjectContext]; - [fetchRequest setEntity:entity]; - - NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; - - for (NSManagedObject *info in fetchedObjects) { - NSLog(@"Name: %@", [info valueForKey:@"title"]); - /* - NSManagedObject *details = [info valueForKey:@"details"]; - NSLog(@"Zip: %@", [details valueForKey:@"zip"]); - */ - } + return [CoreDataUtils dataisExist:url inTable:CD_FAVOURITE_BEAN tableRowName:@"url"]; - - NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url = %@", url]; - - - NSArray *resultArr = [fetchedObjects filteredArrayUsingPredicate:titlePredicate]; - if (resultArr.count!=0) { - NSLog(@"111%lu",resultArr.count); - return YES; - }else{ - NSLog(@"222%lu",resultArr.count); - return NO; - } - - } diff --git a/iOSStudy/iOSStudy/WelcomeViewController.h b/iOSStudy/iOSStudy/WelcomeViewController.h new file mode 100644 index 0000000..27587df --- /dev/null +++ b/iOSStudy/iOSStudy/WelcomeViewController.h @@ -0,0 +1,13 @@ +// +// WelcomeViewController.h +// iOSStudy +// +// Created by chenguandong on 15/4/3. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +@interface WelcomeViewController : UIViewController + +@end diff --git a/iOSStudy/iOSStudy/WelcomeViewController.m b/iOSStudy/iOSStudy/WelcomeViewController.m new file mode 100644 index 0000000..ff1f920 --- /dev/null +++ b/iOSStudy/iOSStudy/WelcomeViewController.m @@ -0,0 +1,70 @@ +// +// WelcomeViewController.m +// iOSStudy +// +// Created by chenguandong on 15/4/3. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "WelcomeViewController.h" +#import +#import "NetWorkTools.h" +#import "HttpVersionTools.h" +#import "MainTabBarViewController.h" +#import +#import "VersionBean.h" +@interface WelcomeViewController () + +@end + +@implementation WelcomeViewController + + +-(void)viewWillAppear:(BOOL)animated{ + [super viewWillAppear:YES]; + NSLog(@"------checkNetworking"); + + [SVProgressHUD show]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + + //获取服务器HTTP当前版本号 + SharedApp.isNetworking = YES; + [HttpVersionTools getVersions:^(NSArray *versionLists) { + SharedApp.versionLists = versionLists; + + for (VersionBean *vBean in SharedApp.versionLists) { + NSLog(@"version =%@",vBean.urlVersion); + } + + [self goNextPage]; + } v_error:^{ + [self goNextPage]; + } v_netWork:^(BOOL isNetWorking) { + [self goNextPage]; + }]; +} + +-(void)goNextPage{ + [self performSegueWithIdentifier:@"mainTab" sender:self]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/iOSStudyJsonData/.versions.json.swp b/iOSStudyJsonData/.versions.json.swp new file mode 100644 index 0000000000000000000000000000000000000000..6dafba3803ad0ac881a43de826e7b1859aa929e3 GIT binary patch literal 12288 zcmeI&K}*9h6bJCsyCQn^Fth7uHg^zqQW%PYco^G7Jfv-C>$;>g>4u2<8N5zEp!g|l zwzj9qyv)P=2TGckkjMMoN}tyrUEMTJ-7YD{J|P!hN5jwYne)~p Date: Fri, 3 Apr 2015 15:26:17 +0800 Subject: [PATCH 03/45] =?UTF-8?q?blog=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit blog增加一个博客 --- iOSStudy/Tools/HttpVersionTools.m | 4 +- .../ViewModel/FirstViewControllerViewModel.m | 15 ++-- iOSStudy/iOSStudy/WelcomeViewController.m | 2 +- iOSStudyJsonData/blogs.json | 78 +------------------ 4 files changed, 11 insertions(+), 88 deletions(-) diff --git a/iOSStudy/Tools/HttpVersionTools.m b/iOSStudy/Tools/HttpVersionTools.m index e79dde9..74dd928 100644 --- a/iOSStudy/Tools/HttpVersionTools.m +++ b/iOSStudy/Tools/HttpVersionTools.m @@ -63,13 +63,11 @@ +(NSString*)getNowHttpVersion:(NSString*)url{ NSString *versionStr ; for (VersionBean *vBean in SharedApp.versionLists) { - NSLog(@"url=%@",url); - NSLog(@"%@",vBean.url); if ([vBean.url isEqualToString:url]) { versionStr = vBean.urlVersion; - + return versionStr; }else{ versionStr = nil; } diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m index c9276b6..7b2807a 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m @@ -43,7 +43,7 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelD _array = [[self getPersistenceData]copy]; - + modelDataSuccess(); __block NSString *versionStr; @@ -68,11 +68,7 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelD NSArray *arr = [MTLJSONAdapter modelsOfClass:[BlogBean class] fromJSONArray:dic[@"bloglists"] error:nil]; - - - // for (BlogBean *bean in arr) { - // NSLog(@"%@imae=",bean.image); - // } + _array = [arr copy]; @@ -102,6 +98,8 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelD }else{ //直接显示持久化数据 数据显示完毕 modelDataSuccess(); + + NSLog(@"cout====%ld",_array.count); } @@ -129,15 +127,18 @@ -(NSArray*)getPersistenceData{ blogBean.subTitle=[info valueForKey:@"subtitle"]; blogBean.image = [info valueForKey:@"image_name"]; blogBean.url = [info valueForKey:@"url"]; + NSLog(@"image=%@",blogBean.image); [blogArr addObject:blogBean]; + + } return blogArr; } -//持久化所有数据 +#pragma mark -- 持久化所有数据 -(void)persistenceData{ for (BlogBean *bean in _array) { diff --git a/iOSStudy/iOSStudy/WelcomeViewController.m b/iOSStudy/iOSStudy/WelcomeViewController.m index ff1f920..6cb127a 100644 --- a/iOSStudy/iOSStudy/WelcomeViewController.m +++ b/iOSStudy/iOSStudy/WelcomeViewController.m @@ -11,7 +11,7 @@ #import "NetWorkTools.h" #import "HttpVersionTools.h" #import "MainTabBarViewController.h" -#import +#import #import "VersionBean.h" @interface WelcomeViewController () diff --git a/iOSStudyJsonData/blogs.json b/iOSStudyJsonData/blogs.json index c90196e..d12c89c 100644 --- a/iOSStudyJsonData/blogs.json +++ b/iOSStudyJsonData/blogs.json @@ -1,77 +1 @@ -{ - "version": "1", - "bloglists": [ - { - "name": "破船之家", - "title": "破船之家的技术博客", - "subTitle": "去留无意,漫随天外云卷云舒", - "image": "https://avatars1.githubusercontent.com/u/3365146?v=3&s=460", - "url": "http://beyondvincent.com/", - "rssUrl": "http://beyondvincent.com/atom.xml", - "date": "2015-01-30 17:08:03" - }, - { - "name": "唐巧", - "title": "唐巧的技术博客", - "subTitle": "唐巧的技术博客记录下自己学习的点滴", - "image": "http://blog.devtang.com/images/weixin-qr.jpg", - "url": "http://blog.devtang.com", - "rssUrl": "http://blog.devtang.com/atom.xml", - "date": "2015-01-30 17:08:03" - }, - { - "name": "OneV's Den", - "title": "OneV's Den的技术博客", - "subTitle": "嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。", - "image": "http://onevcat.com/content/images/2014/May/200.jpg", - "url": "http://onevcat.com/", - "rssUrl": "http://onevcat.com/rss/", - "date": "2015-01-30 17:08:03" - }, - { - "name": "Limboy", - "title": "Limboy的技术博客", - "subTitle": "对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。", - "image": "https://avatars2.githubusercontent.com/u/35974?v=3&s=460", - "url": "http://limboy.me/", - "rssUrl": "http://feeds.feedburner.com/lzyy", - "date": "2015-01-30 17:08:03" - }, - { - "name": "刘坤", - "title": "刘坤的技术博客", - "subTitle": "嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意", - "image": "http://blog.cnbluebox.com/images/face_liukun.jpeg", - "url": "http://blog.cnbluebox.com/", - "rssUrl": "http://blog.cnbluebox.com/atom.xml", - "date": "2015-01-30 17:08:03" - }, - { - "name": "叶孤城___", - "title": "叶孤城___", - "subTitle": "ios开发者。Vim学习中", - "image": "http://tp1.sinaimg.cn/1438670852/180/5695641016/1", - "url": "http://www.jianshu.com/users/b82d2721ba07/latest_articles", - "rssUrl": "http://www.jianshu.com/users/b82d2721ba07/latest_articles", - "date": "2015-01-30 17:08:03" - }, - { - "name": "王轲", - "title": "王轲的技术博客", - "subTitle": "王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性", - "image": "http://www.iwangke.me/img/GithubForMacIcon.png", - "url": "http://www.iwangke.me/", - "rssUrl": "http://www.iwangke.me/atom.xml", - "date": "2015-01-30 17:08:03" - }, - { - "name": "txx's blog", - "title": "txx's blog", - "subTitle": "90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看", - "image": "http://www.iwangke.me/img/GithubForMacIcon.png", - "url": "http://blog.txx.im/", - "rssUrl": "http://blog.txx.im/atom.xml", - "date": "2015-01-30 17:08:03" - } - ] -} +{"version":"2","bloglists":[{"name":"破船之家","title":"破船之家的技术博客","subTitle":"去留无意,漫随天外云卷云舒","image":"https://avatars1.githubusercontent.com/u/3365146?v\u003d3\u0026s\u003d460","url":"http://beyondvincent.com/","rssUrl":"http://beyondvincent.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"唐巧","title":"唐巧的技术博客","subTitle":"唐巧的技术博客记录下自己学习的点滴","image":"http://blog.devtang.com/images/weixin-qr.jpg","url":"http://blog.devtang.com","rssUrl":"http://blog.devtang.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"OneV\u0027s Den","title":"OneV\u0027s Den的技术博客","subTitle":"嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。","image":"http://onevcat.com/content/images/2014/May/200.jpg","url":"http://onevcat.com/","rssUrl":"http://onevcat.com/rss/","date":"2015-01-30 17:08:03"},{"name":"Limboy","title":"Limboy的技术博客","subTitle":"对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。","image":"https://avatars2.githubusercontent.com/u/35974?v\u003d3\u0026s\u003d460","url":"http://limboy.me/","rssUrl":"http://feeds.feedburner.com/lzyy","date":"2015-01-30 17:08:03"},{"name":"刘坤","title":"刘坤的技术博客","subTitle":"嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意","image":"http://blog.cnbluebox.com/images/face_liukun.jpeg","url":"http://blog.cnbluebox.com/","rssUrl":"http://blog.cnbluebox.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"叶孤城___","title":"叶孤城___","subTitle":"ios开发者。Vim学习中","image":"http://tp1.sinaimg.cn/1438670852/180/5695641016/1","url":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","rssUrl":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","date":"2015-01-30 17:08:03"},{"name":"王轲","title":"王轲的技术博客","subTitle":"王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://www.iwangke.me/","rssUrl":"http://www.iwangke.me/atom.xml","date":"2015-01-30 17:08:03"},{"name":"txx\u0027s blog","title":"txx\u0027s blog","subTitle":"90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://blog.txx.im/","rssUrl":"http://blog.txx.im/atom.xml","date":"2015-01-30 17:08:03"},{"name":"Read The Fucking Source Code","title":"Read The Fucking Source Code","subTitle":"Read The Fucking Source Code","image":"http://blog.brooklyn886.com/content/images/2014/May/1.jpeg","url":"http://blog.brooklyn886.com/","rssUrl":"http://blog.brooklyn886.com/","date":"2015-01-30 17:08:03"}]} From 14899f7ce0ac8f5c1bd228121b25b1bbef036674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Fri, 3 Apr 2015 15:37:46 +0800 Subject: [PATCH 04/45] =?UTF-8?q?=E6=9B=B4=E6=94=B9blog=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iOSStudyJsonData/versions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iOSStudyJsonData/versions.json b/iOSStudyJsonData/versions.json index bb7eacb..ee7c045 100644 --- a/iOSStudyJsonData/versions.json +++ b/iOSStudyJsonData/versions.json @@ -1,2 +1,2 @@ -[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"1"}] +[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"2"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"1"}] From 426a636cdcaa86ff304e2b12dbe5e61175e39d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Fri, 3 Apr 2015 16:48:54 +0800 Subject: [PATCH 05/45] add blog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加版本到 version3 --- iOSStudy/Tools/HttpVersionTools.m | 20 ++-- iOSStudy/iOSStudy/FirstViewController.m | 17 ++- .../ViewModel/FirstViewControllerViewModel.h | 18 +++ .../ViewModel/FirstViewControllerViewModel.m | 105 +++++++++++++++--- iOSStudyJsonData/blogs.json | 2 +- iOSStudyJsonData/versions.json | 2 +- 6 files changed, 133 insertions(+), 31 deletions(-) diff --git a/iOSStudy/Tools/HttpVersionTools.m b/iOSStudy/Tools/HttpVersionTools.m index 74dd928..1005265 100644 --- a/iOSStudy/Tools/HttpVersionTools.m +++ b/iOSStudy/Tools/HttpVersionTools.m @@ -136,15 +136,21 @@ +(void)saveNowHttpVersion:(NSString*)url version:(NSString*)version{ +(BOOL)checkHttpVersion:(NSString*)url nowVersion:(NSString*)nowVersion{ - //从数据库拿到URL 版本号 如果没有说明第一次请求 直接发送请求 - if ([[self getLocalHttpVersion:url]floatValue]!=[nowVersion floatValue]) { - - + + if (nowVersion!=nil) { + //从数据库拿到URL 版本号 如果没有说明第一次请求 直接发送请求 - return YES; + if ([[self getLocalHttpVersion:url]floatValue]!=[nowVersion floatValue]) { + + + + return YES; + }else{ + return NO; + } }else{ - return NO; + return YES; } @@ -179,7 +185,7 @@ +(NSString*)getLocalHttpVersion:(NSString*)url{ return [objt valueForKey:@"url_version"]; }else{ - NSLog(@"222%lu",resultArr.count); + NSLog(@"没有查到本地版本%lu",resultArr.count); return nil; } diff --git a/iOSStudy/iOSStudy/FirstViewController.m b/iOSStudy/iOSStudy/FirstViewController.m index d3edb54..f851b4a 100644 --- a/iOSStudy/iOSStudy/FirstViewController.m +++ b/iOSStudy/iOSStudy/FirstViewController.m @@ -36,26 +36,25 @@ - (void)viewDidLoad { [self.tableView addHeaderWithCallback:^{ + + [_viewModel getDate:^{ - - [_tableView reloadData]; - + [_tableView reloadData]; + [self stopTableRefreshing]; + } modelDataReload:^{ + [_tableView reloadData]; } modelDataErrors:^{ - [self stopTableRefreshing]; - } modelDataIsNetworking:^(BOOL isNetWorking) { - [self stopTableRefreshing]; - }]; + }]; - [self.tableView headerBeginRefreshing]; - + } diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h index 5d0fe18..a1cb097 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h @@ -10,6 +10,13 @@ #import "NetWorkTools.h" #import "JsonTools.h" #import "BlogBean.h" + + +/** + * 网络请求开始 + */ +typedef void (^modelPersistentReload)(); + /** * 网络请求成功回调 */ @@ -71,4 +78,15 @@ typedef void (^modelNetWorking)(BOOL isNetWorking); * @return YES 存在 NO 不存在 */ -(BOOL)isExistURL:(NSString*)url; + + +/** + * 请求网络数据 + * + * @param modelDataSuccess 请求成功 + * @param modelPersistentReload 刷新Table + * @param modelDataErrors 请求失败 + * @param modelDataIsNetWoring 网络状态 + */ +-(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentReload)modelDataReload modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring; @end diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m index 7b2807a..de75031 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m @@ -38,6 +38,85 @@ -(BlogBean*)getBlogBean:(NSIndexPath *)indexPath{ +/** + * 请求网络数据 + * + * @param modelDataSuccess 请求成功 + * @param modelDataStart 请求开始 + * @param modelDataErrors 请求失败 + * @param modelDataIsNetWoring 网络状态 + */ +-(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentReload)modelDataReload modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring{ + + + _array = [[self getPersistenceData]copy]; + + //modelDataSuccess(); + modelDataReload(); + + __block NSString *versionStr; + + if ([HttpVersionTools checkHttpVersion:Address_blogs nowVersion:[HttpVersionTools getNowHttpVersion:Address_blogs]]) { + + // + + [NetWorkTools postHttp:Address_blogs success:^(AFHTTPRequestOperation *operation, id responseObject) { + + NSLog(@"JSON: %@", [operation responseString]); + + NSDictionary *dic = [JsonTools getJsonNSDictionary:[operation responseString]]; + + //NSLog(@"jsonVersion=%@",dic[@"version"]); + + + versionStr =dic[@"version"]; + + //将JSON数据和Model的属性进行绑定 + + // NSLog(@"%@arr=",dic[@"bloglists"]); + + NSArray *arr = [MTLJSONAdapter modelsOfClass:[BlogBean class] fromJSONArray:dic[@"bloglists"] error:nil]; + + + + _array = [arr copy]; + + + modelDataSuccess(); + + //持久化数据 + [self persistenceData]; + + //当前最新版本号存入数据库 + + [HttpVersionTools saveNowHttpVersion:Address_blogs version:versionStr]; + + + } error:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); + + modelDataErrors(); + + } isNetworking:^(BOOL isNetwork) { + + + modelDataIsNetWoring(isNetwork); + + + }]; + }else{ + //直接显示持久化数据 数据显示完毕 + modelDataSuccess(); + + NSLog(@"cout====%ld",_array.count); + } + + + + + +} + -(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring{ @@ -119,20 +198,20 @@ -(NSArray*)getPersistenceData{ NSMutableArray *blogArr = [NSMutableArray arrayWithCapacity:10]; - - for (NSManagedObject *info in fetchedObjects) { - BlogBean *blogBean = [[BlogBean alloc]init]; - blogBean.title = [info valueForKey:@"title"]; - blogBean.subTitle=[info valueForKey:@"subtitle"]; - blogBean.image = [info valueForKey:@"image_name"]; - blogBean.url = [info valueForKey:@"url"]; - NSLog(@"image=%@",blogBean.image); - [blogArr addObject:blogBean]; - - - - } + for (NSManagedObject *info in fetchedObjects) { + + BlogBean *blogBean = [[BlogBean alloc]init]; + blogBean.title = [info valueForKey:@"title"]; + blogBean.subTitle=[info valueForKey:@"subtitle"]; + blogBean.image = [info valueForKey:@"image_name"]; + blogBean.url = [info valueForKey:@"url"]; + NSLog(@"image=%@",blogBean.image); + [blogArr addObject:blogBean]; + + } + + return blogArr; diff --git a/iOSStudyJsonData/blogs.json b/iOSStudyJsonData/blogs.json index d12c89c..abb5f79 100644 --- a/iOSStudyJsonData/blogs.json +++ b/iOSStudyJsonData/blogs.json @@ -1 +1 @@ -{"version":"2","bloglists":[{"name":"破船之家","title":"破船之家的技术博客","subTitle":"去留无意,漫随天外云卷云舒","image":"https://avatars1.githubusercontent.com/u/3365146?v\u003d3\u0026s\u003d460","url":"http://beyondvincent.com/","rssUrl":"http://beyondvincent.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"唐巧","title":"唐巧的技术博客","subTitle":"唐巧的技术博客记录下自己学习的点滴","image":"http://blog.devtang.com/images/weixin-qr.jpg","url":"http://blog.devtang.com","rssUrl":"http://blog.devtang.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"OneV\u0027s Den","title":"OneV\u0027s Den的技术博客","subTitle":"嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。","image":"http://onevcat.com/content/images/2014/May/200.jpg","url":"http://onevcat.com/","rssUrl":"http://onevcat.com/rss/","date":"2015-01-30 17:08:03"},{"name":"Limboy","title":"Limboy的技术博客","subTitle":"对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。","image":"https://avatars2.githubusercontent.com/u/35974?v\u003d3\u0026s\u003d460","url":"http://limboy.me/","rssUrl":"http://feeds.feedburner.com/lzyy","date":"2015-01-30 17:08:03"},{"name":"刘坤","title":"刘坤的技术博客","subTitle":"嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意","image":"http://blog.cnbluebox.com/images/face_liukun.jpeg","url":"http://blog.cnbluebox.com/","rssUrl":"http://blog.cnbluebox.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"叶孤城___","title":"叶孤城___","subTitle":"ios开发者。Vim学习中","image":"http://tp1.sinaimg.cn/1438670852/180/5695641016/1","url":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","rssUrl":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","date":"2015-01-30 17:08:03"},{"name":"王轲","title":"王轲的技术博客","subTitle":"王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://www.iwangke.me/","rssUrl":"http://www.iwangke.me/atom.xml","date":"2015-01-30 17:08:03"},{"name":"txx\u0027s blog","title":"txx\u0027s blog","subTitle":"90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://blog.txx.im/","rssUrl":"http://blog.txx.im/atom.xml","date":"2015-01-30 17:08:03"},{"name":"Read The Fucking Source Code","title":"Read The Fucking Source Code","subTitle":"Read The Fucking Source Code","image":"http://blog.brooklyn886.com/content/images/2014/May/1.jpeg","url":"http://blog.brooklyn886.com/","rssUrl":"http://blog.brooklyn886.com/","date":"2015-01-30 17:08:03"}]} +{"version":"3","bloglists":[{"name":"破船之家","title":"破船之家的技术博客","subTitle":"去留无意,漫随天外云卷云舒","image":"https://avatars1.githubusercontent.com/u/3365146?v\u003d3\u0026s\u003d460","url":"http://beyondvincent.com/","rssUrl":"http://beyondvincent.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"唐巧","title":"唐巧的技术博客","subTitle":"唐巧的技术博客记录下自己学习的点滴","image":"http://blog.devtang.com/images/weixin-qr.jpg","url":"http://blog.devtang.com","rssUrl":"http://blog.devtang.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"OneV\u0027s Den","title":"OneV\u0027s Den的技术博客","subTitle":"嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。","image":"http://onevcat.com/content/images/2014/May/200.jpg","url":"http://onevcat.com/","rssUrl":"http://onevcat.com/rss/","date":"2015-01-30 17:08:03"},{"name":"Limboy","title":"Limboy的技术博客","subTitle":"对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。","image":"https://avatars2.githubusercontent.com/u/35974?v\u003d3\u0026s\u003d460","url":"http://limboy.me/","rssUrl":"http://feeds.feedburner.com/lzyy","date":"2015-01-30 17:08:03"},{"name":"刘坤","title":"刘坤的技术博客","subTitle":"嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意","image":"http://blog.cnbluebox.com/images/face_liukun.jpeg","url":"http://blog.cnbluebox.com/","rssUrl":"http://blog.cnbluebox.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"叶孤城___","title":"叶孤城___","subTitle":"ios开发者。Vim学习中","image":"http://tp1.sinaimg.cn/1438670852/180/5695641016/1","url":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","rssUrl":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","date":"2015-01-30 17:08:03"},{"name":"王轲","title":"王轲的技术博客","subTitle":"王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://www.iwangke.me/","rssUrl":"http://www.iwangke.me/atom.xml","date":"2015-01-30 17:08:03"},{"name":"txx\u0027s blog","title":"txx\u0027s blog","subTitle":"90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://blog.txx.im/","rssUrl":"http://blog.txx.im/atom.xml","date":"2015-01-30 17:08:03"},{"name":"Read The Fucking Source Code","title":"Read The Fucking Source Code","subTitle":"Read The Fucking Source Code","image":"http://blog.brooklyn886.com/content/images/2014/May/1.jpeg","url":"http://blog.brooklyn886.com/","rssUrl":"http://blog.brooklyn886.com/","date":"2015-01-30 17:08:03"},{"name":"http://itjoy.org/","title":"http://itjoy.org/","subTitle":"http://itjoy.org/","image":"http://tp2.sinaimg.cn/2663764813/180/40006387168/1","url":"http://itjoy.org/","rssUrl":"http://itjoy.org/","date":"2015-01-30 17:08:03"}]} diff --git a/iOSStudyJsonData/versions.json b/iOSStudyJsonData/versions.json index ee7c045..26a9d53 100644 --- a/iOSStudyJsonData/versions.json +++ b/iOSStudyJsonData/versions.json @@ -1,2 +1,2 @@ -[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"2"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"1"}] +[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"3"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"1"}] From 07b4b968e26a026fec6b1d3558e9c66e78a8ac00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Fri, 3 Apr 2015 18:11:28 +0800 Subject: [PATCH 06/45] - blog - blog --- iOSStudy/Tools/CoreDataUtils.m | 6 +++++- .../iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents | 3 +-- iOSStudyJsonData/blogs.json | 2 +- iOSStudyJsonData/versions.json | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/iOSStudy/Tools/CoreDataUtils.m b/iOSStudy/Tools/CoreDataUtils.m index 6847c74..0b0f58f 100644 --- a/iOSStudy/Tools/CoreDataUtils.m +++ b/iOSStudy/Tools/CoreDataUtils.m @@ -32,10 +32,14 @@ +(BOOL)dataisExist:(NSString*)url inTable:(NSString*)tableName tableRowName:(NSS - NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"%@ = %@",rowName, url]; + //NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"%@ = %@",rowName, url]; + + NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url= %@", url]; NSArray *resultArr = [fetchedObjects filteredArrayUsingPredicate:titlePredicate]; + + if (resultArr.count!=0) { // NSLog(@"111%lu",resultArr.count); return YES; diff --git a/iOSStudy/iOSStudy/iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents b/iOSStudy/iOSStudy/iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents index 423b29f..c2fcb8e 100644 --- a/iOSStudy/iOSStudy/iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents +++ b/iOSStudy/iOSStudy/iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents @@ -8,12 +8,11 @@ - - + \ No newline at end of file diff --git a/iOSStudyJsonData/blogs.json b/iOSStudyJsonData/blogs.json index abb5f79..e97cded 100644 --- a/iOSStudyJsonData/blogs.json +++ b/iOSStudyJsonData/blogs.json @@ -1 +1 @@ -{"version":"3","bloglists":[{"name":"破船之家","title":"破船之家的技术博客","subTitle":"去留无意,漫随天外云卷云舒","image":"https://avatars1.githubusercontent.com/u/3365146?v\u003d3\u0026s\u003d460","url":"http://beyondvincent.com/","rssUrl":"http://beyondvincent.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"唐巧","title":"唐巧的技术博客","subTitle":"唐巧的技术博客记录下自己学习的点滴","image":"http://blog.devtang.com/images/weixin-qr.jpg","url":"http://blog.devtang.com","rssUrl":"http://blog.devtang.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"OneV\u0027s Den","title":"OneV\u0027s Den的技术博客","subTitle":"嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。","image":"http://onevcat.com/content/images/2014/May/200.jpg","url":"http://onevcat.com/","rssUrl":"http://onevcat.com/rss/","date":"2015-01-30 17:08:03"},{"name":"Limboy","title":"Limboy的技术博客","subTitle":"对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。","image":"https://avatars2.githubusercontent.com/u/35974?v\u003d3\u0026s\u003d460","url":"http://limboy.me/","rssUrl":"http://feeds.feedburner.com/lzyy","date":"2015-01-30 17:08:03"},{"name":"刘坤","title":"刘坤的技术博客","subTitle":"嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意","image":"http://blog.cnbluebox.com/images/face_liukun.jpeg","url":"http://blog.cnbluebox.com/","rssUrl":"http://blog.cnbluebox.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"叶孤城___","title":"叶孤城___","subTitle":"ios开发者。Vim学习中","image":"http://tp1.sinaimg.cn/1438670852/180/5695641016/1","url":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","rssUrl":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","date":"2015-01-30 17:08:03"},{"name":"王轲","title":"王轲的技术博客","subTitle":"王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://www.iwangke.me/","rssUrl":"http://www.iwangke.me/atom.xml","date":"2015-01-30 17:08:03"},{"name":"txx\u0027s blog","title":"txx\u0027s blog","subTitle":"90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://blog.txx.im/","rssUrl":"http://blog.txx.im/atom.xml","date":"2015-01-30 17:08:03"},{"name":"Read The Fucking Source Code","title":"Read The Fucking Source Code","subTitle":"Read The Fucking Source Code","image":"http://blog.brooklyn886.com/content/images/2014/May/1.jpeg","url":"http://blog.brooklyn886.com/","rssUrl":"http://blog.brooklyn886.com/","date":"2015-01-30 17:08:03"},{"name":"http://itjoy.org/","title":"http://itjoy.org/","subTitle":"http://itjoy.org/","image":"http://tp2.sinaimg.cn/2663764813/180/40006387168/1","url":"http://itjoy.org/","rssUrl":"http://itjoy.org/","date":"2015-01-30 17:08:03"}]} +{"version":"4","bloglists":[{"name":"破船之家","title":"破船之家的技术博客","subTitle":"去留无意,漫随天外云卷云舒","image":"https://avatars1.githubusercontent.com/u/3365146?v\u003d3\u0026s\u003d460","url":"http://beyondvincent.com/","rssUrl":"http://beyondvincent.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"唐巧","title":"唐巧的技术博客","subTitle":"唐巧的技术博客记录下自己学习的点滴","image":"http://blog.devtang.com/images/weixin-qr.jpg","url":"http://blog.devtang.com","rssUrl":"http://blog.devtang.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"OneV\u0027s Den","title":"OneV\u0027s Den的技术博客","subTitle":"嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。","image":"http://onevcat.com/content/images/2014/May/200.jpg","url":"http://onevcat.com/","rssUrl":"http://onevcat.com/rss/","date":"2015-01-30 17:08:03"},{"name":"Limboy","title":"Limboy的技术博客","subTitle":"对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。","image":"https://avatars2.githubusercontent.com/u/35974?v\u003d3\u0026s\u003d460","url":"http://limboy.me/","rssUrl":"http://feeds.feedburner.com/lzyy","date":"2015-01-30 17:08:03"},{"name":"刘坤","title":"刘坤的技术博客","subTitle":"嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意","image":"http://blog.cnbluebox.com/images/face_liukun.jpeg","url":"http://blog.cnbluebox.com/","rssUrl":"http://blog.cnbluebox.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"叶孤城___","title":"叶孤城___","subTitle":"ios开发者。Vim学习中","image":"http://tp1.sinaimg.cn/1438670852/180/5695641016/1","url":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","rssUrl":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","date":"2015-01-30 17:08:03"},{"name":"王轲","title":"王轲的技术博客","subTitle":"王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://www.iwangke.me/","rssUrl":"http://www.iwangke.me/atom.xml","date":"2015-01-30 17:08:03"},{"name":"txx\u0027s blog","title":"txx\u0027s blog","subTitle":"90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://blog.txx.im/","rssUrl":"http://blog.txx.im/atom.xml","date":"2015-01-30 17:08:03"},{"name":"Read The Fucking Source Code","title":"Read The Fucking Source Code","subTitle":"Read The Fucking Source Code","image":"http://blog.brooklyn886.com/content/images/2014/May/1.jpeg","url":"http://blog.brooklyn886.com/","rssUrl":"http://blog.brooklyn886.com/","date":"2015-01-30 17:08:03"}]} diff --git a/iOSStudyJsonData/versions.json b/iOSStudyJsonData/versions.json index 26a9d53..7a0eefb 100644 --- a/iOSStudyJsonData/versions.json +++ b/iOSStudyJsonData/versions.json @@ -1,2 +1,2 @@ -[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"3"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"1"}] +[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"4"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"1"}] From 8ea4d05ab48f7b3aaf6c5939ddcb72b14dbabf31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Sat, 4 Apr 2015 16:40:39 +0800 Subject: [PATCH 07/45] updata blog count MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update blog version, fix version can’t update --- iOSStudy/Tools/CoreDataUtils.h | 10 +++++++++ iOSStudy/Tools/CoreDataUtils.m | 33 ++++++++++++++++++++++++++++ iOSStudy/Tools/HttpVersionTools.m | 33 ++++++++++++++++------------ iOSStudyJsonData/.versions.json.swp | Bin 12288 -> 0 bytes iOSStudyJsonData/blogs.json | 2 +- iOSStudyJsonData/versions.json | 2 +- 6 files changed, 64 insertions(+), 16 deletions(-) delete mode 100644 iOSStudyJsonData/.versions.json.swp diff --git a/iOSStudy/Tools/CoreDataUtils.h b/iOSStudy/Tools/CoreDataUtils.h index 5b7af68..7f1a9e9 100644 --- a/iOSStudy/Tools/CoreDataUtils.h +++ b/iOSStudy/Tools/CoreDataUtils.h @@ -19,4 +19,14 @@ * @return YES 存在 NO 不存在 */ +(BOOL)dataisExist:(NSString*)url inTable:(NSString*)tableName tableRowName:(NSString*)rowName; + + +/** + * 查询数据 + * @param tableName 查询的表明称 + * @param predicate NSPredicate 查询条件 nil时表示没有查询条件 + * + * @return NSManagedObject 集合 + */ ++(NSArray*)queryDataFromTableName:(NSString*)tableName andNSPredicate:(NSPredicate*)predicate; @end diff --git a/iOSStudy/Tools/CoreDataUtils.m b/iOSStudy/Tools/CoreDataUtils.m index 0b0f58f..f111c7c 100644 --- a/iOSStudy/Tools/CoreDataUtils.m +++ b/iOSStudy/Tools/CoreDataUtils.m @@ -39,6 +39,7 @@ +(BOOL)dataisExist:(NSString*)url inTable:(NSString*)tableName tableRowName:(NSS NSArray *resultArr = [fetchedObjects filteredArrayUsingPredicate:titlePredicate]; + if (resultArr.count!=0) { // NSLog(@"111%lu",resultArr.count); @@ -49,5 +50,37 @@ +(BOOL)dataisExist:(NSString*)url inTable:(NSString*)tableName tableRowName:(NSS } +} + +/** + * 查询数据 + * @param tableName 查询的表明称 + * @param predicate NSPredicate 查询条件 nil时表示没有查询条件 + * + * @return NSManagedObject 集合 + */ ++(NSArray*)queryDataFromTableName:(NSString*)tableName andNSPredicate:(NSPredicate*)predicate{ + + NSError *error; + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription *entity = [NSEntityDescription + entityForName:tableName inManagedObjectContext:SharedApp.managedObjectContext]; + [fetchRequest setEntity:entity]; + + NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + + + //若果有过滤条件返回过滤后的NSManagedObject 对象 没有的话直接返回全部 + if (predicate) { + + // NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url= %@", url]; + + return [fetchedObjects filteredArrayUsingPredicate:predicate]; + }else{ + + return fetchedObjects; + } + + } @end diff --git a/iOSStudy/Tools/HttpVersionTools.m b/iOSStudy/Tools/HttpVersionTools.m index 1005265..8b22a45 100644 --- a/iOSStudy/Tools/HttpVersionTools.m +++ b/iOSStudy/Tools/HttpVersionTools.m @@ -85,23 +85,25 @@ +(NSString*)getNowHttpVersion:(NSString*)url{ */ +(void)saveNowHttpVersion:(NSString*)url version:(NSString*)version{ + NSString *log ; //当数据存在事后执行更新操作 if ([CoreDataUtils dataisExist:url inTable:CD_VersionsEntity tableRowName:@"url"]) { - NSManagedObject *updateObjt = [[NSManagedObject alloc]init]; - [updateObjt setValue:url forKey:@"url"]; - [updateObjt setValue:version forKey:@"url_version"]; + NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"url= %@", url]; - NSError *error; - if (![SharedApp.managedObjectContext save:&error]) - { - NSLog(@"版本号更新失败: %@", [error localizedDescription]); - + NSArray *managerList = [CoreDataUtils queryDataFromTableName:CD_VersionsEntity andNSPredicate:urlPredicate]; + + if (managerList.count!=0) { + NSManagedObject *updateObjt= managerList.firstObject; + [updateObjt setValue:url forKey:@"url"]; + [updateObjt setValue:version forKey:@"url_version"]; } + + log = @"版本更新成功"; } else @@ -113,12 +115,15 @@ +(void)saveNowHttpVersion:(NSString*)url version:(NSString*)version{ [managerObjt setValue:url forKey:@"url"]; [managerObjt setValue:version forKey:@"url_version"];; - NSError *error; - if (![SharedApp.managedObjectContext save:&error]) - { - NSLog(@"版本号存储失败: %@", [error localizedDescription]); - - } + log = @"版本插入成功"; + + } + + NSError *error; + if (![SharedApp.managedObjectContext save:&error]) + { + NSLog(@"%@: %@", log,[error localizedDescription]); + } diff --git a/iOSStudyJsonData/.versions.json.swp b/iOSStudyJsonData/.versions.json.swp deleted file mode 100644 index 6dafba3803ad0ac881a43de826e7b1859aa929e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&K}*9h6bJCsyCQn^Fth7uHg^zqQW%PYco^G7Jfv-C>$;>g>4u2<8N5zEp!g|l zwzj9qyv)P=2TGckkjMMoN}tyrUEMTJ-7YD{J|P!hN5jwYne)~p Date: Sat, 4 Apr 2015 18:44:22 +0800 Subject: [PATCH 08/45] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8C=81=E4=B9=85?= =?UTF-8?q?=E5=8C=96=E5=8D=9A=E5=AE=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 持久化之前先删除数据 --- iOSStudy/Bean/FavouriteBean.h | 2 +- iOSStudy/Tools/CoreDataUtils.h | 10 +++++++ iOSStudy/Tools/CoreDataUtils.m | 28 +++++++++++++++++++ .../ViewModel/FirstViewControllerViewModel.m | 23 +++++++++------ iOSStudyJsonData/blogs.json | 2 +- iOSStudyJsonData/versions.json | 2 +- 6 files changed, 56 insertions(+), 11 deletions(-) diff --git a/iOSStudy/Bean/FavouriteBean.h b/iOSStudy/Bean/FavouriteBean.h index 1bc484a..5ebd56e 100644 --- a/iOSStudy/Bean/FavouriteBean.h +++ b/iOSStudy/Bean/FavouriteBean.h @@ -32,7 +32,7 @@ typedef NS_ENUM(NSInteger, FAVOURITE_TYPE) { */ @property(nonatomic,copy)NSString *url; /** - * 类型 1 博客 2 网站 3 视频 + * 类型 1 收藏博客 2 收藏网站 3 收藏视频 11,持久化博客 22,持久化网站 33,持久化视频 */ @property(nonatomic,copy)NSString* type; @end diff --git a/iOSStudy/Tools/CoreDataUtils.h b/iOSStudy/Tools/CoreDataUtils.h index 7f1a9e9..bcdd9e2 100644 --- a/iOSStudy/Tools/CoreDataUtils.h +++ b/iOSStudy/Tools/CoreDataUtils.h @@ -29,4 +29,14 @@ * @return NSManagedObject 集合 */ +(NSArray*)queryDataFromTableName:(NSString*)tableName andNSPredicate:(NSPredicate*)predicate; + + +/** + * 删除指定表中的数据 + + * + * @param tableName 表名 + * @param andNSPredicate 删除条件 为nil 删除所有数据 + */ ++(void)deleteDateFromTableName:(NSString*)tableName andNSPredicate:(NSPredicate*)andNSPredicate; @end diff --git a/iOSStudy/Tools/CoreDataUtils.m b/iOSStudy/Tools/CoreDataUtils.m index f111c7c..900cb7c 100644 --- a/iOSStudy/Tools/CoreDataUtils.m +++ b/iOSStudy/Tools/CoreDataUtils.m @@ -82,5 +82,33 @@ +(NSArray*)queryDataFromTableName:(NSString*)tableName andNSPredicate:(NSPredica } +} + + +/** + * 删除指定表中的数据 + + * + * @param tableName 表名 + * @param andNSPredicate 删除条件 为nil 删除所有数据 + */ ++(void)deleteDateFromTableName:(NSString*)tableName andNSPredicate:(NSPredicate*)andNSPredicate{ + //存储之前先删除原来的数据 + + //NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"type= %@", @"11"]; + + NSArray* managerObjtList = [CoreDataUtils queryDataFromTableName:tableName andNSPredicate:andNSPredicate]; + + for (NSManagedObject *obct in managerObjtList) { + [SharedApp.managedObjectContext deleteObject:obct]; + } + + + NSError *error = nil; + if (![SharedApp.managedObjectContext save:&error]) { + NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]); + return; + } + } @end diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m index de75031..30b6354 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m @@ -220,6 +220,11 @@ -(NSArray*)getPersistenceData{ #pragma mark -- 持久化所有数据 -(void)persistenceData{ + //删除已经存在的数据 + NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"type= %@", @"11"]; + [CoreDataUtils deleteDateFromTableName:CD_FAVOURITE_BEAN andNSPredicate:titlePredicate]; + + for (BlogBean *bean in _array) { if ([self isExistURL:bean.url]) { @@ -232,21 +237,23 @@ -(void)persistenceData{ favouriteBean.subtitle = bean.subTitle; favouriteBean.image_name = bean.image; favouriteBean.url= bean.url; - favouriteBean.type =@"0"; + favouriteBean.type =@"11"; - NSError *error; - BOOL isSaveSuccess =[SharedApp.managedObjectContext save:&error]; - if (!isSaveSuccess) { - NSLog(@"Error: %@,%@",error,[error userInfo]); - }else { - NSLog(@"Save successful favourite!"); - } + } } + + NSError *error; + BOOL isSaveSuccess =[SharedApp.managedObjectContext save:&error]; + if (!isSaveSuccess) { + NSLog(@"Error: %@,%@",error,[error userInfo]); + }else { + NSLog(@"Save successful favourite!"); + } } diff --git a/iOSStudyJsonData/blogs.json b/iOSStudyJsonData/blogs.json index 91985f1..5ca709d 100644 --- a/iOSStudyJsonData/blogs.json +++ b/iOSStudyJsonData/blogs.json @@ -1 +1 @@ -{"version":"5","bloglists":[{"name":"破船之家","title":"破船之家的技术博客","subTitle":"去留无意,漫随天外云卷云舒","image":"https://avatars1.githubusercontent.com/u/3365146?v\u003d3\u0026s\u003d460","url":"http://beyondvincent.com/","rssUrl":"http://beyondvincent.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"唐巧","title":"唐巧的技术博客","subTitle":"唐巧的技术博客记录下自己学习的点滴","image":"http://blog.devtang.com/images/weixin-qr.jpg","url":"http://blog.devtang.com","rssUrl":"http://blog.devtang.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"OneV\u0027s Den","title":"OneV\u0027s Den的技术博客","subTitle":"嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。","image":"http://onevcat.com/content/images/2014/May/200.jpg","url":"http://onevcat.com/","rssUrl":"http://onevcat.com/rss/","date":"2015-01-30 17:08:03"},{"name":"Limboy","title":"Limboy的技术博客","subTitle":"对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。","image":"https://avatars2.githubusercontent.com/u/35974?v\u003d3\u0026s\u003d460","url":"http://limboy.me/","rssUrl":"http://feeds.feedburner.com/lzyy","date":"2015-01-30 17:08:03"},{"name":"刘坤","title":"刘坤的技术博客","subTitle":"嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意","image":"http://blog.cnbluebox.com/images/face_liukun.jpeg","url":"http://blog.cnbluebox.com/","rssUrl":"http://blog.cnbluebox.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"叶孤城___","title":"叶孤城___","subTitle":"ios开发者。Vim学习中","image":"http://tp1.sinaimg.cn/1438670852/180/5695641016/1","url":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","rssUrl":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","date":"2015-01-30 17:08:03"},{"name":"王轲","title":"王轲的技术博客","subTitle":"王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://www.iwangke.me/","rssUrl":"http://www.iwangke.me/atom.xml","date":"2015-01-30 17:08:03"},{"name":"txx\u0027s blog","title":"txx\u0027s blog","subTitle":"90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://blog.txx.im/","rssUrl":"http://blog.txx.im/atom.xml","date":"2015-01-30 17:08:03"}]} +{"version":"6","bloglists":[{"name":"破船之家","title":"破船之家的技术博客","subTitle":"去留无意,漫随天外云卷云舒","image":"https://avatars1.githubusercontent.com/u/3365146?v\u003d3\u0026s\u003d460","url":"http://beyondvincent.com/","rssUrl":"http://beyondvincent.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"唐巧","title":"唐巧的技术博客","subTitle":"唐巧的技术博客记录下自己学习的点滴","image":"http://blog.devtang.com/images/weixin-qr.jpg","url":"http://blog.devtang.com","rssUrl":"http://blog.devtang.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"OneV\u0027s Den","title":"OneV\u0027s Den的技术博客","subTitle":"嗨,我是王巍 (@onevcat),一名来自中国的 iOS / Unity 开发者。现居日本,就职于 LINE。正在修行,探求创意之源。","image":"http://onevcat.com/content/images/2014/May/200.jpg","url":"http://onevcat.com/","rssUrl":"http://onevcat.com/rss/","date":"2015-01-30 17:08:03"},{"name":"Limboy","title":"Limboy的技术博客","subTitle":"对Web开发的各方面都比较熟悉,后将重心转移到iOS领域。2012年离开知乎后,与几个知乎员工一起做起了「Legend33 Studio」,在其中主要负责iOS开发,同时也参与产品/创意。首款作品「Once Touch」反响还不错,也被ifanr报道过,从此与iOS结缘。","image":"https://avatars2.githubusercontent.com/u/35974?v\u003d3\u0026s\u003d460","url":"http://limboy.me/","rssUrl":"http://feeds.feedburner.com/lzyy","date":"2015-01-30 17:08:03"},{"name":"刘坤","title":"刘坤的技术博客","subTitle":"嗨,我是刘坤,一名来自中国的 IOS 开发者,现就职于杭州阿里,花名‘念纪’,沉淀技术,寻求创意","image":"http://blog.cnbluebox.com/images/face_liukun.jpeg","url":"http://blog.cnbluebox.com/","rssUrl":"http://blog.cnbluebox.com/atom.xml","date":"2015-01-30 17:08:03"},{"name":"叶孤城___","title":"叶孤城___","subTitle":"ios开发者。Vim学习中","image":"http://tp1.sinaimg.cn/1438670852/180/5695641016/1","url":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","rssUrl":"http://www.jianshu.com/users/b82d2721ba07/latest_articles","date":"2015-01-30 17:08:03"},{"name":"王轲","title":"王轲的技术博客","subTitle":"王轲, IndieBros Studio 创始人, 优秀的 iOS 开发工程师, 写的文章深入浅出, 很多问题分析透彻, 非常有条理性","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://www.iwangke.me/","rssUrl":"http://www.iwangke.me/atom.xml","date":"2015-01-30 17:08:03"},{"name":"txx\u0027s blog","title":"txx\u0027s blog","subTitle":"90 后 iOS 开发者, 人称虾神, 文章内容讲解大多浅白易懂, 很值得看","image":"http://www.iwangke.me/img/GithubForMacIcon.png","url":"http://blog.txx.im/","rssUrl":"http://blog.txx.im/atom.xml","date":"2015-01-30 17:08:03"},{"name":"Read The Fucking Source Code","title":"Read The Fucking Source Code","subTitle":"Read The Fucking Source Code","image":"http://blog.brooklyn886.com/content/images/2014/May/1.jpeg","url":"http://blog.brooklyn886.com/","rssUrl":"http://blog.brooklyn886.com/","date":"2015-01-30 17:08:03"},{"name":"http://itjoy.org/","title":"http://itjoy.org/","subTitle":"http://itjoy.org/","image":"http://tp2.sinaimg.cn/2663764813/180/40006387168/1","url":"http://itjoy.org/","rssUrl":"http://itjoy.org/","date":"2015-01-30 17:08:03"}]} diff --git a/iOSStudyJsonData/versions.json b/iOSStudyJsonData/versions.json index f7224c3..2b55054 100644 --- a/iOSStudyJsonData/versions.json +++ b/iOSStudyJsonData/versions.json @@ -1,2 +1,2 @@ -[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"5"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"1"}] +[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"6"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"1"}] From 9581d81a883bc4a7e2abfae035d41a85de23b54f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Sun, 5 Apr 2015 21:13:31 +0800 Subject: [PATCH 09/45] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=B6=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 侧滑添加喜欢 --- iOSStudy/Tools/CoreDataUtils.h | 7 +- iOSStudy/Tools/CoreDataUtils.m | 34 ++--- iOSStudy/Tools/HttpVersionTools.m | 6 +- iOSStudy/iOSStudy/Constants .h | 15 ++ iOSStudy/iOSStudy/FirstViewController.m | 46 ++---- .../ViewModel/FirstViewControllerViewModel.h | 11 ++ .../ViewModel/FirstViewControllerViewModel.m | 135 +++++++++++++++--- 7 files changed, 179 insertions(+), 75 deletions(-) diff --git a/iOSStudy/Tools/CoreDataUtils.h b/iOSStudy/Tools/CoreDataUtils.h index bcdd9e2..5dd64a9 100644 --- a/iOSStudy/Tools/CoreDataUtils.h +++ b/iOSStudy/Tools/CoreDataUtils.h @@ -12,13 +12,12 @@ /** * 检查数据是否在表中已经存在 * - * @param url http地址 * @param tableName 表名 - * @param rowName 数据所在的列名 + * @param predicate 查询条件 * - * @return YES 存在 NO 不存在 + * @return YES 存在 NO不存在 */ -+(BOOL)dataisExist:(NSString*)url inTable:(NSString*)tableName tableRowName:(NSString*)rowName; ++(BOOL)dataisExistTableName:(NSString*)tableName withPredicate:(NSPredicate*)predicate; /** diff --git a/iOSStudy/Tools/CoreDataUtils.m b/iOSStudy/Tools/CoreDataUtils.m index 900cb7c..c1fe7ec 100644 --- a/iOSStudy/Tools/CoreDataUtils.m +++ b/iOSStudy/Tools/CoreDataUtils.m @@ -20,7 +20,7 @@ @implementation CoreDataUtils * * @return YES 存在 NO 不存在 */ -+(BOOL)dataisExist:(NSString*)url inTable:(NSString*)tableName tableRowName:(NSString*)rowName{ ++(BOOL)dataisExistTableName:(NSString*)tableName withPredicate:(NSPredicate*)predicate{ NSError *error; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; @@ -28,20 +28,18 @@ +(BOOL)dataisExist:(NSString*)url inTable:(NSString*)tableName tableRowName:(NSS entityForName:tableName inManagedObjectContext:SharedApp.managedObjectContext]; [fetchRequest setEntity:entity]; + if (predicate) { + fetchRequest.predicate = predicate; + } + NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; //NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"%@ = %@",rowName, url]; + - NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url= %@", url]; - - - NSArray *resultArr = [fetchedObjects filteredArrayUsingPredicate:titlePredicate]; - - - - if (resultArr.count!=0) { + if (fetchedObjects.count!=0) { // NSLog(@"111%lu",resultArr.count); return YES; }else{ @@ -67,20 +65,16 @@ +(NSArray*)queryDataFromTableName:(NSString*)tableName andNSPredicate:(NSPredica entityForName:tableName inManagedObjectContext:SharedApp.managedObjectContext]; [fetchRequest setEntity:entity]; - NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; - - - //若果有过滤条件返回过滤后的NSManagedObject 对象 没有的话直接返回全部 + // NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url= %@", url]; if (predicate) { - - // NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url= %@", url]; - - return [fetchedObjects filteredArrayUsingPredicate:predicate]; - }else{ - - return fetchedObjects; + fetchRequest.predicate = predicate; } + NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + + + return [fetchedObjects filteredArrayUsingPredicate:predicate]; + } diff --git a/iOSStudy/Tools/HttpVersionTools.m b/iOSStudy/Tools/HttpVersionTools.m index 8b22a45..668936b 100644 --- a/iOSStudy/Tools/HttpVersionTools.m +++ b/iOSStudy/Tools/HttpVersionTools.m @@ -88,7 +88,11 @@ +(void)saveNowHttpVersion:(NSString*)url version:(NSString*)version{ NSString *log ; //当数据存在事后执行更新操作 - if ([CoreDataUtils dataisExist:url inTable:CD_VersionsEntity tableRowName:@"url"]) + //[CoreDataUtils dataisExist:url inTable:CD_VersionsEntity tableRowName:@"url"] + NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"%@ = %@",@"url", url]; + if ( + [CoreDataUtils dataisExistTableName:CD_VersionsEntity withPredicate:urlPredicate] + ) { diff --git a/iOSStudy/iOSStudy/Constants .h b/iOSStudy/iOSStudy/Constants .h index 0dbc2d2..3bd3c31 100644 --- a/iOSStudy/iOSStudy/Constants .h +++ b/iOSStudy/iOSStudy/Constants .h @@ -29,4 +29,19 @@ * http版本号数据库表明 */ #define CD_VersionsEntity @"VersionsEntity" + + +static NSString *const textNameFavourite = @"收藏"; +static NSString *const textNameUnFavourite = @"取消收藏"; + +static NSString *const TYPE_BLOG_SIMPLE_TYPE = @"1"; +static NSString *const TYPE_WEB_SIMPLE_TYPE = @"2"; +static NSString *const TYPE_VIDEO_SIMPLE_TYPE = @"3"; + +static NSString *const TYPE_BLOG_FAVOURITE_TYPE = @"11"; +static NSString *const TYPE_WEB_FAVOURITE_TYPE = @"22"; +static NSString *const TYPE_VIDEO_FAVOURITE_TYPE = @"33"; + + + #endif diff --git a/iOSStudy/iOSStudy/FirstViewController.m b/iOSStudy/iOSStudy/FirstViewController.m index f851b4a..2587654 100644 --- a/iOSStudy/iOSStudy/FirstViewController.m +++ b/iOSStudy/iOSStudy/FirstViewController.m @@ -92,7 +92,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N } - cell.rightUtilityButtons =[self rightButtons]; + cell.delegate = self; @@ -101,6 +101,9 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N + cell.rightUtilityButtons =[_viewModel setRightSWCellButtons:[_viewModel getBlogBean:indexPath].url withType:TYPE_BLOG_FAVOURITE_TYPE]; + + [cell.imageView setImageWithURL:[NSURL URLWithString:[_viewModel getBlogBean:indexPath].image] placeholderImage:[UIImage imageNamed:@"SVWebViewControllerActivitySafari-iPad.png"]]; @@ -108,19 +111,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N } -#pragma mark --设置又滑菜单 -- (NSArray *)rightButtons -{ - NSMutableArray *rightUtilityButtons = [NSMutableArray new]; - [rightUtilityButtons sw_addUtilityButtonWithColor: - [UIColor colorWithRed:0.78f green:0.78f blue:0.8f alpha:1.0] - title:@"收藏"]; - [rightUtilityButtons sw_addUtilityButtonWithColor: - [UIColor colorWithRed:1.0f green:0.231f blue:0.188 alpha:1.0f] - title:@"不喜欢"]; - - return rightUtilityButtons; -} + -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ @@ -164,25 +155,18 @@ - (void)swipeableTableViewCellDidEndScrolling:(SWTableViewCell *)cell{ } - (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index{ - switch (index) { - case 0: - NSLog(@"不喜欢"); - { - NSIndexPath *indexPath = [_tableView indexPathForCell:cell]; - [_viewModel saveFavourite:indexPath]; - - } - break; - case 1: - NSLog(@"收藏"); - - break; - - default: - break; - } + + + NSIndexPath *indexPath = [_tableView indexPathForCell:cell]; + + + [_viewModel saveFavourite:indexPath]; + + [cell hideUtilityButtonsAnimated:YES]; + [_tableView reloadData]; + } diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h index a1cb097..ba51134 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h @@ -89,4 +89,15 @@ typedef void (^modelNetWorking)(BOOL isNetWorking); * @param modelDataIsNetWoring 网络状态 */ -(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentReload)modelDataReload modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring; + + +/** + * 设置SWTableViewCell 滑动文字 + * + * @param url url地址 + * @param type 1 博客 2 网址 3 视频 + * + * @return 要显示的Button集合 + */ +- (NSArray *)setRightSWCellButtons:(NSString*)url withType:(NSString*)type; @end diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m index 30b6354..9b4b26c 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m @@ -12,6 +12,7 @@ #import "BlogJsonBean.h" #import "HttpVersionTools.h" #import "CoreDataUtils.h" +#import @implementation FirstViewControllerViewModel - (instancetype)init { @@ -49,7 +50,7 @@ -(BlogBean*)getBlogBean:(NSIndexPath *)indexPath{ -(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentReload)modelDataReload modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring{ - _array = [[self getPersistenceData]copy]; + _array = [[self getPersistenceDataWithType:TYPE_BLOG_SIMPLE_TYPE]copy]; //modelDataSuccess(); modelDataReload(); @@ -121,7 +122,7 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentRe -(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring{ - _array = [[self getPersistenceData]copy]; + _array = [[self getPersistenceDataWithType:TYPE_BLOG_SIMPLE_TYPE]copy]; modelDataSuccess(); @@ -187,13 +188,18 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelD } #pragma mark -- 得到持久化的数据 --(NSArray*)getPersistenceData{ +-(NSArray*)getPersistenceDataWithType:(NSString*)type{ NSError *error; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:CD_FAVOURITE_BEAN inManagedObjectContext:SharedApp.managedObjectContext]; [fetchRequest setEntity:entity]; + //查询条件 + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type = %@",type]; + + fetchRequest.predicate = predicate; + NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; NSMutableArray *blogArr = [NSMutableArray arrayWithCapacity:10]; @@ -201,14 +207,16 @@ -(NSArray*)getPersistenceData{ for (NSManagedObject *info in fetchedObjects) { - BlogBean *blogBean = [[BlogBean alloc]init]; - blogBean.title = [info valueForKey:@"title"]; - blogBean.subTitle=[info valueForKey:@"subtitle"]; - blogBean.image = [info valueForKey:@"image_name"]; - blogBean.url = [info valueForKey:@"url"]; - NSLog(@"image=%@",blogBean.image); - [blogArr addObject:blogBean]; - + + BlogBean *blogBean = [[BlogBean alloc]init]; + blogBean.title = [info valueForKey:@"title"]; + blogBean.subTitle=[info valueForKey:@"subtitle"]; + blogBean.image = [info valueForKey:@"image_name"]; + blogBean.url = [info valueForKey:@"url"]; + NSLog(@"image=%@",blogBean.image); + [blogArr addObject:blogBean]; + + } @@ -227,7 +235,7 @@ -(void)persistenceData{ for (BlogBean *bean in _array) { - if ([self isExistURL:bean.url]) { + if ([self isExistSimpleDataWithURL:bean.url]) { NSLog(@"已经有这条数据了"); }else{ FavouriteBean *favouriteBean = (FavouriteBean*)[NSEntityDescription insertNewObjectForEntityForName:CD_FAVOURITE_BEAN inManagedObjectContext:SharedApp.managedObjectContext]; @@ -237,7 +245,7 @@ -(void)persistenceData{ favouriteBean.subtitle = bean.subTitle; favouriteBean.image_name = bean.image; favouriteBean.url= bean.url; - favouriteBean.type =@"11"; + favouriteBean.type =TYPE_BLOG_SIMPLE_TYPE; @@ -263,8 +271,11 @@ -(void)saveFavourite:(NSIndexPath*)indexPath{ BlogBean *loveBean = _array[indexPath.row]; - if ([self isExistURL:loveBean.url]) { - NSLog(@"已经有这条数据了"); + if ([self isEXistFavouriteDataWithURL:loveBean.url andUrlType:TYPE_BLOG_FAVOURITE_TYPE]) { + NSLog(@"已经有这条数据了 ");//更新收藏的状态 + + + }else{ FavouriteBean *favouriteBean = (FavouriteBean*)[NSEntityDescription insertNewObjectForEntityForName:CD_FAVOURITE_BEAN inManagedObjectContext:SharedApp.managedObjectContext]; @@ -273,7 +284,7 @@ -(void)saveFavourite:(NSIndexPath*)indexPath{ favouriteBean.subtitle = loveBean.subTitle; favouriteBean.image_name = loveBean.image; favouriteBean.url= loveBean.url; - favouriteBean.type =@"1"; + favouriteBean.type =TYPE_BLOG_FAVOURITE_TYPE; @@ -291,12 +302,98 @@ -(void)saveFavourite:(NSIndexPath*)indexPath{ } -//检查这个URL在数据库是否存在 --(BOOL)isExistURL:(NSString*)url{ - return [CoreDataUtils dataisExist:url inTable:CD_FAVOURITE_BEAN tableRowName:@"url"]; +/** + * 判断收藏的条目是否存在 + * + * @param url url地址 + * @param type url 类型 + * + * @return YES 存在 NO 不存在 + */ +-(BOOL)isEXistFavouriteDataWithURL:(NSString*)url andUrlType:(NSString*)type{ + + NSPredicate *urlAndurlTypePredicate = [NSPredicate predicateWithFormat:@"url = %@ AND type=%@",url,TYPE_BLOG_FAVOURITE_TYPE]; + + return [CoreDataUtils dataisExistTableName:CD_FAVOURITE_BEAN withPredicate:urlAndurlTypePredicate]; +} + +/** + * 判断收藏的URL地址是否存在 + * + * @param url URL地址 + * + * @return YES 存在 NO 不存在 + */ +-(BOOL)isExistSimpleDataWithURL:(NSString*)url{ + NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"%@ = %@",@"url", url]; + + return [CoreDataUtils dataisExistTableName:CD_FAVOURITE_BEAN withPredicate:urlPredicate]; +} + + +/** + * 判断URL 是否收藏过 + * + * @param url url 地址 + * @param type 收藏类型 1 博客 2 网址 3 视频 + * + * @return YES 收藏过了 NO 没有收藏过 + */ +-(BOOL)queryisFavourite:(NSString*)url withType:(NSString*)type{ + //判断当前条目是否收藏 显示收藏不收藏 + NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url= %@ AND type=%@", url,type]; + + NSArray *queryList = [CoreDataUtils queryDataFromTableName:CD_FAVOURITE_BEAN andNSPredicate:titlePredicate]; + + if (queryList.count!=0) { + NSLog(@"cout=%ld",queryList.count); + return YES; + }else{ + + return NO; + } +} + +/** + * 设置SWTableViewCell 滑动文字 + * + * @param url url地址 + * @param type 1 博客 2 网址 3 视频 + * + * @return 要显示的Button集合 + */ +- (NSArray *)setRightSWCellButtons:(NSString*)url withType:(NSString*)type +{ + + + NSString *showText ; + + if ([self queryisFavourite:url withType:type]) { + showText = textNameUnFavourite; + }else{ + showText = textNameFavourite; + } + + + NSMutableArray *rightUtilityButtons = [NSMutableArray new]; + [rightUtilityButtons sw_addUtilityButtonWithColor: + [UIColor colorWithRed:0.78f green:0.78f blue:0.8f alpha:1.0] + + title:showText]; + + + /* + [rightUtilityButtons sw_addUtilityButtonWithColor: + [UIColor colorWithRed:1.0f green:0.231f blue:0.188 alpha:1.0f] title:@"不喜欢"]; + */ + return rightUtilityButtons; + + } + + @end From dab533e45b18fb5b4ff2677c737da86bbb6a1cd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Sun, 5 Apr 2015 23:10:07 +0800 Subject: [PATCH 10/45] blog TableView+CoreData Blog change TableView+CoreData --- iOSStudy/Constants/EntityConstants.h | 15 ++++++++++++++ iOSStudy/Constants/EntityConstants.m | 15 ++++++++++++++ iOSStudy/iOSStudy.xcodeproj/project.pbxproj | 6 ++++++ iOSStudy/iOSStudy/FirstViewController.m | 12 +++++------ .../ViewModel/FirstViewControllerViewModel.h | 11 ++-------- .../ViewModel/FirstViewControllerViewModel.m | 20 +++++++++++++------ 6 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 iOSStudy/Constants/EntityConstants.h create mode 100644 iOSStudy/Constants/EntityConstants.m diff --git a/iOSStudy/Constants/EntityConstants.h b/iOSStudy/Constants/EntityConstants.h new file mode 100644 index 0000000..97defe3 --- /dev/null +++ b/iOSStudy/Constants/EntityConstants.h @@ -0,0 +1,15 @@ +// +// EntityConstants.h +// iOSStudy +// +// Created by chenguandong on 15/4/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +extern NSString *const FavouriteBean_title; +extern NSString *const FavouriteBean_subtitle; +extern NSString *const FavouriteBean_image_name; +extern NSString *const FavouriteBean_type; +extern NSString *const FavouriteBean_url; diff --git a/iOSStudy/Constants/EntityConstants.m b/iOSStudy/Constants/EntityConstants.m new file mode 100644 index 0000000..dfcdd0d --- /dev/null +++ b/iOSStudy/Constants/EntityConstants.m @@ -0,0 +1,15 @@ +// +// EntityConstants.m +// iOSStudy +// +// Created by chenguandong on 15/4/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "EntityConstants.h" + +NSString *const FavouriteBean_title = @"title"; +NSString *const FavouriteBean_subtitle = @"subtitle"; +NSString *const FavouriteBean_image_name = @"image_name"; +NSString *const FavouriteBean_type = @"type"; +NSString *const FavouriteBean_url = @"url"; diff --git a/iOSStudy/iOSStudy.xcodeproj/project.pbxproj b/iOSStudy/iOSStudy.xcodeproj/project.pbxproj index 8f770fd..64141a9 100644 --- a/iOSStudy/iOSStudy.xcodeproj/project.pbxproj +++ b/iOSStudy/iOSStudy.xcodeproj/project.pbxproj @@ -65,6 +65,7 @@ 18D2013E1A960B6100D5F095 /* app_img_1536x2048.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2013A1A960B6100D5F095 /* app_img_1536x2048.png */; }; 18D2013F1A960B6100D5F095 /* app_img_2048x1536.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2013B1A960B6100D5F095 /* app_img_2048x1536.png */; }; 18D201421A96143300D5F095 /* ThirdViewControllerViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 18D201411A96143300D5F095 /* ThirdViewControllerViewModel.m */; }; + 18D4ECA61AD17F56009FE9F0 /* EntityConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 18D4ECA51AD17F56009FE9F0 /* EntityConstants.m */; }; 18D908A71A8A205600B42A42 /* ThirdTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18D908A61A8A205600B42A42 /* ThirdTableViewController.m */; }; 18DF6D3D1A80D3BC005751E8 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 18DF6D3C1A80D3BC005751E8 /* Reachability.m */; }; 18DF6D3F1A80D40D005751E8 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18DF6D3E1A80D40D005751E8 /* SystemConfiguration.framework */; }; @@ -174,6 +175,8 @@ 18D2013B1A960B6100D5F095 /* app_img_2048x1536.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = app_img_2048x1536.png; path = " Resource/images/start_img/app_img_2048x1536.png"; sourceTree = ""; }; 18D201401A96143300D5F095 /* ThirdViewControllerViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThirdViewControllerViewModel.h; path = iOSStudy/ViewModel/ThirdViewControllerViewModel.h; sourceTree = ""; }; 18D201411A96143300D5F095 /* ThirdViewControllerViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ThirdViewControllerViewModel.m; path = iOSStudy/ViewModel/ThirdViewControllerViewModel.m; sourceTree = ""; }; + 18D4ECA41AD17F56009FE9F0 /* EntityConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EntityConstants.h; path = Constants/EntityConstants.h; sourceTree = ""; }; + 18D4ECA51AD17F56009FE9F0 /* EntityConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EntityConstants.m; path = Constants/EntityConstants.m; sourceTree = ""; }; 18D908A51A8A205600B42A42 /* ThirdTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThirdTableViewController.h; sourceTree = ""; }; 18D908A61A8A205600B42A42 /* ThirdTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThirdTableViewController.m; sourceTree = ""; }; 18DF6D391A80CF76005751E8 /* Constants .h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Constants .h"; path = "iOSStudy/Constants .h"; sourceTree = ""; }; @@ -295,6 +298,8 @@ 189EF82F1A83994B00F19327 /* Bean */, 18DF6D3A1A80D3A4005751E8 /* libs */, 18DF6D391A80CF76005751E8 /* Constants .h */, + 18D4ECA41AD17F56009FE9F0 /* EntityConstants.h */, + 18D4ECA51AD17F56009FE9F0 /* EntityConstants.m */, 18A998901A7C7772002E7219 /* Tools */, 18B23B4E1A7A235E00E80854 /* Base */, 18B23B211A7A14D000E80854 /* iOSStudy */, @@ -677,6 +682,7 @@ 18AB47951A99969600E4C030 /* VideoBean.m in Sources */, 18CECC0A1A91ACB7005598E4 /* FirstViewControllerViewModel.m in Sources */, 189EF8361A839FC600F19327 /* JsonTools.m in Sources */, + 18D4ECA61AD17F56009FE9F0 /* EntityConstants.m in Sources */, 18C845091ACCFC690053884F /* HttpVersionTools.m in Sources */, 18E6A0B51ACCF7FD00B28D32 /* VersionBean.m in Sources */, 18DF6D3D1A80D3BC005751E8 /* Reachability.m in Sources */, diff --git a/iOSStudy/iOSStudy/FirstViewController.m b/iOSStudy/iOSStudy/FirstViewController.m index 2587654..8da1f00 100644 --- a/iOSStudy/iOSStudy/FirstViewController.m +++ b/iOSStudy/iOSStudy/FirstViewController.m @@ -16,7 +16,7 @@ #import "BlogDetailViewController.h" #import #import - +#import "EntityConstants.h" @interface FirstViewController () @end @@ -96,15 +96,15 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell.delegate = self; - cell.textLabel.text = [_viewModel getBlogBean:indexPath].title; - cell.detailTextLabel.text = [_viewModel getBlogBean:indexPath].subTitle; + cell.textLabel.text = [[_viewModel getBlogBean:indexPath]valueForKey:FavouriteBean_title]; + cell.detailTextLabel.text = [[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_subtitle]; - cell.rightUtilityButtons =[_viewModel setRightSWCellButtons:[_viewModel getBlogBean:indexPath].url withType:TYPE_BLOG_FAVOURITE_TYPE]; + cell.rightUtilityButtons =[_viewModel setRightSWCellButtons:[[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_url] withType:TYPE_BLOG_FAVOURITE_TYPE]; - [cell.imageView setImageWithURL:[NSURL URLWithString:[_viewModel getBlogBean:indexPath].image] placeholderImage:[UIImage imageNamed:@"SVWebViewControllerActivitySafari-iPad.png"]]; + [cell.imageView setImageWithURL:[NSURL URLWithString:[[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_image_name]] placeholderImage:[UIImage imageNamed:@"SVWebViewControllerActivitySafari-iPad.png"]]; return cell; @@ -116,7 +116,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ - SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithAddress:[_viewModel getBlogBean:indexPath].url]; + SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithAddress:[[_viewModel getBlogBean:indexPath]valueForKey:FavouriteBean_url]]; [self presentViewController:webViewController animated:NO completion:NULL]; } diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h index ba51134..10d6be2 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h @@ -59,7 +59,7 @@ typedef void (^modelNetWorking)(BOOL isNetWorking); * * @return cell的数据 */ --(BlogBean*)getBlogBean:(NSIndexPath *)indexPath; +-(NSManagedObject*)getBlogBean:(NSIndexPath *)indexPath; @@ -70,14 +70,7 @@ typedef void (^modelNetWorking)(BOOL isNetWorking); */ -(void)saveFavourite:(NSIndexPath*)indexPath; -/** - * 此链接是否在数据库已经存在 - * - * @param url url地址 - * - * @return YES 存在 NO 不存在 - */ --(BOOL)isExistURL:(NSString*)url; + /** diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m index 9b4b26c..5fd3500 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m @@ -32,7 +32,7 @@ - (NSInteger)getNumberOfRowsInSection{ --(BlogBean*)getBlogBean:(NSIndexPath *)indexPath{ +-(NSManagedObject*)getBlogBean:(NSIndexPath *)indexPath{ return _array[indexPath.row]; } @@ -52,7 +52,7 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentRe _array = [[self getPersistenceDataWithType:TYPE_BLOG_SIMPLE_TYPE]copy]; - //modelDataSuccess(); + modelDataReload(); __block NSString *versionStr; @@ -82,8 +82,7 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentRe _array = [arr copy]; - - modelDataSuccess(); + //持久化数据 [self persistenceData]; @@ -92,6 +91,11 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentRe [HttpVersionTools saveNowHttpVersion:Address_blogs version:versionStr]; + _array = [[self getPersistenceDataWithType:TYPE_BLOG_SIMPLE_TYPE]copy]; + + modelDataSuccess(); + + } error:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); @@ -202,6 +206,8 @@ -(NSArray*)getPersistenceDataWithType:(NSString*)type{ NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + /* + NSMutableArray *blogArr = [NSMutableArray arrayWithCapacity:10]; @@ -220,8 +226,9 @@ -(NSArray*)getPersistenceDataWithType:(NSString*)type{ } - - return blogArr; + */ + + return fetchedObjects; } @@ -276,6 +283,7 @@ -(void)saveFavourite:(NSIndexPath*)indexPath{ + }else{ FavouriteBean *favouriteBean = (FavouriteBean*)[NSEntityDescription insertNewObjectForEntityForName:CD_FAVOURITE_BEAN inManagedObjectContext:SharedApp.managedObjectContext]; From d64db2d9933cff20668c9cb1a755575768f5f921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Mon, 6 Apr 2015 10:54:03 +0800 Subject: [PATCH 11/45] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=94=B6=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 收藏时候用NSManagedObject 管理对象 减少对Bean的依赖 加入取消收藏功能 --- iOSStudy/iOSStudy/FirstViewController.m | 2 + .../ViewModel/FirstViewControllerViewModel.m | 97 ++++++++----------- 2 files changed, 41 insertions(+), 58 deletions(-) diff --git a/iOSStudy/iOSStudy/FirstViewController.m b/iOSStudy/iOSStudy/FirstViewController.m index 8da1f00..9f39add 100644 --- a/iOSStudy/iOSStudy/FirstViewController.m +++ b/iOSStudy/iOSStudy/FirstViewController.m @@ -167,6 +167,8 @@ - (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityBut [_tableView reloadData]; + + } diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m index 5fd3500..4cfe441 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m @@ -13,6 +13,7 @@ #import "HttpVersionTools.h" #import "CoreDataUtils.h" #import +#import "EntityConstants.h" @implementation FirstViewControllerViewModel - (instancetype)init { @@ -205,28 +206,7 @@ -(NSArray*)getPersistenceDataWithType:(NSString*)type{ fetchRequest.predicate = predicate; NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; - - /* - - NSMutableArray *blogArr = [NSMutableArray arrayWithCapacity:10]; - - - for (NSManagedObject *info in fetchedObjects) { - - - BlogBean *blogBean = [[BlogBean alloc]init]; - blogBean.title = [info valueForKey:@"title"]; - blogBean.subTitle=[info valueForKey:@"subtitle"]; - blogBean.image = [info valueForKey:@"image_name"]; - blogBean.url = [info valueForKey:@"url"]; - NSLog(@"image=%@",blogBean.image); - [blogArr addObject:blogBean]; - - } - - - */ return fetchedObjects; @@ -245,18 +225,15 @@ -(void)persistenceData{ if ([self isExistSimpleDataWithURL:bean.url]) { NSLog(@"已经有这条数据了"); }else{ - FavouriteBean *favouriteBean = (FavouriteBean*)[NSEntityDescription insertNewObjectForEntityForName:CD_FAVOURITE_BEAN inManagedObjectContext:SharedApp.managedObjectContext]; + NSManagedObject *favouriteBean =[NSEntityDescription insertNewObjectForEntityForName:CD_FAVOURITE_BEAN inManagedObjectContext:SharedApp.managedObjectContext]; - favouriteBean.title = bean.title; - favouriteBean.subtitle = bean.subTitle; - favouriteBean.image_name = bean.image; - favouriteBean.url= bean.url; - favouriteBean.type =TYPE_BLOG_SIMPLE_TYPE; - - - - + [favouriteBean setValue:bean.title forKey:FavouriteBean_title]; + [favouriteBean setValue:bean.subTitle forKey:FavouriteBean_subtitle]; + [favouriteBean setValue:bean.image forKey:FavouriteBean_image_name]; + [favouriteBean setValue:bean.url forKey:FavouriteBean_url]; + [favouriteBean setValue:TYPE_BLOG_SIMPLE_TYPE forKey:FavouriteBean_type]; + } @@ -275,38 +252,47 @@ -(void)persistenceData{ -(void)saveFavourite:(NSIndexPath*)indexPath{ - BlogBean *loveBean = _array[indexPath.row]; + NSManagedObject *loveBean = _array[indexPath.row]; - - if ([self isEXistFavouriteDataWithURL:loveBean.url andUrlType:TYPE_BLOG_FAVOURITE_TYPE]) { + + NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"url= %@ AND type=%@", [loveBean valueForKey:FavouriteBean_url],TYPE_BLOG_FAVOURITE_TYPE]; + NSArray*favouriteList = [CoreDataUtils queryDataFromTableName:CD_FAVOURITE_BEAN andNSPredicate:urlPredicate]; + if (favouriteList.count!=0) { NSLog(@"已经有这条数据了 ");//更新收藏的状态 + [SharedApp.managedObjectContext deleteObject:favouriteList[0]]; - }else{ - FavouriteBean *favouriteBean = (FavouriteBean*)[NSEntityDescription insertNewObjectForEntityForName:CD_FAVOURITE_BEAN inManagedObjectContext:SharedApp.managedObjectContext]; - - - favouriteBean.title = loveBean.title; - favouriteBean.subtitle = loveBean.subTitle; - favouriteBean.image_name = loveBean.image; - favouriteBean.url= loveBean.url; - favouriteBean.type =TYPE_BLOG_FAVOURITE_TYPE; - - - - NSError *error; - BOOL isSaveSuccess =[SharedApp.managedObjectContext save:&error]; - if (!isSaveSuccess) { - NSLog(@"Error: %@,%@",error,[error userInfo]); - }else { - NSLog(@"Save successful favourite!"); + NSError *error = nil; + [SharedApp.managedObjectContext save:&error]; + if (error) { + + NSLog(@"删除收藏失败%@",[error userInfo]); + }else{ + NSLog(@"删除收藏成功"); } + }else{ + NSManagedObject *favouriteBean = [NSEntityDescription insertNewObjectForEntityForName:CD_FAVOURITE_BEAN inManagedObjectContext:SharedApp.managedObjectContext]; - + [favouriteBean setValue:[loveBean valueForKey:FavouriteBean_title] forKey:FavouriteBean_title]; + [favouriteBean setValue:[loveBean valueForKey:FavouriteBean_subtitle] forKey:FavouriteBean_subtitle]; + [favouriteBean setValue:[loveBean valueForKey:FavouriteBean_image_name] forKey:FavouriteBean_image_name]; + [favouriteBean setValue:[loveBean valueForKey:FavouriteBean_url] forKey:FavouriteBean_url]; + [favouriteBean setValue:TYPE_BLOG_FAVOURITE_TYPE forKey:FavouriteBean_type]; } + NSError *error; + BOOL isSaveSuccess =[SharedApp.managedObjectContext save:&error]; + if (!isSaveSuccess) { + NSLog(@"Error: %@,%@",error,[error userInfo]); + }else { + NSLog(@"Save successful favourite!"); + } + + + + } @@ -391,11 +377,6 @@ - (NSArray *)setRightSWCellButtons:(NSString*)url withType:(NSString*)type title:showText]; - - /* - [rightUtilityButtons sw_addUtilityButtonWithColor: - [UIColor colorWithRed:1.0f green:0.231f blue:0.188 alpha:1.0f] title:@"不喜欢"]; - */ return rightUtilityButtons; From aca09269eec8ae27836a4d793656ea3a3906ef73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Mon, 6 Apr 2015 12:08:25 +0800 Subject: [PATCH 12/45] =?UTF-8?q?=E8=B7=9F=E6=96=B0http=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 跟新http数据 --- iOSStudyJsonData/videos.json | 3 +-- iOSStudyJsonData/webs.json | 33 +-------------------------------- 2 files changed, 2 insertions(+), 34 deletions(-) diff --git a/iOSStudyJsonData/videos.json b/iOSStudyJsonData/videos.json index c59e8f4..17e7146 100644 --- a/iOSStudyJsonData/videos.json +++ b/iOSStudyJsonData/videos.json @@ -1,2 +1 @@ -[{"videoLanguageType":"zh","title":"传智博客国内首部Swift教程(系统、全面、有深度)","subTitle":"传智博客Swift从入门到精通视频教程完整版","webImage":"http://www.itcast.cn/files/image/201406/20140611114331424.jpg","webUrl":"http://pan.baidu.com/s/1bndD3cz"},{"videoLanguageType":"zh","title":"传智博客iOS开发零基础入门教程","subTitle":"C基础 OC基础 MacOS基础 知识","webImage":"http://www.itcast.cn/files/image/201406/20140611114424706.jpg","webUrl":"http://pan.baidu.com/share/link?shareid\u003d3864330827\u0026uk\u003d3560277524"},{"videoLanguageType":"zh","title":"传智博客iOS开发进阶教程","subTitle":"一些高级和基础控件使用主要是UI的知识","webImage":"http://www.itcast.cn/files/image/201406/20140611115311661.jpg","webUrl":"http://pan.baidu.com/s/1pJDGOll"},{"videoLanguageType":"zh","title":"传智博客iOS开发快速入门教程","subTitle":"C OC基础教程","webImage":"http://www.itcast.cn/files/image/201406/20140611115327052.jpg","webUrl":"http://pan.baidu.com/share/link?shareid\u003d3691511572\u0026uk\u003d3560277524"}] - +{"version":"2","bloglists":[{"videoLanguageType":"zh","title":"传智博客国内首部Swift教程(系统、全面、有深度)","subTitle":"传智博客Swift从入门到精通视频教程完整版","webImage":"http://www.itcast.cn/files/image/201406/20140611114331424.jpg","webUrl":"http://pan.baidu.com/s/1bndD3cz"},{"videoLanguageType":"zh","title":"传智博客iOS开发零基础入门教程","subTitle":"C基础 OC基础 MacOS基础 知识","webImage":"http://www.itcast.cn/files/image/201406/20140611114424706.jpg","webUrl":"http://pan.baidu.com/share/link?shareid\u003d3864330827\u0026uk\u003d3560277524"},{"videoLanguageType":"zh","title":"传智博客iOS开发进阶教程","subTitle":"一些高级和基础控件使用主要是UI的知识","webImage":"http://www.itcast.cn/files/image/201406/20140611115311661.jpg","webUrl":"http://pan.baidu.com/s/1pJDGOll"},{"videoLanguageType":"zh","title":"传智博客iOS开发快速入门教程","subTitle":"C OC基础教程","webImage":"http://www.itcast.cn/files/image/201406/20140611115327052.jpg","webUrl":"http://pan.baidu.com/share/link?shareid\u003d3691511572\u0026uk\u003d3560277524"}]} diff --git a/iOSStudyJsonData/webs.json b/iOSStudyJsonData/webs.json index 5f4499b..b5e10bb 100644 --- a/iOSStudyJsonData/webs.json +++ b/iOSStudyJsonData/webs.json @@ -1,32 +1 @@ -[ - { - "title": "objc中国", - "subTitile": "为中国 Objective-C 社区带来最佳实践和先进技术", - "webImage": "http://www.objc.io/images/covers/6-small.jpg", - "webUrl": "http://objccn.io/" - }, - { - "title": "objc", - "subTitile": "A periodical about best practices and advanced techniques for iOS and OS X development.", - "webImage": "http://www.objc.io/images/covers/4-small.jpg", - "webUrl": "http://www.objc.io/" - }, - { - "title": "AppCoda", - "subTitile": "AppCoda was founded in April 2012 as a personal blog. It was a place where I shared my iOS programming experience and helped beginners to kick start iOS app development. Since then, it has grown into a community for iOS developers with hundreds of thousands readers and a bunch of contributors, as well as, a free course and two books.", - "webImage": "http://www.appcoda.com/wp-content/themes/eleven40/images/favicon.ico", - "webUrl": "http://www.appcoda.com/ios-programming-course/" - }, - { - "title": "NShipster", - "subTitile": "大神Mattt Thompson的博客你懂的", - "webImage": "http://nshipster.cn/touch-icon-ipad-retina.png", - "webUrl": "http://nshipster.cn/" - }, - { - "title": "GoWhich", - "subTitile": "想你所想,做你所做,认真对待你的人生...", - "webImage": "https://avatars0.githubusercontent.com/u/1449203?v=3&s=460", - "webUrl": "http://www.gowhich.com/category/IOS" - } -] +{"version":"2","bloglists":[{"title":"objc中国","subTitle":"为中国 Objective-C 社区带来最佳实践和先进技术","webImage":"http://www.objc.io/images/covers/6-small.jpg","webUrl":"http://objccn.io/"},{"title":"objc","subTitle":"A periodical about best practices and advanced techniques for iOS and OS X development.","webImage":"http://www.objc.io/images/covers/4-small.jpg","webUrl":"http://www.objc.io/"},{"title":"AppCoda","subTitle":"AppCoda was founded in April 2012 as a personal blog. It was a place where I shared my iOS programming experience and helped beginners to kick start iOS app development. Since then, it has grown into a community for iOS developers with hundreds of thousands readers and a bunch of contributors, as well as, a free course and two books.","webImage":"http://www.appcoda.com/wp-content/themes/eleven40/images/favicon.ico","webUrl":"http://www.appcoda.com/ios-programming-course/"},{"title":"NShipster","subTitle":"大神Mattt Thompson的博客你懂的","webImage":"http://nshipster.cn/touch-icon-ipad-retina.png","webUrl":"http://nshipster.cn/"},{"title":"GoWhich","subTitle":"想你所想,做你所做,认真对待你的人生...","webImage":"https://avatars0.githubusercontent.com/u/1449203?v\u003d3\u0026s\u003d460","webUrl":"http://www.gowhich.com/category/IOS"}]} From 28ddfb6a25601551dc887cf2639eefbe7f6c7090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Mon, 6 Apr 2015 12:18:18 +0800 Subject: [PATCH 13/45] update version.son version update version.son version --- iOSStudy/iOSStudy/Constants .h | 4 ++-- iOSStudyJsonData/versions.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/iOSStudy/iOSStudy/Constants .h b/iOSStudy/iOSStudy/Constants .h index 3bd3c31..d8d5f82 100644 --- a/iOSStudy/iOSStudy/Constants .h +++ b/iOSStudy/iOSStudy/Constants .h @@ -12,8 +12,8 @@ #define iOSStudy_Constants__h #define Address_blogs @"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json" -#define Adress_webs @"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json" -#define Adress_videos @"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json" +#define Adress_webs @"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/webs.json" +#define Adress_videos @"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/videos.json" #define Adress_versions @"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/versions.json" diff --git a/iOSStudyJsonData/versions.json b/iOSStudyJsonData/versions.json index 2b55054..92164b4 100644 --- a/iOSStudyJsonData/versions.json +++ b/iOSStudyJsonData/versions.json @@ -1,2 +1,2 @@ -[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"6"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"1"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"1"}] +[{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/CoreDataJoin/iOSStudyJsonData/blogs.json","urlVersion":"6"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/webs.json","urlVersion":"2"},{"url":"https://raw.githubusercontent.com/chenguandong/iOSStudy/master/iOSStudyJsonData/videos.json","urlVersion":"2"}] From c67b5ae0affa9b510a8c1bfe4832ea452478caf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=86=A0=E4=B8=9C?= Date: Mon, 6 Apr 2015 16:01:46 +0800 Subject: [PATCH 14/45] web+video web+video --- iOSStudy/.gitignore | 26 + iOSStudy/Cell/VideoCell.h | 4 +- iOSStudy/LICENSE | 22 + iOSStudy/README.md | 2 + iOSStudy/Tools/HttpVersionTools.m | 2 +- iOSStudy/iOSStudy/Base.lproj/Main.storyboard | 28 +- iOSStudy/iOSStudy/Base/BaseTableViewCell.h | 13 + iOSStudy/iOSStudy/Base/BaseTableViewCell.m | 24 + iOSStudy/iOSStudy/Base/BaseViewController.h | 13 + iOSStudy/iOSStudy/Base/BaseViewController.m | 42 + iOSStudy/iOSStudy/Bean/FavouriteBean.h | 38 + iOSStudy/iOSStudy/Bean/FavouriteBean.m | 13 + iOSStudy/iOSStudy/Bean/blogBean/BlogBean.h | 43 + iOSStudy/iOSStudy/Bean/blogBean/BlogBean.m | 27 + .../iOSStudy/Bean/blogBean/BlogJsonBean.h | 15 + .../iOSStudy/Bean/blogBean/BlogJsonBean.m | 22 + .../iOSStudy/Bean/versionBean/VersionBean.h | 23 + .../iOSStudy/Bean/versionBean/VersionBean.m | 24 + iOSStudy/iOSStudy/Bean/videoBean/VideoBean.h | 16 + iOSStudy/iOSStudy/Bean/videoBean/VideoBean.m | 20 + iOSStudy/iOSStudy/Bean/webBean/WebBean.h | 33 + iOSStudy/iOSStudy/Bean/webBean/WebBean.m | 25 + iOSStudy/iOSStudy/Cell/VideoCell.h | 16 + iOSStudy/iOSStudy/Cell/VideoCell.m | 21 + iOSStudy/iOSStudy/Constants/EntityConstants.h | 15 + iOSStudy/iOSStudy/Constants/EntityConstants.m | 15 + iOSStudy/iOSStudy/FirstViewController.h | 6 + iOSStudy/iOSStudy/FirstViewController.m | 23 +- iOSStudy/iOSStudy/Podfile | 9 + iOSStudy/iOSStudy/Podfile.lock | 59 + .../AFNetworking/AFHTTPRequestOperation.h | 67 + .../AFNetworking/AFHTTPRequestOperation.m | 206 + .../AFHTTPRequestOperationManager.h | 308 + .../AFHTTPRequestOperationManager.m | 285 + .../AFNetworking/AFHTTPSessionManager.h | 240 + .../AFNetworking/AFHTTPSessionManager.m | 321 + .../AFNetworkReachabilityManager.h | 193 + .../AFNetworkReachabilityManager.m | 259 + .../AFNetworking/AFNetworking/AFNetworking.h | 44 + .../AFNetworking/AFSecurityPolicy.h | 143 + .../AFNetworking/AFSecurityPolicy.m | 317 + .../AFNetworking/AFURLConnectionOperation.h | 328 + .../AFNetworking/AFURLConnectionOperation.m | 789 ++ .../AFNetworking/AFURLRequestSerialization.h | 468 ++ .../AFNetworking/AFURLRequestSerialization.m | 1344 +++ .../AFNetworking/AFURLResponseSerialization.h | 310 + .../AFNetworking/AFURLResponseSerialization.m | 793 ++ .../AFNetworking/AFURLSessionManager.h | 531 ++ .../AFNetworking/AFURLSessionManager.m | 1094 +++ iOSStudy/iOSStudy/Pods/AFNetworking/LICENSE | 19 + iOSStudy/iOSStudy/Pods/AFNetworking/README.md | 387 + .../AFNetworkActivityIndicatorManager.h | 76 + .../AFNetworkActivityIndicatorManager.m | 171 + .../UIActivityIndicatorView+AFNetworking.h | 64 + .../UIActivityIndicatorView+AFNetworking.m | 97 + .../UIAlertView+AFNetworking.h | 96 + .../UIAlertView+AFNetworking.m | 129 + .../UIButton+AFNetworking.h | 181 + .../UIButton+AFNetworking.m | 294 + .../UIImageView+AFNetworking.h | 143 + .../UIImageView+AFNetworking.m | 216 + .../UIKit+AFNetworking/UIKit+AFNetworking.h | 38 + .../UIProgressView+AFNetworking.h | 88 + .../UIProgressView+AFNetworking.m | 183 + .../UIRefreshControl+AFNetworking.h | 64 + .../UIRefreshControl+AFNetworking.m | 93 + .../UIWebView+AFNetworking.h | 83 + .../UIWebView+AFNetworking.m | 151 + iOSStudy/iOSStudy/Pods/FMDB/LICENSE.txt | 28 + iOSStudy/iOSStudy/Pods/FMDB/README.markdown | 336 + iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDB.h | 5 + .../iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.h | 1083 +++ .../iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.m | 1424 ++++ .../Pods/FMDB/src/fmdb/FMDatabaseAdditions.h | 281 + .../Pods/FMDB/src/fmdb/FMDatabaseAdditions.m | 224 + .../Pods/FMDB/src/fmdb/FMDatabasePool.h | 204 + .../Pods/FMDB/src/fmdb/FMDatabasePool.m | 273 + .../Pods/FMDB/src/fmdb/FMDatabaseQueue.h | 174 + .../Pods/FMDB/src/fmdb/FMDatabaseQueue.m | 232 + .../iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.h | 469 ++ .../iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.m | 416 + .../AFNetworking/AFHTTPRequestOperation.h | 1 + .../AFHTTPRequestOperationManager.h | 1 + .../AFNetworking/AFHTTPSessionManager.h | 1 + .../AFNetworkActivityIndicatorManager.h | 1 + .../AFNetworkReachabilityManager.h | 1 + .../Public/AFNetworking/AFNetworking.h | 1 + .../Public/AFNetworking/AFSecurityPolicy.h | 1 + .../AFNetworking/AFURLConnectionOperation.h | 1 + .../AFNetworking/AFURLRequestSerialization.h | 1 + .../AFNetworking/AFURLResponseSerialization.h | 1 + .../Public/AFNetworking/AFURLSessionManager.h | 1 + .../UIActivityIndicatorView+AFNetworking.h | 1 + .../AFNetworking/UIAlertView+AFNetworking.h | 1 + .../AFNetworking/UIButton+AFNetworking.h | 1 + .../AFNetworking/UIImageView+AFNetworking.h | 1 + .../Public/AFNetworking/UIKit+AFNetworking.h | 1 + .../UIProgressView+AFNetworking.h | 1 + .../UIRefreshControl+AFNetworking.h | 1 + .../AFNetworking/UIWebView+AFNetworking.h | 1 + .../iOSStudy/Pods/Headers/Public/FMDB/FMDB.h | 1 + .../Pods/Headers/Public/FMDB/FMDatabase.h | 1 + .../Headers/Public/FMDB/FMDatabaseAdditions.h | 1 + .../Pods/Headers/Public/FMDB/FMDatabasePool.h | 1 + .../Headers/Public/FMDB/FMDatabaseQueue.h | 1 + .../Pods/Headers/Public/FMDB/FMResultSet.h | 1 + .../Pods/Headers/Public/MJRefresh/MJRefresh.h | 1 + .../Public/MJRefresh/MJRefreshBaseView.h | 1 + .../Headers/Public/MJRefresh/MJRefreshConst.h | 1 + .../Public/MJRefresh/MJRefreshFooterView.h | 1 + .../Public/MJRefresh/MJRefreshHeaderView.h | 1 + .../MJRefresh/UIScrollView+MJExtension.h | 1 + .../Public/MJRefresh/UIScrollView+MJRefresh.h | 1 + .../Public/MJRefresh/UIView+MJExtension.h | 1 + .../Headers/Public/Mantle/EXTKeyPathCoding.h | 1 + .../Public/Mantle/EXTRuntimeExtensions.h | 1 + .../Pods/Headers/Public/Mantle/EXTScope.h | 1 + .../Headers/Public/Mantle/MTLJSONAdapter.h | 1 + .../Public/Mantle/MTLManagedObjectAdapter.h | 1 + .../Headers/Public/Mantle/MTLModel+NSCoding.h | 1 + .../Pods/Headers/Public/Mantle/MTLModel.h | 1 + .../Headers/Public/Mantle/MTLReflection.h | 1 + .../Public/Mantle/MTLValueTransformer.h | 1 + .../Pods/Headers/Public/Mantle/Mantle.h | 1 + .../Mantle/NSArray+MTLManipulationAdditions.h | 1 + .../NSDictionary+MTLManipulationAdditions.h | 1 + .../Public/Mantle/NSError+MTLModelException.h | 1 + .../Mantle/NSObject+MTLComparisonAdditions.h | 1 + ...NSValueTransformer+MTLInversionAdditions.h | 1 + ...former+MTLPredefinedTransformerAdditions.h | 1 + .../Pods/Headers/Public/Mantle/metamacros.h | 1 + .../SDWebImage/NSData+ImageContentType.h | 1 + .../Headers/Public/SDWebImage/SDImageCache.h | 1 + .../Public/SDWebImage/SDWebImageCompat.h | 1 + .../Public/SDWebImage/SDWebImageDecoder.h | 1 + .../Public/SDWebImage/SDWebImageDownloader.h | 1 + .../SDWebImageDownloaderOperation.h | 1 + .../Public/SDWebImage/SDWebImageManager.h | 1 + .../Public/SDWebImage/SDWebImageOperation.h | 1 + .../Public/SDWebImage/SDWebImagePrefetcher.h | 1 + .../Public/SDWebImage/UIButton+WebCache.h | 1 + .../Headers/Public/SDWebImage/UIImage+GIF.h | 1 + .../Public/SDWebImage/UIImage+MultiFormat.h | 1 + .../UIImageView+HighlightedWebCache.h | 1 + .../Public/SDWebImage/UIImageView+WebCache.h | 1 + .../SDWebImage/UIView+WebCacheOperation.h | 1 + .../SVProgressHUD/SVIndefiniteAnimatedView.h | 1 + .../Public/SVProgressHUD/SVProgressHUD.h | 1 + .../SVModalWebViewController.h | 1 + .../SVWebViewController/SVWebViewController.h | 1 + .../SVWebViewControllerActivity.h | 1 + .../SVWebViewControllerActivityChrome.h | 1 + .../SVWebViewControllerActivitySafari.h | 1 + .../NSMutableArray+SWUtilityButtons.h | 1 + .../Public/SWTableViewCell/SWCellScrollView.h | 1 + .../SWLongPressGestureRecognizer.h | 1 + .../Public/SWTableViewCell/SWTableViewCell.h | 1 + .../SWUtilityButtonTapGestureRecognizer.h | 1 + .../SWTableViewCell/SWUtilityButtonView.h | 1 + iOSStudy/iOSStudy/Pods/MJRefresh/LICENSE | 19 + .../MJRefresh/MJRefresh.bundle/arrow@2x.png | Bin 0 -> 3044 bytes .../MJRefreshExample/MJRefresh/MJRefresh.h | 32 + .../MJRefresh/MJRefreshBaseView.h | 78 + .../MJRefresh/MJRefreshBaseView.m | 291 + .../MJRefresh/MJRefreshConst.h | 41 + .../MJRefresh/MJRefreshConst.m | 25 + .../MJRefresh/MJRefreshFooterView.h | 13 + .../MJRefresh/MJRefreshFooterView.m | 226 + .../MJRefresh/MJRefreshHeaderView.h | 16 + .../MJRefresh/MJRefreshHeaderView.m | 245 + .../MJRefresh/UIScrollView+MJExtension.h | 22 + .../MJRefresh/UIScrollView+MJExtension.m | 107 + .../MJRefresh/UIScrollView+MJRefresh.h | 124 + .../MJRefresh/UIScrollView+MJRefresh.m | 292 + .../MJRefresh/UIView+MJExtension.h | 18 + .../MJRefresh/UIView+MJExtension.m | 83 + iOSStudy/iOSStudy/Pods/MJRefresh/README.md | 43 + iOSStudy/iOSStudy/Pods/Manifest.lock | 59 + iOSStudy/iOSStudy/Pods/Mantle/LICENSE.md | 21 + .../Pods/Mantle/Mantle/MTLJSONAdapter.h | 172 + .../Pods/Mantle/Mantle/MTLJSONAdapter.m | 325 + .../Mantle/Mantle/MTLManagedObjectAdapter.h | 215 + .../Mantle/Mantle/MTLManagedObjectAdapter.m | 645 ++ .../Pods/Mantle/Mantle/MTLModel+NSCoding.h | 128 + .../Pods/Mantle/Mantle/MTLModel+NSCoding.m | 267 + .../iOSStudy/Pods/Mantle/Mantle/MTLModel.h | 125 + .../iOSStudy/Pods/Mantle/Mantle/MTLModel.m | 245 + .../Pods/Mantle/Mantle/MTLReflection.h | 31 + .../Pods/Mantle/Mantle/MTLReflection.m | 50 + .../Pods/Mantle/Mantle/MTLValueTransformer.h | 29 + .../Pods/Mantle/Mantle/MTLValueTransformer.m | 88 + iOSStudy/iOSStudy/Pods/Mantle/Mantle/Mantle.h | 26 + .../Mantle/NSArray+MTLManipulationAdditions.h | 28 + .../Mantle/NSArray+MTLManipulationAdditions.m | 42 + .../NSDictionary+MTLManipulationAdditions.h | 25 + .../NSDictionary+MTLManipulationAdditions.m | 25 + .../Mantle/Mantle/NSError+MTLModelException.h | 23 + .../Mantle/Mantle/NSError+MTLModelException.m | 36 + .../Mantle/NSObject+MTLComparisonAdditions.h | 15 + .../Mantle/NSObject+MTLComparisonAdditions.m | 16 + ...NSValueTransformer+MTLInversionAdditions.h | 21 + ...NSValueTransformer+MTLInversionAdditions.m | 24 + ...former+MTLPredefinedTransformerAdditions.h | 84 + ...former+MTLPredefinedTransformerAdditions.m | 141 + .../Mantle/Mantle/extobjc/EXTKeyPathCoding.h | 68 + .../Mantle/extobjc/EXTRuntimeExtensions.h | 113 + .../Mantle/extobjc/EXTRuntimeExtensions.m | 211 + .../Pods/Mantle/Mantle/extobjc/EXTScope.h | 99 + .../Pods/Mantle/Mantle/extobjc/EXTScope.m | 15 + .../Pods/Mantle/Mantle/extobjc/metamacros.h | 666 ++ iOSStudy/iOSStudy/Pods/Mantle/README.md | 507 ++ .../Pods/Pods.xcodeproj/project.pbxproj | 7325 +++++++++++++++++ iOSStudy/iOSStudy/Pods/SDWebImage/LICENSE | 20 + iOSStudy/iOSStudy/Pods/SDWebImage/README.md | 280 + .../SDWebImage/NSData+ImageContentType.h | 26 + .../SDWebImage/NSData+ImageContentType.m | 49 + .../Pods/SDWebImage/SDWebImage/SDImageCache.h | 241 + .../Pods/SDWebImage/SDWebImage/SDImageCache.m | 534 ++ .../SDWebImage/SDWebImage/SDWebImageCompat.h | 70 + .../SDWebImage/SDWebImage/SDWebImageCompat.m | 45 + .../SDWebImage/SDWebImage/SDWebImageDecoder.h | 18 + .../SDWebImage/SDWebImage/SDWebImageDecoder.m | 72 + .../SDWebImage/SDWebImageDownloader.h | 173 + .../SDWebImage/SDWebImageDownloader.m | 225 + .../SDWebImageDownloaderOperation.h | 60 + .../SDWebImageDownloaderOperation.m | 414 + .../SDWebImage/SDWebImage/SDWebImageManager.h | 285 + .../SDWebImage/SDWebImage/SDWebImageManager.m | 346 + .../SDWebImage/SDWebImageOperation.h | 15 + .../SDWebImage/SDWebImagePrefetcher.h | 98 + .../SDWebImage/SDWebImagePrefetcher.m | 138 + .../SDWebImage/SDWebImage/UIButton+WebCache.h | 229 + .../SDWebImage/SDWebImage/UIButton+WebCache.m | 260 + .../Pods/SDWebImage/SDWebImage/UIImage+GIF.h | 19 + .../Pods/SDWebImage/SDWebImage/UIImage+GIF.m | 158 + .../SDWebImage/UIImage+MultiFormat.h | 15 + .../SDWebImage/UIImage+MultiFormat.m | 114 + .../UIImageView+HighlightedWebCache.h | 100 + .../UIImageView+HighlightedWebCache.m | 107 + .../SDWebImage/UIImageView+WebCache.h | 201 + .../SDWebImage/UIImageView+WebCache.m | 195 + .../SDWebImage/UIView+WebCacheOperation.h | 36 + .../SDWebImage/UIView+WebCacheOperation.m | 55 + .../iOSStudy/Pods/SVProgressHUD/LICENSE.txt | 26 + .../iOSStudy/Pods/SVProgressHUD/README.md | 137 + .../SVProgressHUD/SVIndefiniteAnimatedView.h | 18 + .../SVProgressHUD/SVIndefiniteAnimatedView.m | 131 + .../SVProgressHUD.bundle/angle-mask.png | Bin 0 -> 3482 bytes .../SVProgressHUD.bundle/angle-mask@2x.png | Bin 0 -> 5614 bytes .../SVProgressHUD.bundle/angle-mask@3x.png | Bin 0 -> 9389 bytes .../SVProgressHUD.bundle/error.png | Bin 0 -> 455 bytes .../SVProgressHUD.bundle/error@2x.png | Bin 0 -> 1137 bytes .../SVProgressHUD.bundle/error@3x.png | Bin 0 -> 2315 bytes .../SVProgressHUD.bundle/info.png | Bin 0 -> 1123 bytes .../SVProgressHUD.bundle/info@2x.png | Bin 0 -> 2554 bytes .../SVProgressHUD.bundle/info@3x.png | Bin 0 -> 4385 bytes .../SVProgressHUD.bundle/success.png | Bin 0 -> 349 bytes .../SVProgressHUD.bundle/success@2x.png | Bin 0 -> 811 bytes .../SVProgressHUD.bundle/success@3x.png | Bin 0 -> 1576 bytes .../SVProgressHUD/SVProgressHUD.h | 78 + .../SVProgressHUD/SVProgressHUD.m | 946 +++ .../Pods/SVWebViewController/LICENSE.txt | 22 + .../Pods/SVWebViewController/README.md | 52 + .../SVModalWebViewController.h | 20 + .../SVModalWebViewController.m | 50 + .../SVWebViewControllerBack.png | Bin 0 -> 1148 bytes .../SVWebViewControllerBack@2x.png | Bin 0 -> 1311 bytes .../SVWebViewControllerNext.png | Bin 0 -> 1152 bytes .../SVWebViewControllerNext@2x.png | Bin 0 -> 1299 bytes .../SVWebViewController/SVWebViewController.h | 16 + .../SVWebViewController/SVWebViewController.m | 297 + ...SVWebViewControllerActivityChrome-iPad.png | Bin 0 -> 2821 bytes ...ebViewControllerActivityChrome-iPad@2x.png | Bin 0 -> 5345 bytes .../SVWebViewControllerActivityChrome.h | 13 + .../SVWebViewControllerActivityChrome.m | 38 + .../SVWebViewControllerActivityChrome@2x.png | Bin 0 -> 4289 bytes .../SVWebViewControllerActivity.h | 16 + .../SVWebViewControllerActivity.m | 32 + ...SVWebViewControllerActivitySafari-iPad.png | Bin 0 -> 3333 bytes ...ebViewControllerActivitySafari-iPad@2x.png | Bin 0 -> 6892 bytes .../SVWebViewControllerActivitySafari.h | 13 + .../SVWebViewControllerActivitySafari.m | 32 + .../SVWebViewControllerActivitySafari@2x.png | Bin 0 -> 5153 bytes .../iOSStudy/Pods/SWTableViewCell/LICENCE | 19 + .../iOSStudy/Pods/SWTableViewCell/README.md | 249 + .../NSMutableArray+SWUtilityButtons.h | 25 + .../NSMutableArray+SWUtilityButtons.m | 92 + .../PodFiles/SWCellScrollView.h | 13 + .../PodFiles/SWCellScrollView.m | 42 + .../PodFiles/SWLongPressGestureRecognizer.h | 15 + .../PodFiles/SWLongPressGestureRecognizer.m | 33 + .../PodFiles/SWTableViewCell.h | 52 + .../PodFiles/SWTableViewCell.m | 800 ++ .../SWUtilityButtonTapGestureRecognizer.h | 17 + .../SWUtilityButtonTapGestureRecognizer.m | 14 + .../PodFiles/SWUtilityButtonView.h | 27 + .../PodFiles/SWUtilityButtonView.m | 153 + .../Pods-AFNetworking-Private.xcconfig | 5 + .../Pods-AFNetworking-dummy.m | 5 + .../Pods-AFNetworking-prefix.pch | 5 + .../Pods-AFNetworking.xcconfig | 1 + .../Pods-FMDB/Pods-FMDB-Private.xcconfig | 5 + .../Pods-FMDB/Pods-FMDB-dummy.m | 5 + .../Pods-FMDB/Pods-FMDB-prefix.pch | 5 + .../Pods-FMDB/Pods-FMDB.xcconfig | 1 + .../Pods-MJRefresh-Private.xcconfig | 5 + .../Pods-MJRefresh/Pods-MJRefresh-dummy.m | 5 + .../Pods-MJRefresh/Pods-MJRefresh-prefix.pch | 5 + .../Pods-MJRefresh/Pods-MJRefresh.xcconfig | 0 .../Pods-Mantle/Pods-Mantle-Private.xcconfig | 5 + .../Pods-Mantle/Pods-Mantle-dummy.m | 5 + .../Pods-Mantle/Pods-Mantle-prefix.pch | 5 + .../Pods-Mantle/Pods-Mantle.xcconfig | 1 + .../Pods-SDWebImage-Private.xcconfig | 5 + .../Pods-SDWebImage/Pods-SDWebImage-dummy.m | 5 + .../Pods-SDWebImage-prefix.pch | 5 + .../Pods-SDWebImage/Pods-SDWebImage.xcconfig | 1 + .../Pods-SVProgressHUD-Private.xcconfig | 5 + .../Pods-SVProgressHUD-dummy.m | 5 + .../Pods-SVProgressHUD-prefix.pch | 5 + .../Pods-SVProgressHUD.xcconfig | 1 + .../Pods-SVWebViewController-Private.xcconfig | 5 + .../Pods-SVWebViewController-dummy.m | 5 + .../Pods-SVWebViewController-prefix.pch | 5 + .../Pods-SVWebViewController.xcconfig | 0 .../Pods-SWTableViewCell-Private.xcconfig | 5 + .../Pods-SWTableViewCell-dummy.m | 5 + .../Pods-SWTableViewCell-prefix.pch | 5 + .../Pods-SWTableViewCell.xcconfig | 0 .../Pods/Pods-acknowledgements.markdown | 205 + .../Pods/Pods-acknowledgements.plist | 263 + .../Target Support Files/Pods/Pods-dummy.m | 5 + .../Pods/Pods-environment.h | 116 + .../Pods/Pods-resources.sh | 87 + .../Pods/Pods.debug.xcconfig | 6 + .../Pods/Pods.release.xcconfig | 6 + iOSStudy/iOSStudy/Reachability.h | 95 + iOSStudy/iOSStudy/Reachability.m | 469 ++ iOSStudy/iOSStudy/SecondViewController.h | 5 +- iOSStudy/iOSStudy/SecondViewController.m | 114 +- iOSStudy/iOSStudy/ThirdTableViewController.h | 4 +- iOSStudy/iOSStudy/ThirdTableViewController.m | 113 +- iOSStudy/iOSStudy/Tools/CoreDataUtils.h | 41 + iOSStudy/iOSStudy/Tools/CoreDataUtils.m | 108 + iOSStudy/iOSStudy/Tools/DBUtils.h | 31 + iOSStudy/iOSStudy/Tools/DBUtils.m | 89 + iOSStudy/iOSStudy/Tools/HttpVersionTools.h | 79 + iOSStudy/iOSStudy/Tools/HttpVersionTools.m | 204 + iOSStudy/iOSStudy/Tools/JsonTools.h | 13 + iOSStudy/iOSStudy/Tools/JsonTools.m | 24 + iOSStudy/iOSStudy/Tools/NetWorkTools.h | 29 + iOSStudy/iOSStudy/Tools/NetWorkTools.m | 109 + .../ViewColl/BlogDetailViewController.h | 13 + .../ViewColl/BlogDetailViewController.m | 40 + .../ViewModel/FirstViewControllerViewModel.h | 26 +- .../ViewModel/FirstViewControllerViewModel.m | 105 +- .../ViewModel/ThirdViewControllerViewModel.h | 35 +- .../iOSStudy.xcodeproj/project.pbxproj | 929 +++ .../contents.xcworkspacedata | 7 + .../contents.xcworkspacedata | 10 + .../ Resource/images/appicon/icon_120.png | Bin 0 -> 16782 bytes .../ Resource/images/appicon/icon_152.png | Bin 0 -> 13716 bytes .../ Resource/images/appicon/icon_180.png | Bin 0 -> 16237 bytes .../ Resource/images/appicon/icon_29.png | Bin 0 -> 2670 bytes .../ Resource/images/appicon/icon_40.png | Bin 0 -> 3764 bytes .../ Resource/images/appicon/icon_58.png | Bin 0 -> 5964 bytes .../ Resource/images/appicon/icon_76.png | Bin 0 -> 8549 bytes .../ Resource/images/appicon/icon_80.png | Bin 0 -> 9227 bytes .../ Resource/images/appicon/icon_87.png | Bin 0 -> 10300 bytes .../images/start_img/app_img_1024x768.png | Bin 0 -> 652016 bytes .../images/start_img/app_img_1136.png | Bin 0 -> 414145 bytes .../images/start_img/app_img_1536x2048.png | Bin 0 -> 1826887 bytes .../images/start_img/app_img_2048x1536.png | Bin 0 -> 1935584 bytes .../images/start_img/app_img_640.png | Bin 0 -> 357551 bytes .../images/start_img/app_img_768x1024.png | Bin 0 -> 631772 bytes .../images/start_img/app_img_iOS8.png | Bin 0 -> 1824111 bytes .../ Resource/images/tabbar/tabbar_blog.png | Bin 0 -> 1954 bytes .../images/tabbar/tabbar_blog@2x.png | Bin 0 -> 4464 bytes .../images/tabbar/tabbar_blog@3x.png | Bin 0 -> 6553 bytes .../images/tabbar/tabbar_setting.png | Bin 0 -> 1992 bytes .../images/tabbar/tabbar_setting@2x.png | Bin 0 -> 4908 bytes .../images/tabbar/tabbar_setting@3x.png | Bin 0 -> 7932 bytes .../ Resource/images/tabbar/tabbar_video.png | Bin 0 -> 1378 bytes .../images/tabbar/tabbar_video@2x.png | Bin 0 -> 2334 bytes .../images/tabbar/tabbar_video@3x.png | Bin 0 -> 2968 bytes .../ Resource/images/tabbar/tabbar_web.png | Bin 0 -> 2105 bytes .../ Resource/images/tabbar/tabbar_web@2x.png | Bin 0 -> 4837 bytes .../ Resource/images/tabbar/tabbar_web@3x.png | Bin 0 -> 7408 bytes .../iOSStudy/AddBlogTableViewController.h | 13 + .../iOSStudy/AddBlogTableViewController.m | 104 + iOSStudy/iOSStudy/iOSStudy/AppDelegate.h | 29 + iOSStudy/iOSStudy/iOSStudy/AppDelegate.m | 174 + .../iOSStudy/Base.lproj/LaunchScreen.xib | 33 + .../iOSStudy/Base.lproj/Main.storyboard | 673 ++ iOSStudy/iOSStudy/iOSStudy/Constants .h | 47 + .../iOSStudy/iOSStudy/FirstViewController.h | 19 + .../iOSStudy/iOSStudy/FirstViewController.m | 189 + .../AppIcon.appiconset/Contents.json | 80 + .../AppIcon.appiconset/icon_120-1.png | Bin 0 -> 16782 bytes .../AppIcon.appiconset/icon_120.png | Bin 0 -> 16782 bytes .../AppIcon.appiconset/icon_152.png | Bin 0 -> 13716 bytes .../AppIcon.appiconset/icon_180.png | Bin 0 -> 16237 bytes .../AppIcon.appiconset/icon_29.png | Bin 0 -> 2670 bytes .../AppIcon.appiconset/icon_40.png | Bin 0 -> 3764 bytes .../AppIcon.appiconset/icon_58-1.png | Bin 0 -> 5964 bytes .../AppIcon.appiconset/icon_58.png | Bin 0 -> 5964 bytes .../AppIcon.appiconset/icon_76.png | Bin 0 -> 8549 bytes .../AppIcon.appiconset/icon_80-1.png | Bin 0 -> 9227 bytes .../AppIcon.appiconset/icon_80.png | Bin 0 -> 9227 bytes .../AppIcon.appiconset/icon_87.png | Bin 0 -> 10300 bytes .../LaunchImage.launchimage/Contents.json | 57 + .../app_img_1024x768.png | Bin 0 -> 652016 bytes .../LaunchImage.launchimage/app_img_1136.png | Bin 0 -> 414145 bytes .../app_img_1536x2048.png | Bin 0 -> 1826887 bytes .../app_img_2048x1536.png | Bin 0 -> 1935584 bytes .../LaunchImage.launchimage/app_img_640.png | Bin 0 -> 357551 bytes .../app_img_768x1024.png | Bin 0 -> 631772 bytes .../first.imageset/Contents.json | 12 + .../Images.xcassets/first.imageset/first.pdf | Bin 0 -> 2465 bytes .../second.imageset/Contents.json | 12 + .../second.imageset/second.pdf | Bin 0 -> 2423 bytes iOSStudy/iOSStudy/iOSStudy/Info.plist | 57 + .../iOSStudy/MainTabBarViewController.h | 13 + .../iOSStudy/MainTabBarViewController.m | 37 + .../iOSStudy/iOSStudy/SecondViewController.h | 17 + .../iOSStudy/iOSStudy/SecondViewController.m | 137 + .../iOSStudy/SettingTableViewController.h | 13 + .../iOSStudy/SettingTableViewController.m | 105 + .../iOSStudy/ThirdTableViewController.h | 15 + .../iOSStudy/ThirdTableViewController.m | 145 + .../ViewModel/FirstViewControllerViewModel.h | 88 + .../ViewModel/FirstViewControllerViewModel.m | 321 + .../ViewModel/SecondViewControllerViewModel.h | 0 .../ViewModel/SecondViewControllerViewModel.m | 0 .../ViewModel/ThirdViewControllerViewModel.h | 45 + .../ViewModel/ThirdViewControllerViewModel.m | 0 .../iOSStudy/iOSStudy/WelcomeViewController.h | 13 + .../iOSStudy/iOSStudy/WelcomeViewController.m | 70 + .../iOSStudy.xcdatamodel/contents | 18 + iOSStudy/iOSStudy/iOSStudy/main.m | 16 + .../zh-Hans.lproj/LaunchScreen.strings | 6 + iOSStudy/iOSStudy/iOSStudyTests/Info.plist | 24 + .../iOSStudy/iOSStudyTests/iOSStudyTests.m | 40 + iOSStudy/iOSStudy/libs/UIImage+Resize.h | 37 + iOSStudy/iOSStudy/libs/UIImage+Resize.m | 153 + iOSStudy/iOSStudyJsonData/blogs.json | 1 + iOSStudy/iOSStudyJsonData/versions.json | 2 + iOSStudy/iOSStudyJsonData/videos.json | 2 + iOSStudy/iOSStudyJsonData/webs.json | 32 + 449 files changed, 44288 insertions(+), 216 deletions(-) create mode 100644 iOSStudy/.gitignore create mode 100644 iOSStudy/LICENSE create mode 100644 iOSStudy/README.md create mode 100644 iOSStudy/iOSStudy/Base/BaseTableViewCell.h create mode 100644 iOSStudy/iOSStudy/Base/BaseTableViewCell.m create mode 100644 iOSStudy/iOSStudy/Base/BaseViewController.h create mode 100644 iOSStudy/iOSStudy/Base/BaseViewController.m create mode 100644 iOSStudy/iOSStudy/Bean/FavouriteBean.h create mode 100644 iOSStudy/iOSStudy/Bean/FavouriteBean.m create mode 100644 iOSStudy/iOSStudy/Bean/blogBean/BlogBean.h create mode 100644 iOSStudy/iOSStudy/Bean/blogBean/BlogBean.m create mode 100644 iOSStudy/iOSStudy/Bean/blogBean/BlogJsonBean.h create mode 100644 iOSStudy/iOSStudy/Bean/blogBean/BlogJsonBean.m create mode 100644 iOSStudy/iOSStudy/Bean/versionBean/VersionBean.h create mode 100644 iOSStudy/iOSStudy/Bean/versionBean/VersionBean.m create mode 100644 iOSStudy/iOSStudy/Bean/videoBean/VideoBean.h create mode 100644 iOSStudy/iOSStudy/Bean/videoBean/VideoBean.m create mode 100644 iOSStudy/iOSStudy/Bean/webBean/WebBean.h create mode 100644 iOSStudy/iOSStudy/Bean/webBean/WebBean.m create mode 100644 iOSStudy/iOSStudy/Cell/VideoCell.h create mode 100644 iOSStudy/iOSStudy/Cell/VideoCell.m create mode 100644 iOSStudy/iOSStudy/Constants/EntityConstants.h create mode 100644 iOSStudy/iOSStudy/Constants/EntityConstants.m create mode 100644 iOSStudy/iOSStudy/Podfile create mode 100644 iOSStudy/iOSStudy/Podfile.lock create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworking.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/LICENSE create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/README.md create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h create mode 100644 iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/LICENSE.txt create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/README.markdown create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDB.h create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.h create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.m create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseAdditions.h create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseAdditions.m create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabasePool.h create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabasePool.m create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseQueue.h create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseQueue.m create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.h create mode 100644 iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.m create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworking.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDB.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabase.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabaseAdditions.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabasePool.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabaseQueue.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMResultSet.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefresh.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshBaseView.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshConst.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshFooterView.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshHeaderView.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIScrollView+MJExtension.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIScrollView+MJRefresh.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIView+MJExtension.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTKeyPathCoding.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTRuntimeExtensions.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTScope.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLJSONAdapter.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLManagedObjectAdapter.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLModel+NSCoding.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLModel.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLReflection.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLValueTransformer.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/Mantle.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSArray+MTLManipulationAdditions.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSDictionary+MTLManipulationAdditions.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSError+MTLModelException.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSObject+MTLComparisonAdditions.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSValueTransformer+MTLInversionAdditions.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/metamacros.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/NSData+ImageContentType.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDImageCache.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageCompat.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDecoder.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDownloader.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDownloaderOperation.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageManager.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageOperation.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImagePrefetcher.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIButton+WebCache.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImage+GIF.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImage+MultiFormat.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImageView+HighlightedWebCache.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImageView+WebCache.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIView+WebCacheOperation.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SVProgressHUD/SVIndefiniteAnimatedView.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SVProgressHUD/SVProgressHUD.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVModalWebViewController.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewController.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivity.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivityChrome.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivitySafari.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/NSMutableArray+SWUtilityButtons.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWCellScrollView.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWLongPressGestureRecognizer.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWTableViewCell.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWUtilityButtonTapGestureRecognizer.h create mode 120000 iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWUtilityButtonView.h create mode 100644 iOSStudy/iOSStudy/Pods/MJRefresh/LICENSE create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefresh.bundle/arrow@2x.png create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefresh.h create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.h create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.m create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.h create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.m create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.h create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.m create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.h create mode 100755 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.m create mode 100644 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.h create mode 100644 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.m create mode 100644 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.h create mode 100644 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.m create mode 100644 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.h create mode 100644 iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.m create mode 100644 iOSStudy/iOSStudy/Pods/MJRefresh/README.md create mode 100644 iOSStudy/iOSStudy/Pods/Manifest.lock create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/LICENSE.md create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLJSONAdapter.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLJSONAdapter.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLManagedObjectAdapter.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLManagedObjectAdapter.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel+NSCoding.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel+NSCoding.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLReflection.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLReflection.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLValueTransformer.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLValueTransformer.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/Mantle.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSArray+MTLManipulationAdditions.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSArray+MTLManipulationAdditions.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSError+MTLModelException.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSError+MTLModelException.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSObject+MTLComparisonAdditions.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSObject+MTLComparisonAdditions.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTKeyPathCoding.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTRuntimeExtensions.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTRuntimeExtensions.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTScope.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTScope.m create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/metamacros.h create mode 100644 iOSStudy/iOSStudy/Pods/Mantle/README.md create mode 100644 iOSStudy/iOSStudy/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/LICENSE create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/README.md create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDImageCache.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDImageCache.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageManager.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageManager.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m create mode 100755 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+GIF.h create mode 100755 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+GIF.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h create mode 100644 iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/LICENSE.txt create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/README.md create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h create mode 100644 iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/LICENSE.txt create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/README.md create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVModalWebViewController.h create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVModalWebViewController.m create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack.png create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext.png create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.h create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.m create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad.png create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.h create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/SVWebViewControllerActivity.h create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/SVWebViewControllerActivity.m create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad.png create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.h create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.m create mode 100644 iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari@2x.png create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/LICENCE create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/README.md create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.h create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.m create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWCellScrollView.h create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWCellScrollView.m create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.h create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.m create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWTableViewCell.h create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWTableViewCell.m create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.h create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.m create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonView.h create mode 100644 iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonView.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-Private.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-dummy.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-prefix.pch create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-Private.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-dummy.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-prefix.pch create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-Private.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-dummy.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-prefix.pch create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-Private.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-dummy.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-prefix.pch create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-Private.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-dummy.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-prefix.pch create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-Private.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-dummy.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-prefix.pch create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-Private.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-dummy.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-prefix.pch create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-Private.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-dummy.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-prefix.pch create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-acknowledgements.plist create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-dummy.m create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-environment.h create mode 100755 iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-resources.sh create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods.debug.xcconfig create mode 100644 iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods.release.xcconfig create mode 100755 iOSStudy/iOSStudy/Reachability.h create mode 100755 iOSStudy/iOSStudy/Reachability.m create mode 100644 iOSStudy/iOSStudy/Tools/CoreDataUtils.h create mode 100644 iOSStudy/iOSStudy/Tools/CoreDataUtils.m create mode 100644 iOSStudy/iOSStudy/Tools/DBUtils.h create mode 100644 iOSStudy/iOSStudy/Tools/DBUtils.m create mode 100644 iOSStudy/iOSStudy/Tools/HttpVersionTools.h create mode 100644 iOSStudy/iOSStudy/Tools/HttpVersionTools.m create mode 100644 iOSStudy/iOSStudy/Tools/JsonTools.h create mode 100644 iOSStudy/iOSStudy/Tools/JsonTools.m create mode 100644 iOSStudy/iOSStudy/Tools/NetWorkTools.h create mode 100644 iOSStudy/iOSStudy/Tools/NetWorkTools.m create mode 100644 iOSStudy/iOSStudy/ViewColl/BlogDetailViewController.h create mode 100644 iOSStudy/iOSStudy/ViewColl/BlogDetailViewController.m create mode 100644 iOSStudy/iOSStudy/iOSStudy.xcodeproj/project.pbxproj create mode 100644 iOSStudy/iOSStudy/iOSStudy.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 iOSStudy/iOSStudy/iOSStudy.xcworkspace/contents.xcworkspacedata create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_120.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_152.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_180.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_29.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_40.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_58.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_76.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_80.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_87.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/start_img/app_img_1024x768.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/start_img/app_img_1136.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/start_img/app_img_1536x2048.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/start_img/app_img_2048x1536.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/start_img/app_img_640.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/start_img/app_img_768x1024.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/start_img/app_img_iOS8.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_blog.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_blog@2x.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_blog@3x.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_setting.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_setting@2x.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_setting@3x.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_video.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_video@2x.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_video@3x.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_web.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_web@2x.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/ Resource/images/tabbar/tabbar_web@3x.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/AddBlogTableViewController.h create mode 100644 iOSStudy/iOSStudy/iOSStudy/AddBlogTableViewController.m create mode 100644 iOSStudy/iOSStudy/iOSStudy/AppDelegate.h create mode 100644 iOSStudy/iOSStudy/iOSStudy/AppDelegate.m create mode 100644 iOSStudy/iOSStudy/iOSStudy/Base.lproj/LaunchScreen.xib create mode 100644 iOSStudy/iOSStudy/iOSStudy/Base.lproj/Main.storyboard create mode 100644 iOSStudy/iOSStudy/iOSStudy/Constants .h create mode 100644 iOSStudy/iOSStudy/iOSStudy/FirstViewController.h create mode 100644 iOSStudy/iOSStudy/iOSStudy/FirstViewController.m create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_120-1.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_120.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_152.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_180.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_29.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_40.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_58-1.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_58.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_76.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_80-1.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_80.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/AppIcon.appiconset/icon_87.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/LaunchImage.launchimage/app_img_1024x768.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/LaunchImage.launchimage/app_img_1136.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/LaunchImage.launchimage/app_img_1536x2048.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/LaunchImage.launchimage/app_img_2048x1536.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/LaunchImage.launchimage/app_img_640.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/LaunchImage.launchimage/app_img_768x1024.png create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/first.imageset/Contents.json create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/first.imageset/first.pdf create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/second.imageset/Contents.json create mode 100644 iOSStudy/iOSStudy/iOSStudy/Images.xcassets/second.imageset/second.pdf create mode 100644 iOSStudy/iOSStudy/iOSStudy/Info.plist create mode 100644 iOSStudy/iOSStudy/iOSStudy/MainTabBarViewController.h create mode 100644 iOSStudy/iOSStudy/iOSStudy/MainTabBarViewController.m create mode 100644 iOSStudy/iOSStudy/iOSStudy/SecondViewController.h create mode 100644 iOSStudy/iOSStudy/iOSStudy/SecondViewController.m create mode 100644 iOSStudy/iOSStudy/iOSStudy/SettingTableViewController.h create mode 100644 iOSStudy/iOSStudy/iOSStudy/SettingTableViewController.m create mode 100644 iOSStudy/iOSStudy/iOSStudy/ThirdTableViewController.h create mode 100644 iOSStudy/iOSStudy/iOSStudy/ThirdTableViewController.m create mode 100644 iOSStudy/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h create mode 100644 iOSStudy/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m rename iOSStudy/iOSStudy/{ => iOSStudy}/ViewModel/SecondViewControllerViewModel.h (100%) rename iOSStudy/iOSStudy/{ => iOSStudy}/ViewModel/SecondViewControllerViewModel.m (100%) create mode 100644 iOSStudy/iOSStudy/iOSStudy/ViewModel/ThirdViewControllerViewModel.h rename iOSStudy/iOSStudy/{ => iOSStudy}/ViewModel/ThirdViewControllerViewModel.m (100%) create mode 100644 iOSStudy/iOSStudy/iOSStudy/WelcomeViewController.h create mode 100644 iOSStudy/iOSStudy/iOSStudy/WelcomeViewController.m create mode 100644 iOSStudy/iOSStudy/iOSStudy/iOSStudy.xcdatamodeld/iOSStudy.xcdatamodel/contents create mode 100644 iOSStudy/iOSStudy/iOSStudy/main.m create mode 100644 iOSStudy/iOSStudy/iOSStudy/zh-Hans.lproj/LaunchScreen.strings create mode 100644 iOSStudy/iOSStudy/iOSStudyTests/Info.plist create mode 100644 iOSStudy/iOSStudy/iOSStudyTests/iOSStudyTests.m create mode 100755 iOSStudy/iOSStudy/libs/UIImage+Resize.h create mode 100755 iOSStudy/iOSStudy/libs/UIImage+Resize.m create mode 100644 iOSStudy/iOSStudyJsonData/blogs.json create mode 100644 iOSStudy/iOSStudyJsonData/versions.json create mode 100644 iOSStudy/iOSStudyJsonData/videos.json create mode 100644 iOSStudy/iOSStudyJsonData/webs.json diff --git a/iOSStudy/.gitignore b/iOSStudy/.gitignore new file mode 100644 index 0000000..a3cd143 --- /dev/null +++ b/iOSStudy/.gitignore @@ -0,0 +1,26 @@ +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# +# Pods/ diff --git a/iOSStudy/Cell/VideoCell.h b/iOSStudy/Cell/VideoCell.h index bfb3b7f..dc596e1 100644 --- a/iOSStudy/Cell/VideoCell.h +++ b/iOSStudy/Cell/VideoCell.h @@ -7,8 +7,8 @@ // #import "BaseTableViewCell.h" - -@interface VideoCell : BaseTableViewCell +#import +@interface VideoCell : SWTableViewCell @property (weak, nonatomic) IBOutlet UIImageView *videoImageView; @property (weak, nonatomic) IBOutlet UILabel *videoTitle; @property (weak, nonatomic) IBOutlet UILabel *videoSubTitle; diff --git a/iOSStudy/LICENSE b/iOSStudy/LICENSE new file mode 100644 index 0000000..fd0bea5 --- /dev/null +++ b/iOSStudy/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 陈冠东 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/iOSStudy/README.md b/iOSStudy/README.md new file mode 100644 index 0000000..5e7dc73 --- /dev/null +++ b/iOSStudy/README.md @@ -0,0 +1,2 @@ +# iOSStudy +iOSStudy是一个开源的iOS应用内容是致力于帮助iOS开发者找到适合自己的学习资源 diff --git a/iOSStudy/Tools/HttpVersionTools.m b/iOSStudy/Tools/HttpVersionTools.m index 668936b..087f8b6 100644 --- a/iOSStudy/Tools/HttpVersionTools.m +++ b/iOSStudy/Tools/HttpVersionTools.m @@ -89,7 +89,7 @@ +(void)saveNowHttpVersion:(NSString*)url version:(NSString*)version{ //当数据存在事后执行更新操作 //[CoreDataUtils dataisExist:url inTable:CD_VersionsEntity tableRowName:@"url"] - NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"%@ = %@",@"url", url]; + NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"url = %@", url]; if ( [CoreDataUtils dataisExistTableName:CD_VersionsEntity withPredicate:urlPredicate] ) diff --git a/iOSStudy/iOSStudy/Base.lproj/Main.storyboard b/iOSStudy/iOSStudy/Base.lproj/Main.storyboard index 0276cb7..eeca2c6 100644 --- a/iOSStudy/iOSStudy/Base.lproj/Main.storyboard +++ b/iOSStudy/iOSStudy/Base.lproj/Main.storyboard @@ -31,13 +31,13 @@ @@ -209,7 +209,7 @@ - + @@ -218,13 +218,13 @@ @@ -356,7 +356,7 @@ - + @@ -436,7 +436,7 @@ - + @@ -450,7 +450,7 @@ @@ -465,7 +465,7 @@ @@ -484,7 +484,7 @@ @@ -499,7 +499,7 @@ @@ -518,7 +518,7 @@ @@ -533,7 +533,7 @@ diff --git a/iOSStudy/iOSStudy/Base/BaseTableViewCell.h b/iOSStudy/iOSStudy/Base/BaseTableViewCell.h new file mode 100644 index 0000000..f9a4db6 --- /dev/null +++ b/iOSStudy/iOSStudy/Base/BaseTableViewCell.h @@ -0,0 +1,13 @@ +// +// BaseTableViewCell.h +// iOSStudy +// +// Created by chenguandong on 15/2/22. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +@interface BaseTableViewCell : UITableViewCell + +@end diff --git a/iOSStudy/iOSStudy/Base/BaseTableViewCell.m b/iOSStudy/iOSStudy/Base/BaseTableViewCell.m new file mode 100644 index 0000000..bcb9253 --- /dev/null +++ b/iOSStudy/iOSStudy/Base/BaseTableViewCell.m @@ -0,0 +1,24 @@ +// +// BaseTableViewCell.m +// iOSStudy +// +// Created by chenguandong on 15/2/22. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "BaseTableViewCell.h" + +@implementation BaseTableViewCell + +- (void)awakeFromNib { + // Initialization code +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + + +@end diff --git a/iOSStudy/iOSStudy/Base/BaseViewController.h b/iOSStudy/iOSStudy/Base/BaseViewController.h new file mode 100644 index 0000000..7b5c39a --- /dev/null +++ b/iOSStudy/iOSStudy/Base/BaseViewController.h @@ -0,0 +1,13 @@ +// +// BaseViewController.h +// iOSStudy +// +// Created by chenguandong on 15/1/29. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +@interface BaseViewController : UIViewController + +@end diff --git a/iOSStudy/iOSStudy/Base/BaseViewController.m b/iOSStudy/iOSStudy/Base/BaseViewController.m new file mode 100644 index 0000000..c6773d2 --- /dev/null +++ b/iOSStudy/iOSStudy/Base/BaseViewController.m @@ -0,0 +1,42 @@ +// +// BaseViewController.m +// iOSStudy +// +// Created by chenguandong on 15/1/29. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "BaseViewController.h" + +@interface BaseViewController () + +@end + +@implementation BaseViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. +} + +-(void)viewWillAppear:(BOOL)animated{ + [super viewWillAppear:YES]; + + +} +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/iOSStudy/iOSStudy/Bean/FavouriteBean.h b/iOSStudy/iOSStudy/Bean/FavouriteBean.h new file mode 100644 index 0000000..5ebd56e --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/FavouriteBean.h @@ -0,0 +1,38 @@ +// +// FavouriteBean.h +// iOSStudy +// +// Created by chenguandong on 15/3/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +typedef NS_ENUM(NSInteger, FAVOURITE_TYPE) { + BLOG_TYPE = 1, + WEB_TYPE = 2, + VIDEO_TYPE = 3 +}; + +@interface FavouriteBean : NSObject +/** + * 标题 + */ +@property(nonatomic,copy)NSString *title; +/** + * 描述 + */ +@property(nonatomic,copy)NSString *subtitle; +/** + * 图片地址 + */ +@property(nonatomic,copy)NSString *image_name; +/** + * 网络连接 + */ +@property(nonatomic,copy)NSString *url; +/** + * 类型 1 收藏博客 2 收藏网站 3 收藏视频 11,持久化博客 22,持久化网站 33,持久化视频 + */ +@property(nonatomic,copy)NSString* type; +@end diff --git a/iOSStudy/iOSStudy/Bean/FavouriteBean.m b/iOSStudy/iOSStudy/Bean/FavouriteBean.m new file mode 100644 index 0000000..e254b44 --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/FavouriteBean.m @@ -0,0 +1,13 @@ +// +// FavouriteBean.m +// iOSStudy +// +// Created by chenguandong on 15/3/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "FavouriteBean.h" + +@implementation FavouriteBean + +@end diff --git a/iOSStudy/iOSStudy/Bean/blogBean/BlogBean.h b/iOSStudy/iOSStudy/Bean/blogBean/BlogBean.h new file mode 100644 index 0000000..5e4d6ae --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/blogBean/BlogBean.h @@ -0,0 +1,43 @@ +// +// BlogBean.h +// iOSStudy +// +// Created by chenguandong on 15/2/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import +#import +#import +@interface BlogBean : MTLModel +/** + * 博客名字 + */ +@property(nonatomic,copy)NSString*name; +/** + * 博客标题 + */ +@property(nonatomic,copy)NSString*title; +/** + * 博客描述 + */ +@property(nonatomic,copy)NSString*subTitle; +/** + * 博客图片 + */ +@property(nonatomic,copy)NSString*image; +/** + * 博客地址 + */ +@property(nonatomic,copy)NSString*url; +/** + * 博客RSS地址 + */ +@property(nonatomic,copy)NSString*rssUrl; +/** + * 博客地址 + */ +@property(nonatomic,copy)NSString*date; + +@property(nonatomic,copy)NSString*version; +@end diff --git a/iOSStudy/iOSStudy/Bean/blogBean/BlogBean.m b/iOSStudy/iOSStudy/Bean/blogBean/BlogBean.m new file mode 100644 index 0000000..c0152c9 --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/blogBean/BlogBean.m @@ -0,0 +1,27 @@ +// +// BlogBean.m +// iOSStudy +// +// Created by chenguandong on 15/2/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "BlogBean.h" + +@implementation BlogBean ++ (NSDictionary *)JSONKeyPathsByPropertyKey{ + + + return @{ + @"version":@"version", + @"name": @"name", + @"title": @"title", + @"subTitle": @"subTitle", + @"image": @"image", + @"url": @"url", + @"rssUrl": @"rssUrl", + @"date": @"date" + + }; +} +@end diff --git a/iOSStudy/iOSStudy/Bean/blogBean/BlogJsonBean.h b/iOSStudy/iOSStudy/Bean/blogBean/BlogJsonBean.h new file mode 100644 index 0000000..c8b122e --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/blogBean/BlogJsonBean.h @@ -0,0 +1,15 @@ +// +// BlogJsonBean.h +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import +#import +#import +@interface BlogJsonBean : MTLModel +@property(nonatomic,copy)NSString *version; +@property(nonatomic,strong)NSArray *bloglists; +@end diff --git a/iOSStudy/iOSStudy/Bean/blogBean/BlogJsonBean.m b/iOSStudy/iOSStudy/Bean/blogBean/BlogJsonBean.m new file mode 100644 index 0000000..11ecbd3 --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/blogBean/BlogJsonBean.m @@ -0,0 +1,22 @@ +// +// BlogJsonBean.m +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "BlogJsonBean.h" + +@implementation BlogJsonBean + ++ (NSDictionary *)JSONKeyPathsByPropertyKey{ + + + return @{ + @"version": @"version", + @"bloglists": @"bloglists" + }; +} + +@end diff --git a/iOSStudy/iOSStudy/Bean/versionBean/VersionBean.h b/iOSStudy/iOSStudy/Bean/versionBean/VersionBean.h new file mode 100644 index 0000000..8866057 --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/versionBean/VersionBean.h @@ -0,0 +1,23 @@ +// +// VersionBean.h +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import +#import +#import +@interface VersionBean : MTLModel +/** + * 当前请求地址的URL + */ +@property(nonatomic,copy)NSString *url; + +/** + * 当前请求地址URL版本号 + */ +@property(nonatomic,copy)NSString *urlVersion; + +@end diff --git a/iOSStudy/iOSStudy/Bean/versionBean/VersionBean.m b/iOSStudy/iOSStudy/Bean/versionBean/VersionBean.m new file mode 100644 index 0000000..7c7641c --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/versionBean/VersionBean.m @@ -0,0 +1,24 @@ +// +// VersionBean.m +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "VersionBean.h" + +@implementation VersionBean + + ++ (NSDictionary *)JSONKeyPathsByPropertyKey{ + + + return @{ + @"url": @"url", + @"urlVersion": @"urlVersion" + }; +} + + +@end diff --git a/iOSStudy/iOSStudy/Bean/videoBean/VideoBean.h b/iOSStudy/iOSStudy/Bean/videoBean/VideoBean.h new file mode 100644 index 0000000..c31da43 --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/videoBean/VideoBean.h @@ -0,0 +1,16 @@ +// +// VideoBean.h +// iOSStudy +// +// Created by chenguandong on 15/2/22. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "WebBean.h" + +@interface VideoBean : WebBean +/** + * zh 中文 us 英文 + */ +@property(nonatomic,copy)NSString *videoLanguageType; +@end diff --git a/iOSStudy/iOSStudy/Bean/videoBean/VideoBean.m b/iOSStudy/iOSStudy/Bean/videoBean/VideoBean.m new file mode 100644 index 0000000..06d43ef --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/videoBean/VideoBean.m @@ -0,0 +1,20 @@ +// +// VideoBean.m +// iOSStudy +// +// Created by chenguandong on 15/2/22. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "VideoBean.h" + +@implementation VideoBean + ++ (NSDictionary *)JSONKeyPathsByPropertyKey{ + + [super JSONKeyPathsByPropertyKey]; + return @{ + @"videoLanguageType": @"videoLanguageType", + }; +} +@end diff --git a/iOSStudy/iOSStudy/Bean/webBean/WebBean.h b/iOSStudy/iOSStudy/Bean/webBean/WebBean.h new file mode 100644 index 0000000..979b753 --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/webBean/WebBean.h @@ -0,0 +1,33 @@ +// +// WebBean.h +// iOSStudy +// +// Created by chenguandong on 15/2/17. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import +#import +#import +@interface WebBean : MTLModel +/** + * 网站名字 + */ +@property(nonatomic,copy)NSString*name; +/** + * 网站标题 + */ +@property(nonatomic,copy)NSString*title; +/** + * 网站描述 + */ +@property(nonatomic,copy)NSString*subTitle; +/** + * 网站图片 + */ +@property(nonatomic,copy)NSString*webImage; +/** + * 网站地址 + */ +@property(nonatomic,copy)NSString*webUrl; +@end diff --git a/iOSStudy/iOSStudy/Bean/webBean/WebBean.m b/iOSStudy/iOSStudy/Bean/webBean/WebBean.m new file mode 100644 index 0000000..2adc3ea --- /dev/null +++ b/iOSStudy/iOSStudy/Bean/webBean/WebBean.m @@ -0,0 +1,25 @@ +// +// WebBean.m +// iOSStudy +// +// Created by chenguandong on 15/2/17. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "WebBean.h" + +@implementation WebBean + ++ (NSDictionary *)JSONKeyPathsByPropertyKey{ + + + return @{ + @"name": @"name", + @"title": @"title", + @"subTitle": @"subTitile", + @"webImage": @"webImage", + @"webUrl": @"webUrl" + }; +} + +@end diff --git a/iOSStudy/iOSStudy/Cell/VideoCell.h b/iOSStudy/iOSStudy/Cell/VideoCell.h new file mode 100644 index 0000000..bfb3b7f --- /dev/null +++ b/iOSStudy/iOSStudy/Cell/VideoCell.h @@ -0,0 +1,16 @@ +// +// VideoCell.h +// iOSStudy +// +// Created by chenguandong on 15/2/24. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "BaseTableViewCell.h" + +@interface VideoCell : BaseTableViewCell +@property (weak, nonatomic) IBOutlet UIImageView *videoImageView; +@property (weak, nonatomic) IBOutlet UILabel *videoTitle; +@property (weak, nonatomic) IBOutlet UILabel *videoSubTitle; + +@end diff --git a/iOSStudy/iOSStudy/Cell/VideoCell.m b/iOSStudy/iOSStudy/Cell/VideoCell.m new file mode 100644 index 0000000..8d14b02 --- /dev/null +++ b/iOSStudy/iOSStudy/Cell/VideoCell.m @@ -0,0 +1,21 @@ +// +// VideoCell.m +// iOSStudy +// +// Created by chenguandong on 15/2/24. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "VideoCell.h" + +@implementation VideoCell + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect { + // Drawing code +} +*/ + +@end diff --git a/iOSStudy/iOSStudy/Constants/EntityConstants.h b/iOSStudy/iOSStudy/Constants/EntityConstants.h new file mode 100644 index 0000000..97defe3 --- /dev/null +++ b/iOSStudy/iOSStudy/Constants/EntityConstants.h @@ -0,0 +1,15 @@ +// +// EntityConstants.h +// iOSStudy +// +// Created by chenguandong on 15/4/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +extern NSString *const FavouriteBean_title; +extern NSString *const FavouriteBean_subtitle; +extern NSString *const FavouriteBean_image_name; +extern NSString *const FavouriteBean_type; +extern NSString *const FavouriteBean_url; diff --git a/iOSStudy/iOSStudy/Constants/EntityConstants.m b/iOSStudy/iOSStudy/Constants/EntityConstants.m new file mode 100644 index 0000000..dfcdd0d --- /dev/null +++ b/iOSStudy/iOSStudy/Constants/EntityConstants.m @@ -0,0 +1,15 @@ +// +// EntityConstants.m +// iOSStudy +// +// Created by chenguandong on 15/4/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "EntityConstants.h" + +NSString *const FavouriteBean_title = @"title"; +NSString *const FavouriteBean_subtitle = @"subtitle"; +NSString *const FavouriteBean_image_name = @"image_name"; +NSString *const FavouriteBean_type = @"type"; +NSString *const FavouriteBean_url = @"url"; diff --git a/iOSStudy/iOSStudy/FirstViewController.h b/iOSStudy/iOSStudy/FirstViewController.h index 31f335a..0821fd7 100644 --- a/iOSStudy/iOSStudy/FirstViewController.h +++ b/iOSStudy/iOSStudy/FirstViewController.h @@ -13,6 +13,12 @@ @interface FirstViewController : BaseViewController @property (weak, nonatomic) IBOutlet UITableView *tableView; @property(nonatomic,strong)FirstViewControllerViewModel *viewModel; +@property(nonatomic,copy)NSString *favouriteType ; +-(void)initViewData; +/** + * 停止UITableView刷新 + */ +-(void)stopTableRefreshing; @end diff --git a/iOSStudy/iOSStudy/FirstViewController.m b/iOSStudy/iOSStudy/FirstViewController.m index 9f39add..4e15f6b 100644 --- a/iOSStudy/iOSStudy/FirstViewController.m +++ b/iOSStudy/iOSStudy/FirstViewController.m @@ -27,16 +27,22 @@ - (void)viewDidLoad { [super viewDidLoad]; + + _tableView.delegate = self; _tableView.dataSource = self; + [self initViewData]; +} - _viewModel = [[FirstViewControllerViewModel alloc]init]; +-(void)initViewData{ + _favouriteType = TYPE_BLOG_FAVOURITE_TYPE; + _viewModel = [[FirstViewControllerViewModel alloc]init]; [self.tableView addHeaderWithCallback:^{ - + [_viewModel getDate:^{ [_tableView reloadData]; @@ -44,22 +50,19 @@ - (void)viewDidLoad { [self stopTableRefreshing]; } modelDataReload:^{ [_tableView reloadData]; - } modelDataErrors:^{ [self stopTableRefreshing]; } modelDataIsNetworking:^(BOOL isNetWorking) { [self stopTableRefreshing]; - }]; + } httpAdress:Address_blogs dataType:TYPE_BLOG_SIMPLE_TYPE jsonClass:[BlogBean class]]; + + }]; [self.tableView headerBeginRefreshing]; - - } - - /** * 停止UITableView刷新 */ @@ -160,7 +163,7 @@ - (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityBut NSIndexPath *indexPath = [_tableView indexPathForCell:cell]; - [_viewModel saveFavourite:indexPath]; + [_viewModel saveFavourite:indexPath favouriteType:_favouriteType]; [cell hideUtilityButtonsAnimated:YES]; @@ -172,8 +175,6 @@ - (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityBut } - - -(void)dealloc{ _tableView.delegate = nil; _tableView.dataSource = nil; diff --git a/iOSStudy/iOSStudy/Podfile b/iOSStudy/iOSStudy/Podfile new file mode 100644 index 0000000..c770198 --- /dev/null +++ b/iOSStudy/iOSStudy/Podfile @@ -0,0 +1,9 @@ +platform :ios, '7.0' +pod "AFNetworking", "~> 2.0" +pod "SDWebImage" +pod 'FMDB' +pod 'Mantle' +pod 'SVProgressHUD' +pod 'SVWebViewController' +pod 'MJRefresh' +pod 'SWTableViewCell', '~> 0.3.7' diff --git a/iOSStudy/iOSStudy/Podfile.lock b/iOSStudy/iOSStudy/Podfile.lock new file mode 100644 index 0000000..ee61b81 --- /dev/null +++ b/iOSStudy/iOSStudy/Podfile.lock @@ -0,0 +1,59 @@ +PODS: + - AFNetworking (2.5.1): + - AFNetworking/NSURLConnection (= 2.5.1) + - AFNetworking/NSURLSession (= 2.5.1) + - AFNetworking/Reachability (= 2.5.1) + - AFNetworking/Security (= 2.5.1) + - AFNetworking/Serialization (= 2.5.1) + - AFNetworking/UIKit (= 2.5.1) + - AFNetworking/NSURLConnection (2.5.1): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/NSURLSession (2.5.1): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/Reachability (2.5.1) + - AFNetworking/Security (2.5.1) + - AFNetworking/Serialization (2.5.1) + - AFNetworking/UIKit (2.5.1): + - AFNetworking/NSURLConnection + - AFNetworking/NSURLSession + - FMDB (2.5): + - FMDB/standard (= 2.5) + - FMDB/common (2.5) + - FMDB/standard (2.5): + - FMDB/common + - Mantle (1.5.4): + - Mantle/extobjc (= 1.5.4) + - Mantle/extobjc (1.5.4) + - MJRefresh (0.0.1) + - SDWebImage (3.7.1): + - SDWebImage/Core (= 3.7.1) + - SDWebImage/Core (3.7.1) + - SVProgressHUD (1.1.2) + - SVWebViewController (1.0) + - SWTableViewCell (0.3.7) + +DEPENDENCIES: + - AFNetworking (~> 2.0) + - FMDB + - Mantle + - MJRefresh + - SDWebImage + - SVProgressHUD + - SVWebViewController + - SWTableViewCell (~> 0.3.7) + +SPEC CHECKSUMS: + AFNetworking: 8bee59492a6ff15d69130efa4d0dc67e0094a52a + FMDB: 0efa188cf0dd1ce82c27a478cd5f5fa245308677 + Mantle: d5fbaf30fbc58031223af13812c060e15934a1fe + MJRefresh: 02638d90855109026754562b7507e5c5eabfcc65 + SDWebImage: 116e88633b5b416ea0ca4b334a4ac59cf72dd38d + SVProgressHUD: da7a49e789af645d9279ffbca62318945a832438 + SVWebViewController: fbf917baa92744c54cfb89a52a4c056e409973a4 + SWTableViewCell: 25de71898e3fcd11cf75707ef90245acf990ec03 + +COCOAPODS: 0.35.0 diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h new file mode 100644 index 0000000..c1e37f6 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.h @@ -0,0 +1,67 @@ +// AFHTTPRequestOperation.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "AFURLConnectionOperation.h" + +/** + `AFHTTPRequestOperation` is a subclass of `AFURLConnectionOperation` for requests using the HTTP or HTTPS protocols. It encapsulates the concept of acceptable status codes and content types, which determine the success or failure of a request. + */ +@interface AFHTTPRequestOperation : AFURLConnectionOperation + +///------------------------------------------------ +/// @name Getting HTTP URL Connection Information +///------------------------------------------------ + +/** + The last HTTP response received by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSHTTPURLResponse *response; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an AFHTTPResponse serializer, which uses the raw data as its response object. The serializer validates the status code to be in the `2XX` range, denoting success. If the response serializer generates an error in `-responseObjectForResponse:data:error:`, the `failure` callback of the session task or request operation will be executed; otherwise, the `success` callback will be executed. + + @warning `responseSerializer` must not be `nil`. Setting a response serializer will clear out any cached value + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +/** + An object constructed by the `responseSerializer` from the response and response data. Returns `nil` unless the operation `isFinished`, has a `response`, and has `responseData` with non-zero content length. If an error occurs during serialization, `nil` will be returned, and the `error` property will be populated with the serialization error. + */ +@property (readonly, nonatomic, strong) id responseObject; + +///----------------------------------------------------------- +/// @name Setting Completion Block Success / Failure Callbacks +///----------------------------------------------------------- + +/** + Sets the `completionBlock` property with a block that executes either the specified success or failure block, depending on the state of the request on completion. If `error` returns a value, which can be caused by an unacceptable status code or content type, then `failure` is executed. Otherwise, `success` is executed. + + This method should be overridden in subclasses in order to specify the response object passed into the success block. + + @param success The block to be executed on the completion of a successful request. This block has no return value and takes two arguments: the receiver operation and the object constructed from the response data of the request. + @param failure The block to be executed on the completion of an unsuccessful request. This block has no return value and takes two arguments: the receiver operation and the error that occurred during the request. + */ +- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +@end diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m new file mode 100644 index 0000000..e536f5d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperation.m @@ -0,0 +1,206 @@ +// AFHTTPRequestOperation.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFHTTPRequestOperation.h" + +static dispatch_queue_t http_request_operation_processing_queue() { + static dispatch_queue_t af_http_request_operation_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_http_request_operation_processing_queue = dispatch_queue_create("com.alamofire.networking.http-request.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return af_http_request_operation_processing_queue; +} + +static dispatch_group_t http_request_operation_completion_group() { + static dispatch_group_t af_http_request_operation_completion_group; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_http_request_operation_completion_group = dispatch_group_create(); + }); + + return af_http_request_operation_completion_group; +} + +#pragma mark - + +@interface AFURLConnectionOperation () +@property (readwrite, nonatomic, strong) NSURLRequest *request; +@property (readwrite, nonatomic, strong) NSURLResponse *response; +@end + +@interface AFHTTPRequestOperation () +@property (readwrite, nonatomic, strong) NSHTTPURLResponse *response; +@property (readwrite, nonatomic, strong) id responseObject; +@property (readwrite, nonatomic, strong) NSError *responseSerializationError; +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@end + +@implementation AFHTTPRequestOperation +@dynamic lock; + +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest { + self = [super initWithRequest:urlRequest]; + if (!self) { + return nil; + } + + self.responseSerializer = [AFHTTPResponseSerializer serializer]; + + return self; +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + NSParameterAssert(responseSerializer); + + [self.lock lock]; + _responseSerializer = responseSerializer; + self.responseObject = nil; + self.responseSerializationError = nil; + [self.lock unlock]; +} + +- (id)responseObject { + [self.lock lock]; + if (!_responseObject && [self isFinished] && !self.error) { + NSError *error = nil; + self.responseObject = [self.responseSerializer responseObjectForResponse:self.response data:self.responseData error:&error]; + if (error) { + self.responseSerializationError = error; + } + } + [self.lock unlock]; + + return _responseObject; +} + +- (NSError *)error { + if (_responseSerializationError) { + return _responseSerializationError; + } else { + return [super error]; + } +} + +#pragma mark - AFHTTPRequestOperation + +- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + // completionBlock is manually nilled out in AFURLConnectionOperation to break the retain cycle. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-retain-cycles" +#pragma clang diagnostic ignored "-Wgnu" + self.completionBlock = ^{ + if (self.completionGroup) { + dispatch_group_enter(self.completionGroup); + } + + dispatch_async(http_request_operation_processing_queue(), ^{ + if (self.error) { + if (failure) { + dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + id responseObject = self.responseObject; + if (self.error) { + if (failure) { + dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(self, self.error); + }); + } + } else { + if (success) { + dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{ + success(self, responseObject); + }); + } + } + } + + if (self.completionGroup) { + dispatch_group_leave(self.completionGroup); + } + }); + }; +#pragma clang diagnostic pop +} + +#pragma mark - AFURLRequestOperation + +- (void)pause { + [super pause]; + + u_int64_t offset = 0; + if ([self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey]) { + offset = [(NSNumber *)[self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey] unsignedLongLongValue]; + } else { + offset = [(NSData *)[self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey] length]; + } + + NSMutableURLRequest *mutableURLRequest = [self.request mutableCopy]; + if ([self.response respondsToSelector:@selector(allHeaderFields)] && [[self.response allHeaderFields] valueForKey:@"ETag"]) { + [mutableURLRequest setValue:[[self.response allHeaderFields] valueForKey:@"ETag"] forHTTPHeaderField:@"If-Range"]; + } + [mutableURLRequest setValue:[NSString stringWithFormat:@"bytes=%llu-", offset] forHTTPHeaderField:@"Range"]; + self.request = mutableURLRequest; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:self.responseSerializer forKey:NSStringFromSelector(@selector(responseSerializer))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPRequestOperation *operation = [super copyWithZone:zone]; + + operation.responseSerializer = [self.responseSerializer copyWithZone:zone]; + operation.completionQueue = self.completionQueue; + operation.completionGroup = self.completionGroup; + + return operation; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h new file mode 100644 index 0000000..e1fb041 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h @@ -0,0 +1,308 @@ +// AFHTTPRequestOperationManager.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import +#import + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#else +#import +#endif + +#import "AFHTTPRequestOperation.h" +#import "AFURLResponseSerialization.h" +#import "AFURLRequestSerialization.h" +#import "AFSecurityPolicy.h" +#import "AFNetworkReachabilityManager.h" + +/** + `AFHTTPRequestOperationManager` encapsulates the common patterns of communicating with a web application over HTTP, including request creation, response serialization, network reachability monitoring, and security, as well as request operation management. + + ## Subclassing Notes + + Developers targeting iOS 7 or Mac OS X 10.9 or later that deal extensively with a web service are encouraged to subclass `AFHTTPSessionManager`, providing a class method that returns a shared singleton object on which authentication and other configuration can be shared across the application. + + For developers targeting iOS 6 or Mac OS X 10.8 or earlier, `AFHTTPRequestOperationManager` may be used to similar effect. + + ## Methods to Override + + To change the behavior of all request operation construction for an `AFHTTPRequestOperationManager` subclass, override `HTTPRequestOperationWithRequest:success:failure`. + + ## Serialization + + Requests created by an HTTP client will contain default headers and encode parameters according to the `requestSerializer` property, which is an object conforming to ``. + + Responses received from the server are automatically validated and serialized by the `responseSerializers` property, which is an object conforming to `` + + ## URL Construction Using Relative Paths + + For HTTP convenience methods, the request serializer constructs URLs from the path relative to the `-baseURL`, using `NSURL +URLWithString:relativeToURL:`, when provided. If `baseURL` is `nil`, `path` needs to resolve to a valid `NSURL` object using `NSURL +URLWithString:`. + + Below are a few examples of how `baseURL` and relative paths interact: + + NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"]; + [NSURL URLWithString:@"foo" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL]; // http://example.com/v1/foo?bar=baz + [NSURL URLWithString:@"/foo" relativeToURL:baseURL]; // http://example.com/foo + [NSURL URLWithString:@"foo/" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"/foo/" relativeToURL:baseURL]; // http://example.com/foo/ + [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/ + + Also important to note is that a trailing slash will be added to any `baseURL` without one. This would otherwise cause unexpected behavior when constructing URLs using paths without a leading slash. + + ## Network Reachability Monitoring + + Network reachability status and change monitoring is available through the `reachabilityManager` property. Applications may choose to monitor network reachability conditions in order to prevent or suspend any outbound requests. See `AFNetworkReachabilityManager` for more details. + + ## NSSecureCoding & NSCopying Caveats + + `AFHTTPRequestOperationManager` conforms to the `NSSecureCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. There are a few minor caveats to keep in mind, however: + + - Archives and copies of HTTP clients will be initialized with an empty operation queue. + - NSSecureCoding cannot serialize / deserialize block properties, so an archive of an HTTP client will not include any reachability callback block that may be set. + */ +@interface AFHTTPRequestOperationManager : NSObject + +/** + The URL used to monitor reachability, and construct requests from relative paths in methods like `requestWithMethod:URLString:parameters:`, and the `GET` / `POST` / et al. convenience methods. + */ +@property (readonly, nonatomic, strong) NSURL *baseURL; + +/** + Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies. + + @warning `requestSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to a JSON serializer, which serializes data from responses with a `application/json` MIME type, and falls back to the raw data object. The serializer validates the status code to be in the `2XX` range, denoting success. If the response serializer generates an error in `-responseObjectForResponse:data:error:`, the `failure` callback of the session task or request operation will be executed; otherwise, the `success` callback will be executed. + + @warning `responseSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +/** + The operation queue on which request operations are scheduled and run. + */ +@property (nonatomic, strong) NSOperationQueue *operationQueue; + +///------------------------------- +/// @name Managing URL Credentials +///------------------------------- + +/** + Whether request operations should consult the credential storage for authenticating the connection. `YES` by default. + + @see AFURLConnectionOperation -shouldUseCredentialStorage + */ +@property (nonatomic, assign) BOOL shouldUseCredentialStorage; + +/** + The credential used by request operations for authentication challenges. + + @see AFURLConnectionOperation -credential + */ +@property (nonatomic, strong) NSURLCredential *credential; + +///------------------------------- +/// @name Managing Security Policy +///------------------------------- + +/** + The security policy used by created request operations to evaluate server trust for secure connections. `AFHTTPRequestOperationManager` uses the `defaultPolicy` unless otherwise specified. + */ +@property (nonatomic, strong) AFSecurityPolicy *securityPolicy; + +///------------------------------------ +/// @name Managing Network Reachability +///------------------------------------ + +/** + The network reachability manager. `AFHTTPRequestOperationManager` uses the `sharedManager` by default. + */ +@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager; + +///------------------------------- +/// @name Managing Callback Queues +///------------------------------- + +/** + The dispatch queue for the `completionBlock` of request operations. If `NULL` (default), the main queue is used. + */ +@property (nonatomic, strong) dispatch_queue_t completionQueue; + +/** + The dispatch group for the `completionBlock` of request operations. If `NULL` (default), a private dispatch group is used. + */ +@property (nonatomic, strong) dispatch_group_t completionGroup; + +///--------------------------------------------- +/// @name Creating and Initializing HTTP Clients +///--------------------------------------------- + +/** + Creates and returns an `AFHTTPRequestOperationManager` object. + */ ++ (instancetype)manager; + +/** + Initializes an `AFHTTPRequestOperationManager` object with the specified base URL. + + This is the designated initializer. + + @param url The base URL for the HTTP client. + + @return The newly-initialized HTTP client + */ +- (instancetype)initWithBaseURL:(NSURL *)url NS_DESIGNATED_INITIALIZER; + +///--------------------------------------- +/// @name Managing HTTP Request Operations +///--------------------------------------- + +/** + Creates an `AFHTTPRequestOperation`, and sets the response serializers to that of the HTTP client. + + @param request The request object to be loaded asynchronously during execution of the operation. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the created request operation and the object created from the response data of request. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes two arguments:, the created request operation and the `NSError` object describing the network or parsing error that occurred. + */ +- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +///--------------------------- +/// @name Making HTTP Requests +///--------------------------- + +/** + Creates and runs an `AFHTTPRequestOperation` with a `GET` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `HEAD` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes a single arguments: the request operation. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a multipart `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `PUT` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `PATCH` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +/** + Creates and runs an `AFHTTPRequestOperation` with a `DELETE` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the request operation finishes successfully. This block has no return value and takes two arguments: the request operation, and the response object created by the client response serializer. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the request operation and the error describing the network or parsing error that occurred. + + @see -HTTPRequestOperationWithRequest:success:failure: + */ +- (AFHTTPRequestOperation *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; + +@end + diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m new file mode 100644 index 0000000..665111f --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPRequestOperationManager.m @@ -0,0 +1,285 @@ +// AFHTTPRequestOperationManager.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import "AFHTTPRequestOperationManager.h" +#import "AFHTTPRequestOperation.h" + +#import +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +@interface AFHTTPRequestOperationManager () +@property (readwrite, nonatomic, strong) NSURL *baseURL; +@end + +@implementation AFHTTPRequestOperationManager + ++ (instancetype)manager { + return [[self alloc] initWithBaseURL:nil]; +} + +- (instancetype)init { + return [self initWithBaseURL:nil]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url { + self = [super init]; + if (!self) { + return nil; + } + + // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected + if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) { + url = [url URLByAppendingPathComponent:@""]; + } + + self.baseURL = url; + + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + self.responseSerializer = [AFJSONResponseSerializer serializer]; + + self.securityPolicy = [AFSecurityPolicy defaultPolicy]; + + self.reachabilityManager = [AFNetworkReachabilityManager sharedManager]; + + self.operationQueue = [[NSOperationQueue alloc] init]; + + self.shouldUseCredentialStorage = YES; + + return self; +} + +#pragma mark - + +#ifdef _SYSTEMCONFIGURATION_H +#endif + +- (void)setRequestSerializer:(AFHTTPRequestSerializer *)requestSerializer { + NSParameterAssert(requestSerializer); + + _requestSerializer = requestSerializer; +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + NSParameterAssert(responseSerializer); + + _responseSerializer = responseSerializer; +} + +#pragma mark - + +- (AFHTTPRequestOperation *)HTTPRequestOperationWithHTTPMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + return [self HTTPRequestOperationWithRequest:request success:success failure:failure]; +} + +- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + operation.responseSerializer = self.responseSerializer; + operation.shouldUseCredentialStorage = self.shouldUseCredentialStorage; + operation.credential = self.credential; + operation.securityPolicy = self.securityPolicy; + + [operation setCompletionBlockWithSuccess:success failure:failure]; + operation.completionQueue = self.completionQueue; + operation.completionGroup = self.completionGroup; + + return operation; +} + +#pragma mark - + +- (AFHTTPRequestOperation *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"GET" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"HEAD" URLString:URLString parameters:parameters success:^(AFHTTPRequestOperation *requestOperation, __unused id responseObject) { + if (success) { + success(requestOperation); + } + } failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"POST" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"PUT" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"PATCH" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +- (AFHTTPRequestOperation *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure +{ + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithHTTPMethod:@"DELETE" URLString:URLString parameters:parameters success:success failure:failure]; + + [self.operationQueue addOperation:operation]; + + return operation; +} + +#pragma mark - NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, baseURL: %@, operationQueue: %@>", NSStringFromClass([self class]), self, [self.baseURL absoluteString], self.operationQueue]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURL *baseURL = [decoder decodeObjectForKey:NSStringFromSelector(@selector(baseURL))]; + + self = [self initWithBaseURL:baseURL]; + if (!self) { + return nil; + } + + self.requestSerializer = [decoder decodeObjectOfClass:[AFHTTPRequestSerializer class] forKey:NSStringFromSelector(@selector(requestSerializer))]; + self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.baseURL forKey:NSStringFromSelector(@selector(baseURL))]; + [coder encodeObject:self.requestSerializer forKey:NSStringFromSelector(@selector(requestSerializer))]; + [coder encodeObject:self.responseSerializer forKey:NSStringFromSelector(@selector(responseSerializer))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPRequestOperationManager *HTTPClient = [[[self class] allocWithZone:zone] initWithBaseURL:self.baseURL]; + + HTTPClient.requestSerializer = [self.requestSerializer copyWithZone:zone]; + HTTPClient.responseSerializer = [self.responseSerializer copyWithZone:zone]; + + return HTTPClient; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h new file mode 100644 index 0000000..bab8245 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.h @@ -0,0 +1,240 @@ +// AFHTTPSessionManager.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import +#import + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#else +#import +#endif + +#import "AFURLSessionManager.h" + +/** + `AFHTTPSessionManager` is a subclass of `AFURLSessionManager` with convenience methods for making HTTP requests. When a `baseURL` is provided, requests made with the `GET` / `POST` / et al. convenience methods can be made with relative paths. + + ## Subclassing Notes + + Developers targeting iOS 7 or Mac OS X 10.9 or later that deal extensively with a web service are encouraged to subclass `AFHTTPSessionManager`, providing a class method that returns a shared singleton object on which authentication and other configuration can be shared across the application. + + For developers targeting iOS 6 or Mac OS X 10.8 or earlier, `AFHTTPRequestOperationManager` may be used to similar effect. + + ## Methods to Override + + To change the behavior of all data task operation construction, which is also used in the `GET` / `POST` / et al. convenience methods, override `dataTaskWithRequest:completionHandler:`. + + ## Serialization + + Requests created by an HTTP client will contain default headers and encode parameters according to the `requestSerializer` property, which is an object conforming to ``. + + Responses received from the server are automatically validated and serialized by the `responseSerializers` property, which is an object conforming to `` + + ## URL Construction Using Relative Paths + + For HTTP convenience methods, the request serializer constructs URLs from the path relative to the `-baseURL`, using `NSURL +URLWithString:relativeToURL:`, when provided. If `baseURL` is `nil`, `path` needs to resolve to a valid `NSURL` object using `NSURL +URLWithString:`. + + Below are a few examples of how `baseURL` and relative paths interact: + + NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"]; + [NSURL URLWithString:@"foo" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL]; // http://example.com/v1/foo?bar=baz + [NSURL URLWithString:@"/foo" relativeToURL:baseURL]; // http://example.com/foo + [NSURL URLWithString:@"foo/" relativeToURL:baseURL]; // http://example.com/v1/foo + [NSURL URLWithString:@"/foo/" relativeToURL:baseURL]; // http://example.com/foo/ + [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/ + + Also important to note is that a trailing slash will be added to any `baseURL` without one. This would otherwise cause unexpected behavior when constructing URLs using paths without a leading slash. + + @warning Managers for background sessions must be owned for the duration of their use. This can be accomplished by creating an application-wide or shared singleton instance. + */ + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +@interface AFHTTPSessionManager : AFURLSessionManager + +/** + The URL used to monitor reachability, and construct requests from relative paths in methods like `requestWithMethod:URLString:parameters:`, and the `GET` / `POST` / et al. convenience methods. + */ +@property (readonly, nonatomic, strong) NSURL *baseURL; + +/** + Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies. + + @warning `requestSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `AFJSONResponseSerializer`. + + @warning `responseSerializer` must not be `nil`. + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Creates and returns an `AFHTTPSessionManager` object. + */ ++ (instancetype)manager; + +/** + Initializes an `AFHTTPSessionManager` object with the specified base URL. + + @param url The base URL for the HTTP client. + + @return The newly-initialized HTTP client + */ +- (instancetype)initWithBaseURL:(NSURL *)url; + +/** + Initializes an `AFHTTPSessionManager` object with the specified base URL. + + This is the designated initializer. + + @param url The base URL for the HTTP client. + @param configuration The configuration used to create the managed session. + + @return The newly-initialized HTTP client + */ +- (instancetype)initWithBaseURL:(NSURL *)url + sessionConfiguration:(NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER; + +///--------------------------- +/// @name Making HTTP Requests +///--------------------------- + +/** + Creates and runs an `NSURLSessionDataTask` with a `GET` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `HEAD` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes a single arguments: the data task. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a multipart `POST` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `PUT` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `PATCH` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +/** + Creates and runs an `NSURLSessionDataTask` with a `DELETE` request. + + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded according to the client request serializer. + @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer. + @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred. + + @see -dataTaskWithRequest:completionHandler: + */ +- (NSURLSessionDataTask *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure; + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m new file mode 100644 index 0000000..3a2323e --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m @@ -0,0 +1,321 @@ +// AFHTTPSessionManager.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFHTTPSessionManager.h" + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +#import "AFURLRequestSerialization.h" +#import "AFURLResponseSerialization.h" + +#import +#import + +#ifdef _SYSTEMCONFIGURATION_H +#import +#import +#import +#import +#import +#endif + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +@interface AFHTTPSessionManager () +@property (readwrite, nonatomic, strong) NSURL *baseURL; +@end + +@implementation AFHTTPSessionManager + ++ (instancetype)manager { + return [[[self class] alloc] initWithBaseURL:nil]; +} + +- (instancetype)init { + return [self initWithBaseURL:nil]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url { + return [self initWithBaseURL:url sessionConfiguration:nil]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration { + return [self initWithBaseURL:nil sessionConfiguration:configuration]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url + sessionConfiguration:(NSURLSessionConfiguration *)configuration +{ + self = [super initWithSessionConfiguration:configuration]; + if (!self) { + return nil; + } + + // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected + if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) { + url = [url URLByAppendingPathComponent:@""]; + } + + self.baseURL = url; + + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + self.responseSerializer = [AFJSONResponseSerializer serializer]; + + return self; +} + +#pragma mark - + +#ifdef _SYSTEMCONFIGURATION_H +#endif + +- (void)setRequestSerializer:(AFHTTPRequestSerializer *)requestSerializer { + NSParameterAssert(requestSerializer); + + _requestSerializer = requestSerializer; +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + NSParameterAssert(responseSerializer); + + [super setResponseSerializer:responseSerializer]; +} + +#pragma mark - + +- (NSURLSessionDataTask *)GET:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)HEAD:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"HEAD" URLString:URLString parameters:parameters success:^(NSURLSessionDataTask *task, __unused id responseObject) { + if (success) { + success(task); + } + } failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"POST" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)POST:(NSString *)URLString + parameters:(id)parameters + constructingBodyWithBlock:(void (^)(id formData))block + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters constructingBodyWithBlock:block error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + __block NSURLSessionDataTask *task = [self uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { + if (error) { + if (failure) { + failure(task, error); + } + } else { + if (success) { + success(task, responseObject); + } + } + }]; + + [task resume]; + + return task; +} + +- (NSURLSessionDataTask *)PUT:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PUT" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)PATCH:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PATCH" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)DELETE:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *task, id responseObject))success + failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure +{ + NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"DELETE" URLString:URLString parameters:parameters success:success failure:failure]; + + [dataTask resume]; + + return dataTask; +} + +- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + success:(void (^)(NSURLSessionDataTask *, id))success + failure:(void (^)(NSURLSessionDataTask *, NSError *))failure +{ + NSError *serializationError = nil; + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError]; + if (serializationError) { + if (failure) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{ + failure(nil, serializationError); + }); +#pragma clang diagnostic pop + } + + return nil; + } + + __block NSURLSessionDataTask *dataTask = nil; + dataTask = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { + if (error) { + if (failure) { + failure(dataTask, error); + } + } else { + if (success) { + success(dataTask, responseObject); + } + } + }]; + + return dataTask; +} + +#pragma mark - NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, baseURL: %@, session: %@, operationQueue: %@>", NSStringFromClass([self class]), self, [self.baseURL absoluteString], self.session, self.operationQueue]; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURL *baseURL = [decoder decodeObjectOfClass:[NSURL class] forKey:NSStringFromSelector(@selector(baseURL))]; + NSURLSessionConfiguration *configuration = [decoder decodeObjectOfClass:[NSURLSessionConfiguration class] forKey:@"sessionConfiguration"]; + if (!configuration) { + NSString *configurationIdentifier = [decoder decodeObjectOfClass:[NSString class] forKey:@"identifier"]; + if (configurationIdentifier) { +#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1100) + configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configurationIdentifier]; +#else + configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:configurationIdentifier]; +#endif + } + } + + self = [self initWithBaseURL:baseURL sessionConfiguration:configuration]; + if (!self) { + return nil; + } + + self.requestSerializer = [decoder decodeObjectOfClass:[AFHTTPRequestSerializer class] forKey:NSStringFromSelector(@selector(requestSerializer))]; + self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:self.baseURL forKey:NSStringFromSelector(@selector(baseURL))]; + if ([self.session.configuration conformsToProtocol:@protocol(NSCoding)]) { + [coder encodeObject:self.session.configuration forKey:@"sessionConfiguration"]; + } else { + [coder encodeObject:self.session.configuration.identifier forKey:@"identifier"]; + } + [coder encodeObject:self.requestSerializer forKey:NSStringFromSelector(@selector(requestSerializer))]; + [coder encodeObject:self.responseSerializer forKey:NSStringFromSelector(@selector(responseSerializer))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPSessionManager *HTTPClient = [[[self class] allocWithZone:zone] initWithBaseURL:self.baseURL sessionConfiguration:self.session.configuration]; + + HTTPClient.requestSerializer = [self.requestSerializer copyWithZone:zone]; + HTTPClient.responseSerializer = [self.responseSerializer copyWithZone:zone]; + + return HTTPClient; +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h new file mode 100644 index 0000000..31ab79b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.h @@ -0,0 +1,193 @@ +// AFNetworkReachabilityManager.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { + AFNetworkReachabilityStatusUnknown = -1, + AFNetworkReachabilityStatusNotReachable = 0, + AFNetworkReachabilityStatusReachableViaWWAN = 1, + AFNetworkReachabilityStatusReachableViaWiFi = 2, +}; + +/** + `AFNetworkReachabilityManager` monitors the reachability of domains, and addresses for both WWAN and WiFi network interfaces. + + Reachability can be used to determine background information about why a network operation failed, or to trigger a network operation retrying when a connection is established. It should not be used to prevent a user from initiating a network request, as it's possible that an initial request may be required to establish reachability. + + See Apple's Reachability Sample Code (https://developer.apple.com/library/ios/samplecode/reachability/) + + @warning Instances of `AFNetworkReachabilityManager` must be started with `-startMonitoring` before reachability status can be determined. + */ +@interface AFNetworkReachabilityManager : NSObject + +/** + The current network reachability status. + */ +@property (readonly, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus; + +/** + Whether or not the network is currently reachable. + */ +@property (readonly, nonatomic, assign, getter = isReachable) BOOL reachable; + +/** + Whether or not the network is currently reachable via WWAN. + */ +@property (readonly, nonatomic, assign, getter = isReachableViaWWAN) BOOL reachableViaWWAN; + +/** + Whether or not the network is currently reachable via WiFi. + */ +@property (readonly, nonatomic, assign, getter = isReachableViaWiFi) BOOL reachableViaWiFi; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Returns the shared network reachability manager. + */ ++ (instancetype)sharedManager; + +/** + Creates and returns a network reachability manager for the specified domain. + + @param domain The domain used to evaluate network reachability. + + @return An initialized network reachability manager, actively monitoring the specified domain. + */ ++ (instancetype)managerForDomain:(NSString *)domain; + +/** + Creates and returns a network reachability manager for the socket address. + + @param address The socket address (`sockaddr_in`) used to evaluate network reachability. + + @return An initialized network reachability manager, actively monitoring the specified socket address. + */ ++ (instancetype)managerForAddress:(const void *)address; + +/** + Initializes an instance of a network reachability manager from the specified reachability object. + + @param reachability The reachability object to monitor. + + @return An initialized network reachability manager, actively monitoring the specified reachability. + */ +- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability NS_DESIGNATED_INITIALIZER; + +///-------------------------------------------------- +/// @name Starting & Stopping Reachability Monitoring +///-------------------------------------------------- + +/** + Starts monitoring for changes in network reachability status. + */ +- (void)startMonitoring; + +/** + Stops monitoring for changes in network reachability status. + */ +- (void)stopMonitoring; + +///------------------------------------------------- +/// @name Getting Localized Reachability Description +///------------------------------------------------- + +/** + Returns a localized string representation of the current network reachability status. + */ +- (NSString *)localizedNetworkReachabilityStatusString; + +///--------------------------------------------------- +/// @name Setting Network Reachability Change Callback +///--------------------------------------------------- + +/** + Sets a callback to be executed when the network availability of the `baseURL` host changes. + + @param block A block object to be executed when the network availability of the `baseURL` host changes.. This block has no return value and takes a single argument which represents the various reachability states from the device to the `baseURL`. + */ +- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## Network Reachability + + The following constants are provided by `AFNetworkReachabilityManager` as possible network reachability statuses. + + enum { + AFNetworkReachabilityStatusUnknown, + AFNetworkReachabilityStatusNotReachable, + AFNetworkReachabilityStatusReachableViaWWAN, + AFNetworkReachabilityStatusReachableViaWiFi, + } + + `AFNetworkReachabilityStatusUnknown` + The `baseURL` host reachability is not known. + + `AFNetworkReachabilityStatusNotReachable` + The `baseURL` host cannot be reached. + + `AFNetworkReachabilityStatusReachableViaWWAN` + The `baseURL` host can be reached via a cellular connection, such as EDGE or GPRS. + + `AFNetworkReachabilityStatusReachableViaWiFi` + The `baseURL` host can be reached via a Wi-Fi connection. + + ### Keys for Notification UserInfo Dictionary + + Strings that are used as keys in a `userInfo` dictionary in a network reachability status change notification. + + `AFNetworkingReachabilityNotificationStatusItem` + A key in the userInfo dictionary in a `AFNetworkingReachabilityDidChangeNotification` notification. + The corresponding value is an `NSNumber` object representing the `AFNetworkReachabilityStatus` value for the current reachability status. + */ + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when network reachability changes. + This notification assigns no notification object. The `userInfo` dictionary contains an `NSNumber` object under the `AFNetworkingReachabilityNotificationStatusItem` key, representing the `AFNetworkReachabilityStatus` value for the current network reachability. + + @warning In order for network reachability to be monitored, include the `SystemConfiguration` framework in the active target's "Link Binary With Library" build phase, and add `#import ` to the header prefix of the project (`Prefix.pch`). + */ +extern NSString * const AFNetworkingReachabilityDidChangeNotification; +extern NSString * const AFNetworkingReachabilityNotificationStatusItem; + +///-------------------- +/// @name Functions +///-------------------- + +/** + Returns a localized string representation of an `AFNetworkReachabilityStatus` value. + */ +extern NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status); diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m new file mode 100644 index 0000000..3415e98 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m @@ -0,0 +1,259 @@ +// AFNetworkReachabilityManager.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFNetworkReachabilityManager.h" + +#import +#import +#import +#import +#import + +NSString * const AFNetworkingReachabilityDidChangeNotification = @"com.alamofire.networking.reachability.change"; +NSString * const AFNetworkingReachabilityNotificationStatusItem = @"AFNetworkingReachabilityNotificationStatusItem"; + +typedef void (^AFNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status); + +typedef NS_ENUM(NSUInteger, AFNetworkReachabilityAssociation) { + AFNetworkReachabilityForAddress = 1, + AFNetworkReachabilityForAddressPair = 2, + AFNetworkReachabilityForName = 3, +}; + +NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status) { + switch (status) { + case AFNetworkReachabilityStatusNotReachable: + return NSLocalizedStringFromTable(@"Not Reachable", @"AFNetworking", nil); + case AFNetworkReachabilityStatusReachableViaWWAN: + return NSLocalizedStringFromTable(@"Reachable via WWAN", @"AFNetworking", nil); + case AFNetworkReachabilityStatusReachableViaWiFi: + return NSLocalizedStringFromTable(@"Reachable via WiFi", @"AFNetworking", nil); + case AFNetworkReachabilityStatusUnknown: + default: + return NSLocalizedStringFromTable(@"Unknown", @"AFNetworking", nil); + } +} + +static AFNetworkReachabilityStatus AFNetworkReachabilityStatusForFlags(SCNetworkReachabilityFlags flags) { + BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0); + BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0); + BOOL canConnectionAutomatically = (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || ((flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)); + BOOL canConnectWithoutUserInteraction = (canConnectionAutomatically && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0); + BOOL isNetworkReachable = (isReachable && (!needsConnection || canConnectWithoutUserInteraction)); + + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusUnknown; + if (isNetworkReachable == NO) { + status = AFNetworkReachabilityStatusNotReachable; + } +#if TARGET_OS_IPHONE + else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) { + status = AFNetworkReachabilityStatusReachableViaWWAN; + } +#endif + else { + status = AFNetworkReachabilityStatusReachableViaWiFi; + } + + return status; +} + +static void AFNetworkReachabilityCallback(SCNetworkReachabilityRef __unused target, SCNetworkReachabilityFlags flags, void *info) { + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags); + AFNetworkReachabilityStatusBlock block = (__bridge AFNetworkReachabilityStatusBlock)info; + if (block) { + block(status); + } + + + dispatch_async(dispatch_get_main_queue(), ^{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil userInfo:@{ AFNetworkingReachabilityNotificationStatusItem: @(status) }]; + }); + +} + +static const void * AFNetworkReachabilityRetainCallback(const void *info) { + return Block_copy(info); +} + +static void AFNetworkReachabilityReleaseCallback(const void *info) { + if (info) { + Block_release(info); + } +} + +@interface AFNetworkReachabilityManager () +@property (readwrite, nonatomic, assign) SCNetworkReachabilityRef networkReachability; +@property (readwrite, nonatomic, assign) AFNetworkReachabilityAssociation networkReachabilityAssociation; +@property (readwrite, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus; +@property (readwrite, nonatomic, copy) AFNetworkReachabilityStatusBlock networkReachabilityStatusBlock; +@end + +@implementation AFNetworkReachabilityManager + ++ (instancetype)sharedManager { + static AFNetworkReachabilityManager *_sharedManager = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + struct sockaddr_in address; + bzero(&address, sizeof(address)); + address.sin_len = sizeof(address); + address.sin_family = AF_INET; + + _sharedManager = [self managerForAddress:&address]; + }); + + return _sharedManager; +} + ++ (instancetype)managerForDomain:(NSString *)domain { + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [domain UTF8String]); + + AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability]; + manager.networkReachabilityAssociation = AFNetworkReachabilityForName; + + return manager; +} + ++ (instancetype)managerForAddress:(const void *)address { + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address); + + AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability]; + manager.networkReachabilityAssociation = AFNetworkReachabilityForAddress; + + return manager; +} + +- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability { + self = [super init]; + if (!self) { + return nil; + } + + self.networkReachability = reachability; + self.networkReachabilityStatus = AFNetworkReachabilityStatusUnknown; + + return self; +} + +- (void)dealloc { + [self stopMonitoring]; + + if (_networkReachability) { + CFRelease(_networkReachability); + _networkReachability = NULL; + } +} + +#pragma mark - + +- (BOOL)isReachable { + return [self isReachableViaWWAN] || [self isReachableViaWiFi]; +} + +- (BOOL)isReachableViaWWAN { + return self.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN; +} + +- (BOOL)isReachableViaWiFi { + return self.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWiFi; +} + +#pragma mark - + +- (void)startMonitoring { + [self stopMonitoring]; + + if (!self.networkReachability) { + return; + } + + __weak __typeof(self)weakSelf = self; + AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + + strongSelf.networkReachabilityStatus = status; + if (strongSelf.networkReachabilityStatusBlock) { + strongSelf.networkReachabilityStatusBlock(status); + } + + }; + + SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL}; + SCNetworkReachabilitySetCallback(self.networkReachability, AFNetworkReachabilityCallback, &context); + SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); + + switch (self.networkReachabilityAssociation) { + case AFNetworkReachabilityForName: + break; + case AFNetworkReachabilityForAddress: + case AFNetworkReachabilityForAddressPair: + default: { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{ + SCNetworkReachabilityFlags flags; + SCNetworkReachabilityGetFlags(self.networkReachability, &flags); + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags); + dispatch_async(dispatch_get_main_queue(), ^{ + callback(status); + + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil userInfo:@{ AFNetworkingReachabilityNotificationStatusItem: @(status) }]; + + + }); + }); + } + break; + } +} + +- (void)stopMonitoring { + if (!self.networkReachability) { + return; + } + + SCNetworkReachabilityUnscheduleFromRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); +} + +#pragma mark - + +- (NSString *)localizedNetworkReachabilityStatusString { + return AFStringFromNetworkReachabilityStatus(self.networkReachabilityStatus); +} + +#pragma mark - + +- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block { + self.networkReachabilityStatusBlock = block; +} + +#pragma mark - NSKeyValueObserving + ++ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { + if ([key isEqualToString:@"reachable"] || [key isEqualToString:@"reachableViaWWAN"] || [key isEqualToString:@"reachableViaWiFi"]) { + return [NSSet setWithObject:@"networkReachabilityStatus"]; + } + + return [super keyPathsForValuesAffectingValueForKey:key]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworking.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworking.h new file mode 100644 index 0000000..68273da --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFNetworking.h @@ -0,0 +1,44 @@ +// AFNetworking.h +// +// Copyright (c) 2013 AFNetworking (http://afnetworking.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +#ifndef _AFNETWORKING_ + #define _AFNETWORKING_ + + #import "AFURLRequestSerialization.h" + #import "AFURLResponseSerialization.h" + #import "AFSecurityPolicy.h" + #import "AFNetworkReachabilityManager.h" + + #import "AFURLConnectionOperation.h" + #import "AFHTTPRequestOperation.h" + #import "AFHTTPRequestOperationManager.h" + +#if ( ( defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) || \ + ( defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 ) ) + #import "AFURLSessionManager.h" + #import "AFHTTPSessionManager.h" +#endif + +#endif /* _AFNETWORKING_ */ diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h new file mode 100644 index 0000000..4906f3b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.h @@ -0,0 +1,143 @@ +// AFSecurityPolicy.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +typedef NS_ENUM(NSUInteger, AFSSLPinningMode) { + AFSSLPinningModeNone, + AFSSLPinningModePublicKey, + AFSSLPinningModeCertificate, +}; + +/** + `AFSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. + + Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled. + */ +@interface AFSecurityPolicy : NSObject + +/** + The criteria by which server trust should be evaluated against the pinned SSL certificates. Defaults to `AFSSLPinningModeNone`. + */ +@property (readonly, nonatomic, assign) AFSSLPinningMode SSLPinningMode; + +/** + Whether to evaluate an entire SSL certificate chain, or just the leaf certificate. Defaults to `YES`. + */ +@property (nonatomic, assign) BOOL validatesCertificateChain; + +/** + The certificates used to evaluate server trust according to the SSL pinning mode. By default, this property is set to any (`.cer`) certificates included in the app bundle. + */ +@property (nonatomic, strong) NSArray *pinnedCertificates; + +/** + Whether or not to trust servers with an invalid or expired SSL certificates. Defaults to `NO`. + */ +@property (nonatomic, assign) BOOL allowInvalidCertificates; + +/** + Whether or not to validate the domain name in the certificate's CN field. Defaults to `YES` for `AFSSLPinningModePublicKey` or `AFSSLPinningModeCertificate`, otherwise `NO`. + */ +@property (nonatomic, assign) BOOL validatesDomainName; + +///----------------------------------------- +/// @name Getting Specific Security Policies +///----------------------------------------- + +/** + Returns the shared default security policy, which does not allow invalid certificates, does not validate domain name, and does not validate against pinned certificates or public keys. + + @return The default security policy. + */ ++ (instancetype)defaultPolicy; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Creates and returns a security policy with the specified pinning mode. + + @param pinningMode The SSL pinning mode. + + @return A new security policy. + */ ++ (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode; + +///------------------------------ +/// @name Evaluating Server Trust +///------------------------------ + +/** + Whether or not the specified server trust should be accepted, based on the security policy. + + This method should be used when responding to an authentication challenge from a server. + + @param serverTrust The X.509 certificate trust of the server. + + @return Whether or not to trust the server. + + @warning This method has been deprecated in favor of `-evaluateServerTrust:forDomain:`. + */ +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust DEPRECATED_ATTRIBUTE; + +/** + Whether or not the specified server trust should be accepted, based on the security policy. + + This method should be used when responding to an authentication challenge from a server. + + @param serverTrust The X.509 certificate trust of the server. + @param domain The domain of serverTrust. If `nil`, the domain will not be validated. + + @return Whether or not to trust the server. + */ +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust + forDomain:(NSString *)domain; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## SSL Pinning Modes + + The following constants are provided by `AFSSLPinningMode` as possible SSL pinning modes. + + enum { + AFSSLPinningModeNone, + AFSSLPinningModePublicKey, + AFSSLPinningModeCertificate, + } + + `AFSSLPinningModeNone` + Do not used pinned certificates to validate servers. + + `AFSSLPinningModePublicKey` + Validate host certificates against public keys of pinned certificates. + + `AFSSLPinningModeCertificate` + Validate host certificates against pinned certificates. +*/ diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m new file mode 100644 index 0000000..41576bb --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFSecurityPolicy.m @@ -0,0 +1,317 @@ +// AFSecurityPolicy.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFSecurityPolicy.h" + +#import + +#if !defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +static NSData * AFSecKeyGetData(SecKeyRef key) { + CFDataRef data = NULL; + + __Require_noErr_Quiet(SecItemExport(key, kSecFormatUnknown, kSecItemPemArmour, NULL, &data), _out); + + return (__bridge_transfer NSData *)data; + +_out: + if (data) { + CFRelease(data); + } + + return nil; +} +#endif + +static BOOL AFSecKeyIsEqualToKey(SecKeyRef key1, SecKeyRef key2) { +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + return [(__bridge id)key1 isEqual:(__bridge id)key2]; +#else + return [AFSecKeyGetData(key1) isEqual:AFSecKeyGetData(key2)]; +#endif +} + +static id AFPublicKeyForCertificate(NSData *certificate) { + id allowedPublicKey = nil; + SecCertificateRef allowedCertificate; + SecCertificateRef allowedCertificates[1]; + CFArrayRef tempCertificates = nil; + SecPolicyRef policy = nil; + SecTrustRef allowedTrust = nil; + SecTrustResultType result; + + allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificate); + __Require_Quiet(allowedCertificate != NULL, _out); + + allowedCertificates[0] = allowedCertificate; + tempCertificates = CFArrayCreate(NULL, (const void **)allowedCertificates, 1, NULL); + + policy = SecPolicyCreateBasicX509(); + __Require_noErr_Quiet(SecTrustCreateWithCertificates(tempCertificates, policy, &allowedTrust), _out); + __Require_noErr_Quiet(SecTrustEvaluate(allowedTrust, &result), _out); + + allowedPublicKey = (__bridge_transfer id)SecTrustCopyPublicKey(allowedTrust); + +_out: + if (allowedTrust) { + CFRelease(allowedTrust); + } + + if (policy) { + CFRelease(policy); + } + + if (tempCertificates) { + CFRelease(tempCertificates); + } + + if (allowedCertificate) { + CFRelease(allowedCertificate); + } + + return allowedPublicKey; +} + +static BOOL AFServerTrustIsValid(SecTrustRef serverTrust) { + BOOL isValid = NO; + SecTrustResultType result; + __Require_noErr_Quiet(SecTrustEvaluate(serverTrust, &result), _out); + + isValid = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed); + +_out: + return isValid; +} + +static NSArray * AFCertificateTrustChainForServerTrust(SecTrustRef serverTrust) { + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + [trustChain addObject:(__bridge_transfer NSData *)SecCertificateCopyData(certificate)]; + } + + return [NSArray arrayWithArray:trustChain]; +} + +static NSArray * AFPublicKeyTrustChainForServerTrust(SecTrustRef serverTrust) { + SecPolicyRef policy = SecPolicyCreateBasicX509(); + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + + SecCertificateRef someCertificates[] = {certificate}; + CFArrayRef certificates = CFArrayCreate(NULL, (const void **)someCertificates, 1, NULL); + + SecTrustRef trust; + __Require_noErr_Quiet(SecTrustCreateWithCertificates(certificates, policy, &trust), _out); + + SecTrustResultType result; + __Require_noErr_Quiet(SecTrustEvaluate(trust, &result), _out); + + [trustChain addObject:(__bridge_transfer id)SecTrustCopyPublicKey(trust)]; + + _out: + if (trust) { + CFRelease(trust); + } + + if (certificates) { + CFRelease(certificates); + } + + continue; + } + CFRelease(policy); + + return [NSArray arrayWithArray:trustChain]; +} + +#pragma mark - + +@interface AFSecurityPolicy() +@property (readwrite, nonatomic, assign) AFSSLPinningMode SSLPinningMode; +@property (readwrite, nonatomic, strong) NSArray *pinnedPublicKeys; +@end + +@implementation AFSecurityPolicy + ++ (NSArray *)defaultPinnedCertificates { + static NSArray *_defaultPinnedCertificates = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + NSArray *paths = [bundle pathsForResourcesOfType:@"cer" inDirectory:@"."]; + + NSMutableArray *certificates = [NSMutableArray arrayWithCapacity:[paths count]]; + for (NSString *path in paths) { + NSData *certificateData = [NSData dataWithContentsOfFile:path]; + [certificates addObject:certificateData]; + } + + _defaultPinnedCertificates = [[NSArray alloc] initWithArray:certificates]; + }); + + return _defaultPinnedCertificates; +} + ++ (instancetype)defaultPolicy { + AFSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = AFSSLPinningModeNone; + + return securityPolicy; +} + ++ (instancetype)policyWithPinningMode:(AFSSLPinningMode)pinningMode { + AFSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = pinningMode; + + [securityPolicy setPinnedCertificates:[self defaultPinnedCertificates]]; + + return securityPolicy; +} + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + self.validatesCertificateChain = YES; + + return self; +} + +#pragma mark - + +- (void)setSSLPinningMode:(AFSSLPinningMode)SSLPinningMode { + _SSLPinningMode = SSLPinningMode; + + switch (self.SSLPinningMode) { + case AFSSLPinningModePublicKey: + case AFSSLPinningModeCertificate: + self.validatesDomainName = YES; + break; + default: + self.validatesDomainName = NO; + break; + } +} + +- (void)setPinnedCertificates:(NSArray *)pinnedCertificates { + _pinnedCertificates = pinnedCertificates; + + if (self.pinnedCertificates) { + NSMutableArray *mutablePinnedPublicKeys = [NSMutableArray arrayWithCapacity:[self.pinnedCertificates count]]; + for (NSData *certificate in self.pinnedCertificates) { + id publicKey = AFPublicKeyForCertificate(certificate); + if (!publicKey) { + continue; + } + [mutablePinnedPublicKeys addObject:publicKey]; + } + self.pinnedPublicKeys = [NSArray arrayWithArray:mutablePinnedPublicKeys]; + } else { + self.pinnedPublicKeys = nil; + } +} + +#pragma mark - + +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust { + return [self evaluateServerTrust:serverTrust forDomain:nil]; +} + +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust + forDomain:(NSString *)domain +{ + NSMutableArray *policies = [NSMutableArray array]; + if (self.validatesDomainName) { + [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; + } else { + [policies addObject:(__bridge_transfer id)SecPolicyCreateBasicX509()]; + } + + SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); + + if (self.SSLPinningMode != AFSSLPinningModeNone && !AFServerTrustIsValid(serverTrust) && !self.allowInvalidCertificates) { + return NO; + } + + NSArray *serverCertificates = AFCertificateTrustChainForServerTrust(serverTrust); + switch (self.SSLPinningMode) { + case AFSSLPinningModeNone: + return YES; + case AFSSLPinningModeCertificate: { + NSMutableArray *pinnedCertificates = [NSMutableArray array]; + for (NSData *certificateData in self.pinnedCertificates) { + [pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)]; + } + SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCertificates); + + if (!AFServerTrustIsValid(serverTrust)) { + return NO; + } + + if (!self.validatesCertificateChain) { + return YES; + } + + NSUInteger trustedCertificateCount = 0; + for (NSData *trustChainCertificate in serverCertificates) { + if ([self.pinnedCertificates containsObject:trustChainCertificate]) { + trustedCertificateCount++; + } + } + + return trustedCertificateCount == [serverCertificates count]; + } + case AFSSLPinningModePublicKey: { + NSUInteger trustedPublicKeyCount = 0; + NSArray *publicKeys = AFPublicKeyTrustChainForServerTrust(serverTrust); + if (!self.validatesCertificateChain && [publicKeys count] > 0) { + publicKeys = @[[publicKeys firstObject]]; + } + + for (id trustChainPublicKey in publicKeys) { + for (id pinnedPublicKey in self.pinnedPublicKeys) { + if (AFSecKeyIsEqualToKey((__bridge SecKeyRef)trustChainPublicKey, (__bridge SecKeyRef)pinnedPublicKey)) { + trustedPublicKeyCount += 1; + } + } + } + + return trustedPublicKeyCount > 0 && ((self.validatesCertificateChain && trustedPublicKeyCount == [serverCertificates count]) || (!self.validatesCertificateChain && trustedPublicKeyCount >= 1)); + } + } + + return NO; +} + +#pragma mark - NSKeyValueObserving + ++ (NSSet *)keyPathsForValuesAffectingPinnedPublicKeys { + return [NSSet setWithObject:@"pinnedCertificates"]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h new file mode 100644 index 0000000..7a5eccf --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.h @@ -0,0 +1,328 @@ +// AFURLConnectionOperation.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import +#import "AFURLRequestSerialization.h" +#import "AFURLResponseSerialization.h" +#import "AFSecurityPolicy.h" + +/** + `AFURLConnectionOperation` is a subclass of `NSOperation` that implements `NSURLConnection` delegate methods. + + ## Subclassing Notes + + This is the base class of all network request operations. You may wish to create your own subclass in order to implement additional `NSURLConnection` delegate methods (see "`NSURLConnection` Delegate Methods" below), or to provide additional properties and/or class constructors. + + If you are creating a subclass that communicates over the HTTP or HTTPS protocols, you may want to consider subclassing `AFHTTPRequestOperation` instead, as it supports specifying acceptable content types or status codes. + + ## NSURLConnection Delegate Methods + + `AFURLConnectionOperation` implements the following `NSURLConnection` delegate methods: + + - `connection:didReceiveResponse:` + - `connection:didReceiveData:` + - `connectionDidFinishLoading:` + - `connection:didFailWithError:` + - `connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:` + - `connection:willCacheResponse:` + - `connectionShouldUseCredentialStorage:` + - `connection:needNewBodyStream:` + - `connection:willSendRequestForAuthenticationChallenge:` + + If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first. + + ## Callbacks and Completion Blocks + + The built-in `completionBlock` provided by `NSOperation` allows for custom behavior to be executed after the request finishes. It is a common pattern for class constructors in subclasses to take callback block parameters, and execute them conditionally in the body of its `completionBlock`. Make sure to handle cancelled operations appropriately when setting a `completionBlock` (i.e. returning early before parsing response data). See the implementation of any of the `AFHTTPRequestOperation` subclasses for an example of this. + + Subclasses are strongly discouraged from overriding `setCompletionBlock:`, as `AFURLConnectionOperation`'s implementation includes a workaround to mitigate retain cycles, and what Apple rather ominously refers to as ["The Deallocation Problem"](http://developer.apple.com/library/ios/#technotes/tn2109/). + + ## SSL Pinning + + Relying on the CA trust model to validate SSL certificates exposes your app to security vulnerabilities, such as man-in-the-middle attacks. For applications that connect to known servers, SSL certificate pinning provides an increased level of security, by checking server certificate validity against those specified in the app bundle. + + SSL with certificate pinning is strongly recommended for any application that transmits sensitive information to an external webservice. + + Connections will be validated on all matching certificates with a `.cer` extension in the bundle root. + + ## App Extensions + + When using AFNetworking in an App Extension, `#define AF_APP_EXTENSIONS` to avoid using unavailable APIs. + + ## NSCoding & NSCopying Conformance + + `AFURLConnectionOperation` conforms to the `NSCoding` and `NSCopying` protocols, allowing operations to be archived to disk, and copied in memory, respectively. However, because of the intrinsic limitations of capturing the exact state of an operation at a particular moment, there are some important caveats to keep in mind: + + ### NSCoding Caveats + + - Encoded operations do not include any block or stream properties. Be sure to set `completionBlock`, `outputStream`, and any callback blocks as necessary when using `-initWithCoder:` or `NSKeyedUnarchiver`. + - Operations are paused on `encodeWithCoder:`. If the operation was encoded while paused or still executing, its archived state will return `YES` for `isReady`. Otherwise, the state of an operation when encoding will remain unchanged. + + ### NSCopying Caveats + + - `-copy` and `-copyWithZone:` return a new operation with the `NSURLRequest` of the original. So rather than an exact copy of the operation at that particular instant, the copying mechanism returns a completely new instance, which can be useful for retrying operations. + - A copy of an operation will not include the `outputStream` of the original. + - Operation copies do not include `completionBlock`, as it often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ operation when copied. + */ + +@interface AFURLConnectionOperation : NSOperation + +///------------------------------- +/// @name Accessing Run Loop Modes +///------------------------------- + +/** + The run loop modes in which the operation will run on the network thread. By default, this is a single-member set containing `NSRunLoopCommonModes`. + */ +@property (nonatomic, strong) NSSet *runLoopModes; + +///----------------------------------------- +/// @name Getting URL Connection Information +///----------------------------------------- + +/** + The request used by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSURLRequest *request; + +/** + The last response received by the operation's connection. + */ +@property (readonly, nonatomic, strong) NSURLResponse *response; + +/** + The error, if any, that occurred in the lifecycle of the request. + */ +@property (readonly, nonatomic, strong) NSError *error; + +///---------------------------- +/// @name Getting Response Data +///---------------------------- + +/** + The data received during the request. + */ +@property (readonly, nonatomic, strong) NSData *responseData; + +/** + The string representation of the response data. + */ +@property (readonly, nonatomic, copy) NSString *responseString; + +/** + The string encoding of the response. + + If the response does not specify a valid string encoding, `responseStringEncoding` will return `NSUTF8StringEncoding`. + */ +@property (readonly, nonatomic, assign) NSStringEncoding responseStringEncoding; + +///------------------------------- +/// @name Managing URL Credentials +///------------------------------- + +/** + Whether the URL connection should consult the credential storage for authenticating the connection. `YES` by default. + + This is the value that is returned in the `NSURLConnectionDelegate` method `-connectionShouldUseCredentialStorage:`. + */ +@property (nonatomic, assign) BOOL shouldUseCredentialStorage; + +/** + The credential used for authentication challenges in `-connection:didReceiveAuthenticationChallenge:`. + + This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. + */ +@property (nonatomic, strong) NSURLCredential *credential; + +///------------------------------- +/// @name Managing Security Policy +///------------------------------- + +/** + The security policy used to evaluate server trust for secure connections. + */ +@property (nonatomic, strong) AFSecurityPolicy *securityPolicy; + +///------------------------ +/// @name Accessing Streams +///------------------------ + +/** + The input stream used to read data to be sent during the request. + + This property acts as a proxy to the `HTTPBodyStream` property of `request`. + */ +@property (nonatomic, strong) NSInputStream *inputStream; + +/** + The output stream that is used to write data received until the request is finished. + + By default, data is accumulated into a buffer that is stored into `responseData` upon completion of the request, with the intermediary `outputStream` property set to `nil`. When `outputStream` is set, the data will not be accumulated into an internal buffer, and as a result, the `responseData` property of the completed request will be `nil`. The output stream will be scheduled in the network thread runloop upon being set. + */ +@property (nonatomic, strong) NSOutputStream *outputStream; + +///--------------------------------- +/// @name Managing Callback Queues +///--------------------------------- + +/** + The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used. + */ +@property (nonatomic, strong) dispatch_queue_t completionQueue; + +/** + The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used. + */ +@property (nonatomic, strong) dispatch_group_t completionGroup; + +///--------------------------------------------- +/// @name Managing Request Operation Information +///--------------------------------------------- + +/** + The user info dictionary for the receiver. + */ +@property (nonatomic, strong) NSDictionary *userInfo; + +///------------------------------------------------------ +/// @name Initializing an AFURLConnectionOperation Object +///------------------------------------------------------ + +/** + Initializes and returns a newly allocated operation object with a url connection configured with the specified url request. + + This is the designated initializer. + + @param urlRequest The request object to be used by the operation connection. + */ +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest NS_DESIGNATED_INITIALIZER; + +///---------------------------------- +/// @name Pausing / Resuming Requests +///---------------------------------- + +/** + Pauses the execution of the request operation. + + A paused operation returns `NO` for `-isReady`, `-isExecuting`, and `-isFinished`. As such, it will remain in an `NSOperationQueue` until it is either cancelled or resumed. Pausing a finished, cancelled, or paused operation has no effect. + */ +- (void)pause; + +/** + Whether the request operation is currently paused. + + @return `YES` if the operation is currently paused, otherwise `NO`. + */ +- (BOOL)isPaused; + +/** + Resumes the execution of the paused request operation. + + Pause/Resume behavior varies depending on the underlying implementation for the operation class. In its base implementation, resuming a paused requests restarts the original request. However, since HTTP defines a specification for how to request a specific content range, `AFHTTPRequestOperation` will resume downloading the request from where it left off, instead of restarting the original request. + */ +- (void)resume; + +///---------------------------------------------- +/// @name Configuring Backgrounding Task Behavior +///---------------------------------------------- + +/** + Specifies that the operation should continue execution after the app has entered the background, and the expiration handler for that background task. + + @param handler A handler to be called shortly before the application’s remaining background time reaches 0. The handler is wrapped in a block that cancels the operation, and cleans up and marks the end of execution, unlike the `handler` parameter in `UIApplication -beginBackgroundTaskWithExpirationHandler:`, which expects this to be done in the handler itself. The handler is called synchronously on the main thread, thus blocking the application’s suspension momentarily while the application is notified. + */ +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) +- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(void (^)(void))handler; +#endif + +///--------------------------------- +/// @name Setting Progress Callbacks +///--------------------------------- + +/** + Sets a callback to be called when an undetermined number of bytes have been uploaded to the server. + + @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes three arguments: the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block; + +/** + Sets a callback to be called when an undetermined number of bytes have been downloaded from the server. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block; + +///------------------------------------------------- +/// @name Setting NSURLConnection Delegate Callbacks +///------------------------------------------------- + +/** + Sets a block to be executed when the connection will authenticate a challenge in order to download its request, as handled by the `NSURLConnectionDelegate` method `connection:willSendRequestForAuthenticationChallenge:`. + + @param block A block object to be executed when the connection will authenticate a challenge in order to download its request. The block has no return type and takes two arguments: the URL connection object, and the challenge that must be authenticated. This block must invoke one of the challenge-responder methods (NSURLAuthenticationChallengeSender protocol). + + If `allowsInvalidSSLCertificate` is set to YES, `connection:willSendRequestForAuthenticationChallenge:` will attempt to have the challenge sender use credentials with invalid SSL certificates. + */ +- (void)setWillSendRequestForAuthenticationChallengeBlock:(void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block; + +/** + Sets a block to be executed when the server redirects the request from one URL to another URL, or when the request URL changed by the `NSURLProtocol` subclass handling the request in order to standardize its format, as handled by the `NSURLConnectionDataDelegate` method `connection:willSendRequest:redirectResponse:`. + + @param block A block object to be executed when the request URL was changed. The block returns an `NSURLRequest` object, the URL request to redirect, and takes three arguments: the URL connection object, the the proposed redirected request, and the URL response that caused the redirect. + */ +- (void)setRedirectResponseBlock:(NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block; + + +/** + Sets a block to be executed to modify the response a connection will cache, if any, as handled by the `NSURLConnectionDelegate` method `connection:willCacheResponse:`. + + @param block A block object to be executed to determine what response a connection will cache, if any. The block returns an `NSCachedURLResponse` object, the cached response to store in memory or `nil` to prevent the response from being cached, and takes two arguments: the URL connection object, and the cached response provided for the request. + */ +- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block; + +/// + +/** + + */ ++ (NSArray *)batchOfRequestOperations:(NSArray *)operations + progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(void (^)(NSArray *operations))completionBlock; + +@end + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when an operation begins executing. + */ +extern NSString * const AFNetworkingOperationDidStartNotification; + +/** + Posted when an operation finishes. + */ +extern NSString * const AFNetworkingOperationDidFinishNotification; diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m new file mode 100644 index 0000000..becfb83 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLConnectionOperation.m @@ -0,0 +1,789 @@ +// AFURLConnectionOperation.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFURLConnectionOperation.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +#if !__has_feature(objc_arc) +#error AFNetworking must be built with ARC. +// You can turn on ARC for only AFNetworking files by adding -fobjc-arc to the build phase for each of its files. +#endif + +typedef NS_ENUM(NSInteger, AFOperationState) { + AFOperationPausedState = -1, + AFOperationReadyState = 1, + AFOperationExecutingState = 2, + AFOperationFinishedState = 3, +}; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) +typedef UIBackgroundTaskIdentifier AFBackgroundTaskIdentifier; +#else +typedef id AFBackgroundTaskIdentifier; +#endif + +static dispatch_group_t url_request_operation_completion_group() { + static dispatch_group_t af_url_request_operation_completion_group; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_request_operation_completion_group = dispatch_group_create(); + }); + + return af_url_request_operation_completion_group; +} + +static dispatch_queue_t url_request_operation_completion_queue() { + static dispatch_queue_t af_url_request_operation_completion_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_request_operation_completion_queue = dispatch_queue_create("com.alamofire.networking.operation.queue", DISPATCH_QUEUE_CONCURRENT ); + }); + + return af_url_request_operation_completion_queue; +} + +static NSString * const kAFNetworkingLockName = @"com.alamofire.networking.operation.lock"; + +NSString * const AFNetworkingOperationDidStartNotification = @"com.alamofire.networking.operation.start"; +NSString * const AFNetworkingOperationDidFinishNotification = @"com.alamofire.networking.operation.finish"; + +typedef void (^AFURLConnectionOperationProgressBlock)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +typedef void (^AFURLConnectionOperationAuthenticationChallengeBlock)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge); +typedef NSCachedURLResponse * (^AFURLConnectionOperationCacheResponseBlock)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse); +typedef NSURLRequest * (^AFURLConnectionOperationRedirectResponseBlock)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse); + +static inline NSString * AFKeyPathFromOperationState(AFOperationState state) { + switch (state) { + case AFOperationReadyState: + return @"isReady"; + case AFOperationExecutingState: + return @"isExecuting"; + case AFOperationFinishedState: + return @"isFinished"; + case AFOperationPausedState: + return @"isPaused"; + default: { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" + return @"state"; +#pragma clang diagnostic pop + } + } +} + +static inline BOOL AFStateTransitionIsValid(AFOperationState fromState, AFOperationState toState, BOOL isCancelled) { + switch (fromState) { + case AFOperationReadyState: + switch (toState) { + case AFOperationPausedState: + case AFOperationExecutingState: + return YES; + case AFOperationFinishedState: + return isCancelled; + default: + return NO; + } + case AFOperationExecutingState: + switch (toState) { + case AFOperationPausedState: + case AFOperationFinishedState: + return YES; + default: + return NO; + } + case AFOperationFinishedState: + return NO; + case AFOperationPausedState: + return toState == AFOperationReadyState; + default: { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunreachable-code" + switch (toState) { + case AFOperationPausedState: + case AFOperationReadyState: + case AFOperationExecutingState: + case AFOperationFinishedState: + return YES; + default: + return NO; + } + } +#pragma clang diagnostic pop + } +} + +@interface AFURLConnectionOperation () +@property (readwrite, nonatomic, assign) AFOperationState state; +@property (readwrite, nonatomic, strong) NSRecursiveLock *lock; +@property (readwrite, nonatomic, strong) NSURLConnection *connection; +@property (readwrite, nonatomic, strong) NSURLRequest *request; +@property (readwrite, nonatomic, strong) NSURLResponse *response; +@property (readwrite, nonatomic, strong) NSError *error; +@property (readwrite, nonatomic, strong) NSData *responseData; +@property (readwrite, nonatomic, copy) NSString *responseString; +@property (readwrite, nonatomic, assign) NSStringEncoding responseStringEncoding; +@property (readwrite, nonatomic, assign) long long totalBytesRead; +@property (readwrite, nonatomic, assign) AFBackgroundTaskIdentifier backgroundTaskIdentifier; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationProgressBlock uploadProgress; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationProgressBlock downloadProgress; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationAuthenticationChallengeBlock authenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationCacheResponseBlock cacheResponse; +@property (readwrite, nonatomic, copy) AFURLConnectionOperationRedirectResponseBlock redirectResponse; + +- (void)operationDidStart; +- (void)finish; +- (void)cancelConnection; +@end + +@implementation AFURLConnectionOperation +@synthesize outputStream = _outputStream; + ++ (void)networkRequestThreadEntryPoint:(id)__unused object { + @autoreleasepool { + [[NSThread currentThread] setName:@"AFNetworking"]; + + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; + [runLoop run]; + } +} + ++ (NSThread *)networkRequestThread { + static NSThread *_networkRequestThread = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil]; + [_networkRequestThread start]; + }); + + return _networkRequestThread; +} + +- (instancetype)initWithRequest:(NSURLRequest *)urlRequest { + NSParameterAssert(urlRequest); + + self = [super init]; + if (!self) { + return nil; + } + + _state = AFOperationReadyState; + + self.lock = [[NSRecursiveLock alloc] init]; + self.lock.name = kAFNetworkingLockName; + + self.runLoopModes = [NSSet setWithObject:NSRunLoopCommonModes]; + + self.request = urlRequest; + + self.shouldUseCredentialStorage = YES; + + self.securityPolicy = [AFSecurityPolicy defaultPolicy]; + + return self; +} + +- (void)dealloc { + if (_outputStream) { + [_outputStream close]; + _outputStream = nil; + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) + if (_backgroundTaskIdentifier) { + [[UIApplication sharedApplication] endBackgroundTask:_backgroundTaskIdentifier]; + _backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } +#endif +} + +#pragma mark - + +- (void)setResponseData:(NSData *)responseData { + [self.lock lock]; + if (!responseData) { + _responseData = nil; + } else { + _responseData = [NSData dataWithBytes:responseData.bytes length:responseData.length]; + } + [self.lock unlock]; +} + +- (NSString *)responseString { + [self.lock lock]; + if (!_responseString && self.response && self.responseData) { + self.responseString = [[NSString alloc] initWithData:self.responseData encoding:self.responseStringEncoding]; + } + [self.lock unlock]; + + return _responseString; +} + +- (NSStringEncoding)responseStringEncoding { + [self.lock lock]; + if (!_responseStringEncoding && self.response) { + NSStringEncoding stringEncoding = NSUTF8StringEncoding; + if (self.response.textEncodingName) { + CFStringEncoding IANAEncoding = CFStringConvertIANACharSetNameToEncoding((__bridge CFStringRef)self.response.textEncodingName); + if (IANAEncoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(IANAEncoding); + } + } + + self.responseStringEncoding = stringEncoding; + } + [self.lock unlock]; + + return _responseStringEncoding; +} + +- (NSInputStream *)inputStream { + return self.request.HTTPBodyStream; +} + +- (void)setInputStream:(NSInputStream *)inputStream { + NSMutableURLRequest *mutableRequest = [self.request mutableCopy]; + mutableRequest.HTTPBodyStream = inputStream; + self.request = mutableRequest; +} + +- (NSOutputStream *)outputStream { + if (!_outputStream) { + self.outputStream = [NSOutputStream outputStreamToMemory]; + } + + return _outputStream; +} + +- (void)setOutputStream:(NSOutputStream *)outputStream { + [self.lock lock]; + if (outputStream != _outputStream) { + if (_outputStream) { + [_outputStream close]; + } + + _outputStream = outputStream; + } + [self.lock unlock]; +} + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && !defined(AF_APP_EXTENSIONS) +- (void)setShouldExecuteAsBackgroundTaskWithExpirationHandler:(void (^)(void))handler { + [self.lock lock]; + if (!self.backgroundTaskIdentifier) { + UIApplication *application = [UIApplication sharedApplication]; + __weak __typeof(self)weakSelf = self; + self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{ + __strong __typeof(weakSelf)strongSelf = weakSelf; + + if (handler) { + handler(); + } + + if (strongSelf) { + [strongSelf cancel]; + + [application endBackgroundTask:strongSelf.backgroundTaskIdentifier]; + strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid; + } + }]; + } + [self.lock unlock]; +} +#endif + +#pragma mark - + +- (void)setState:(AFOperationState)state { + if (!AFStateTransitionIsValid(self.state, state, [self isCancelled])) { + return; + } + + [self.lock lock]; + NSString *oldStateKey = AFKeyPathFromOperationState(self.state); + NSString *newStateKey = AFKeyPathFromOperationState(state); + + [self willChangeValueForKey:newStateKey]; + [self willChangeValueForKey:oldStateKey]; + _state = state; + [self didChangeValueForKey:oldStateKey]; + [self didChangeValueForKey:newStateKey]; + [self.lock unlock]; +} + +- (void)pause { + if ([self isPaused] || [self isFinished] || [self isCancelled]) { + return; + } + + [self.lock lock]; + if ([self isExecuting]) { + [self performSelector:@selector(operationDidPause) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + + dispatch_async(dispatch_get_main_queue(), ^{ + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:AFNetworkingOperationDidFinishNotification object:self]; + }); + } + + self.state = AFOperationPausedState; + [self.lock unlock]; +} + +- (void)operationDidPause { + [self.lock lock]; + [self.connection cancel]; + [self.lock unlock]; +} + +- (BOOL)isPaused { + return self.state == AFOperationPausedState; +} + +- (void)resume { + if (![self isPaused]) { + return; + } + + [self.lock lock]; + self.state = AFOperationReadyState; + + [self start]; + [self.lock unlock]; +} + +#pragma mark - + +- (void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block { + self.uploadProgress = block; +} + +- (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead))block { + self.downloadProgress = block; +} + +- (void)setWillSendRequestForAuthenticationChallengeBlock:(void (^)(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge))block { + self.authenticationChallenge = block; +} + +- (void)setCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLConnection *connection, NSCachedURLResponse *cachedResponse))block { + self.cacheResponse = block; +} + +- (void)setRedirectResponseBlock:(NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block { + self.redirectResponse = block; +} + +#pragma mark - NSOperation + +- (void)setCompletionBlock:(void (^)(void))block { + [self.lock lock]; + if (!block) { + [super setCompletionBlock:nil]; + } else { + __weak __typeof(self)weakSelf = self; + [super setCompletionBlock:^ { + __strong __typeof(weakSelf)strongSelf = weakSelf; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_group_t group = strongSelf.completionGroup ?: url_request_operation_completion_group(); + dispatch_queue_t queue = strongSelf.completionQueue ?: dispatch_get_main_queue(); +#pragma clang diagnostic pop + + dispatch_group_async(group, queue, ^{ + block(); + }); + + dispatch_group_notify(group, url_request_operation_completion_queue(), ^{ + [strongSelf setCompletionBlock:nil]; + }); + }]; + } + [self.lock unlock]; +} + +- (BOOL)isReady { + return self.state == AFOperationReadyState && [super isReady]; +} + +- (BOOL)isExecuting { + return self.state == AFOperationExecutingState; +} + +- (BOOL)isFinished { + return self.state == AFOperationFinishedState; +} + +- (BOOL)isConcurrent { + return YES; +} + +- (void)start { + [self.lock lock]; + if ([self isCancelled]) { + [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } else if ([self isReady]) { + self.state = AFOperationExecutingState; + + [self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } + [self.lock unlock]; +} + +- (void)operationDidStart { + [self.lock lock]; + if (![self isCancelled]) { + self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO]; + + NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; + for (NSString *runLoopMode in self.runLoopModes) { + [self.connection scheduleInRunLoop:runLoop forMode:runLoopMode]; + [self.outputStream scheduleInRunLoop:runLoop forMode:runLoopMode]; + } + + [self.outputStream open]; + [self.connection start]; + } + [self.lock unlock]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingOperationDidStartNotification object:self]; + }); +} + +- (void)finish { + [self.lock lock]; + self.state = AFOperationFinishedState; + [self.lock unlock]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingOperationDidFinishNotification object:self]; + }); +} + +- (void)cancel { + [self.lock lock]; + if (![self isFinished] && ![self isCancelled]) { + [super cancel]; + + if ([self isExecuting]) { + [self performSelector:@selector(cancelConnection) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]]; + } + } + [self.lock unlock]; +} + +- (void)cancelConnection { + NSDictionary *userInfo = nil; + if ([self.request URL]) { + userInfo = [NSDictionary dictionaryWithObject:[self.request URL] forKey:NSURLErrorFailingURLErrorKey]; + } + NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled userInfo:userInfo]; + + if (![self isFinished]) { + if (self.connection) { + [self.connection cancel]; + [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:error]; + } else { + // Accomodate race condition where `self.connection` has not yet been set before cancellation + self.error = error; + [self finish]; + } + } +} + +#pragma mark - + ++ (NSArray *)batchOfRequestOperations:(NSArray *)operations + progressBlock:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progressBlock + completionBlock:(void (^)(NSArray *operations))completionBlock +{ + if (!operations || [operations count] == 0) { + return @[[NSBlockOperation blockOperationWithBlock:^{ + dispatch_async(dispatch_get_main_queue(), ^{ + if (completionBlock) { + completionBlock(@[]); + } + }); + }]]; + } + + __block dispatch_group_t group = dispatch_group_create(); + NSBlockOperation *batchedOperation = [NSBlockOperation blockOperationWithBlock:^{ + dispatch_group_notify(group, dispatch_get_main_queue(), ^{ + if (completionBlock) { + completionBlock(operations); + } + }); + }]; + + for (AFURLConnectionOperation *operation in operations) { + operation.completionGroup = group; + void (^originalCompletionBlock)(void) = [operation.completionBlock copy]; + __weak __typeof(operation)weakOperation = operation; + operation.completionBlock = ^{ + __strong __typeof(weakOperation)strongOperation = weakOperation; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + dispatch_queue_t queue = strongOperation.completionQueue ?: dispatch_get_main_queue(); +#pragma clang diagnostic pop + dispatch_group_async(group, queue, ^{ + if (originalCompletionBlock) { + originalCompletionBlock(); + } + + NSUInteger numberOfFinishedOperations = [[operations indexesOfObjectsPassingTest:^BOOL(id op, NSUInteger __unused idx, BOOL __unused *stop) { + return [op isFinished]; + }] count]; + + if (progressBlock) { + progressBlock(numberOfFinishedOperations, [operations count]); + } + + dispatch_group_leave(group); + }); + }; + + dispatch_group_enter(group); + [batchedOperation addDependency:operation]; + } + + return [operations arrayByAddingObject:batchedOperation]; +} + +#pragma mark - NSObject + +- (NSString *)description { + [self.lock lock]; + NSString *description = [NSString stringWithFormat:@"<%@: %p, state: %@, cancelled: %@ request: %@, response: %@>", NSStringFromClass([self class]), self, AFKeyPathFromOperationState(self.state), ([self isCancelled] ? @"YES" : @"NO"), self.request, self.response]; + [self.lock unlock]; + return description; +} + +#pragma mark - NSURLConnectionDelegate + +- (void)connection:(NSURLConnection *)connection +willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge +{ + if (self.authenticationChallenge) { + self.authenticationChallenge(connection, challenge); + return; + } + + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + } else { + [[challenge sender] cancelAuthenticationChallenge:challenge]; + } + } else { + if ([challenge previousFailureCount] == 0) { + if (self.credential) { + [[challenge sender] useCredential:self.credential forAuthenticationChallenge:challenge]; + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } +} + +- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection __unused *)connection { + return self.shouldUseCredentialStorage; +} + +- (NSURLRequest *)connection:(NSURLConnection *)connection + willSendRequest:(NSURLRequest *)request + redirectResponse:(NSURLResponse *)redirectResponse +{ + if (self.redirectResponse) { + return self.redirectResponse(connection, request, redirectResponse); + } else { + return request; + } +} + +- (void)connection:(NSURLConnection __unused *)connection + didSendBodyData:(NSInteger)bytesWritten + totalBytesWritten:(NSInteger)totalBytesWritten +totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite +{ + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.uploadProgress) { + self.uploadProgress((NSUInteger)bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } + }); +} + +- (void)connection:(NSURLConnection __unused *)connection +didReceiveResponse:(NSURLResponse *)response +{ + self.response = response; +} + +- (void)connection:(NSURLConnection __unused *)connection + didReceiveData:(NSData *)data +{ + NSUInteger length = [data length]; + while (YES) { + NSInteger totalNumberOfBytesWritten = 0; + if ([self.outputStream hasSpaceAvailable]) { + const uint8_t *dataBuffer = (uint8_t *)[data bytes]; + + NSInteger numberOfBytesWritten = 0; + while (totalNumberOfBytesWritten < (NSInteger)length) { + numberOfBytesWritten = [self.outputStream write:&dataBuffer[(NSUInteger)totalNumberOfBytesWritten] maxLength:(length - (NSUInteger)totalNumberOfBytesWritten)]; + if (numberOfBytesWritten == -1) { + break; + } + + totalNumberOfBytesWritten += numberOfBytesWritten; + } + + break; + } + + if (self.outputStream.streamError) { + [self.connection cancel]; + [self performSelector:@selector(connection:didFailWithError:) withObject:self.connection withObject:self.outputStream.streamError]; + return; + } + } + + dispatch_async(dispatch_get_main_queue(), ^{ + self.totalBytesRead += (long long)length; + + if (self.downloadProgress) { + self.downloadProgress(length, self.totalBytesRead, self.response.expectedContentLength); + } + }); +} + +- (void)connectionDidFinishLoading:(NSURLConnection __unused *)connection { + self.responseData = [self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; + + [self.outputStream close]; + if (self.responseData) { + self.outputStream = nil; + } + + self.connection = nil; + + [self finish]; +} + +- (void)connection:(NSURLConnection __unused *)connection + didFailWithError:(NSError *)error +{ + self.error = error; + + [self.outputStream close]; + if (self.responseData) { + self.outputStream = nil; + } + + self.connection = nil; + + [self finish]; +} + +- (NSCachedURLResponse *)connection:(NSURLConnection *)connection + willCacheResponse:(NSCachedURLResponse *)cachedResponse +{ + if (self.cacheResponse) { + return self.cacheResponse(connection, cachedResponse); + } else { + if ([self isCancelled]) { + return nil; + } + + return cachedResponse; + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURLRequest *request = [decoder decodeObjectOfClass:[NSURLRequest class] forKey:NSStringFromSelector(@selector(request))]; + + self = [self initWithRequest:request]; + if (!self) { + return nil; + } + + self.state = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(state))] integerValue]; + self.response = [decoder decodeObjectOfClass:[NSHTTPURLResponse class] forKey:NSStringFromSelector(@selector(response))]; + self.error = [decoder decodeObjectOfClass:[NSError class] forKey:NSStringFromSelector(@selector(error))]; + self.responseData = [decoder decodeObjectOfClass:[NSData class] forKey:NSStringFromSelector(@selector(responseData))]; + self.totalBytesRead = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(totalBytesRead))] longLongValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [self pause]; + + [coder encodeObject:self.request forKey:NSStringFromSelector(@selector(request))]; + + switch (self.state) { + case AFOperationExecutingState: + case AFOperationPausedState: + [coder encodeInteger:AFOperationReadyState forKey:NSStringFromSelector(@selector(state))]; + break; + default: + [coder encodeInteger:self.state forKey:NSStringFromSelector(@selector(state))]; + break; + } + + [coder encodeObject:self.response forKey:NSStringFromSelector(@selector(response))]; + [coder encodeObject:self.error forKey:NSStringFromSelector(@selector(error))]; + [coder encodeObject:self.responseData forKey:NSStringFromSelector(@selector(responseData))]; + [coder encodeInt64:self.totalBytesRead forKey:NSStringFromSelector(@selector(totalBytesRead))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFURLConnectionOperation *operation = [(AFURLConnectionOperation *)[[self class] allocWithZone:zone] initWithRequest:self.request]; + + operation.uploadProgress = self.uploadProgress; + operation.downloadProgress = self.downloadProgress; + operation.authenticationChallenge = self.authenticationChallenge; + operation.cacheResponse = self.cacheResponse; + operation.redirectResponse = self.redirectResponse; + operation.completionQueue = self.completionQueue; + operation.completionGroup = self.completionGroup; + + return operation; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h new file mode 100644 index 0000000..e60a267 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.h @@ -0,0 +1,468 @@ +// AFURLRequestSerialization.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#endif + +/** + The `AFURLRequestSerialization` protocol is adopted by an object that encodes parameters for a specified HTTP requests. Request serializers may encode parameters as query strings, HTTP bodies, setting the appropriate HTTP header fields as necessary. + + For example, a JSON request serializer may set the HTTP body of the request to a JSON representation, and set the `Content-Type` HTTP header field value to `application/json`. + */ +@protocol AFURLRequestSerialization + +/** + Returns a request with the specified parameters encoded into a copy of the original request. + + @param request The original request. + @param parameters The parameters to be encoded. + @param error The error that occurred while attempting to encode the request parameters. + + @return A serialized request. + */ +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError * __autoreleasing *)error; + +@end + +#pragma mark - + +/** + + */ +typedef NS_ENUM(NSUInteger, AFHTTPRequestQueryStringSerializationStyle) { + AFHTTPRequestQueryStringDefaultStyle = 0, +}; + +@protocol AFMultipartFormData; + +/** + `AFHTTPRequestSerializer` conforms to the `AFURLRequestSerialization` & `AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation. + + Any request or response serializer dealing with HTTP is encouraged to subclass `AFHTTPRequestSerializer` in order to ensure consistent default behavior. + */ +@interface AFHTTPRequestSerializer : NSObject + +/** + The string encoding used to serialize parameters. `NSUTF8StringEncoding` by default. + */ +@property (nonatomic, assign) NSStringEncoding stringEncoding; + +/** + Whether created requests can use the device’s cellular radio (if present). `YES` by default. + + @see NSMutableURLRequest -setAllowsCellularAccess: + */ +@property (nonatomic, assign) BOOL allowsCellularAccess; + +/** + The cache policy of created requests. `NSURLRequestUseProtocolCachePolicy` by default. + + @see NSMutableURLRequest -setCachePolicy: + */ +@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy; + +/** + Whether created requests should use the default cookie handling. `YES` by default. + + @see NSMutableURLRequest -setHTTPShouldHandleCookies: + */ +@property (nonatomic, assign) BOOL HTTPShouldHandleCookies; + +/** + Whether created requests can continue transmitting data before receiving a response from an earlier transmission. `NO` by default + + @see NSMutableURLRequest -setHTTPShouldUsePipelining: + */ +@property (nonatomic, assign) BOOL HTTPShouldUsePipelining; + +/** + The network service type for created requests. `NSURLNetworkServiceTypeDefault` by default. + + @see NSMutableURLRequest -setNetworkServiceType: + */ +@property (nonatomic, assign) NSURLRequestNetworkServiceType networkServiceType; + +/** + The timeout interval, in seconds, for created requests. The default timeout interval is 60 seconds. + + @see NSMutableURLRequest -setTimeoutInterval: + */ +@property (nonatomic, assign) NSTimeInterval timeoutInterval; + +///--------------------------------------- +/// @name Configuring HTTP Request Headers +///--------------------------------------- + +/** + Default HTTP header field values to be applied to serialized requests. By default, these include the following: + + - `Accept-Language` with the contents of `NSLocale +preferredLanguages` + - `User-Agent` with the contents of various bundle identifiers and OS designations + + @discussion To add or remove default request headers, use `setValue:forHTTPHeaderField:`. + */ +@property (readonly, nonatomic, strong) NSDictionary *HTTPRequestHeaders; + +/** + Creates and returns a serializer with default configuration. + */ ++ (instancetype)serializer; + +/** + Sets the value for the HTTP headers set in request objects made by the HTTP client. If `nil`, removes the existing value for that header. + + @param field The HTTP header to set a default value for + @param value The value set as default for the specified header, or `nil` + */ +- (void)setValue:(NSString *)value +forHTTPHeaderField:(NSString *)field; + +/** + Returns the value for the HTTP headers set in the request serializer. + + @param field The HTTP header to retrieve the default value for + + @return The value set as default for the specified header, or `nil` + */ +- (NSString *)valueForHTTPHeaderField:(NSString *)field; + +/** + Sets the "Authorization" HTTP header set in request objects made by the HTTP client to a basic authentication value with Base64-encoded username and password. This overwrites any existing value for this header. + + @param username The HTTP basic auth username + @param password The HTTP basic auth password + */ +- (void)setAuthorizationHeaderFieldWithUsername:(NSString *)username + password:(NSString *)password; + +/** + @deprecated This method has been deprecated. Use -setValue:forHTTPHeaderField: instead. + */ +- (void)setAuthorizationHeaderFieldWithToken:(NSString *)token DEPRECATED_ATTRIBUTE; + + +/** + Clears any existing value for the "Authorization" HTTP header. + */ +- (void)clearAuthorizationHeader; + +///------------------------------------------------------- +/// @name Configuring Query String Parameter Serialization +///------------------------------------------------------- + +/** + HTTP methods for which serialized requests will encode parameters as a query string. `GET`, `HEAD`, and `DELETE` by default. + */ +@property (nonatomic, strong) NSSet *HTTPMethodsEncodingParametersInURI; + +/** + Set the method of query string serialization according to one of the pre-defined styles. + + @param style The serialization style. + + @see AFHTTPRequestQueryStringSerializationStyle + */ +- (void)setQueryStringSerializationWithStyle:(AFHTTPRequestQueryStringSerializationStyle)style; + +/** + Set the a custom method of query string serialization according to the specified block. + + @param block A block that defines a process of encoding parameters into a query string. This block returns the query string and takes three arguments: the request, the parameters to encode, and the error that occurred when attempting to encode parameters for the given request. + */ +- (void)setQueryStringSerializationWithBlock:(NSString * (^)(NSURLRequest *request, id parameters, NSError * __autoreleasing *error))block; + +///------------------------------- +/// @name Creating Request Objects +///------------------------------- + +/** + @deprecated This method has been deprecated. Use -requestWithMethod:URLString:parameters:error: instead. + */ +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters DEPRECATED_ATTRIBUTE; + +/** + Creates an `NSMutableURLRequest` object with the specified HTTP method and URL string. + + If the HTTP method is `GET`, `HEAD`, or `DELETE`, the parameters will be used to construct a url-encoded query string that is appended to the request's URL. Otherwise, the parameters will be encoded according to the value of the `parameterEncoding` property, and set as the request body. + + @param method The HTTP method for the request, such as `GET`, `POST`, `PUT`, or `DELETE`. This parameter must not be `nil`. + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be either set as a query string for `GET` requests, or the request HTTP body. + @param error The error that occured while constructing the request. + + @return An `NSMutableURLRequest` object. + */ +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + error:(NSError * __autoreleasing *)error; + +/** + @deprecated This method has been deprecated. Use -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error: instead. + */ +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block DEPRECATED_ATTRIBUTE; + +/** + Creates an `NSMutableURLRequest` object with the specified HTTP method and URLString, and constructs a `multipart/form-data` HTTP body, using the specified parameters and multipart form data block. See http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2 + + Multipart form requests are automatically streamed, reading files directly from disk along with in-memory data in a single HTTP body. The resulting `NSMutableURLRequest` object has an `HTTPBodyStream` property, so refrain from setting `HTTPBodyStream` or `HTTPBody` on this request object, as it will clear out the multipart form body stream. + + @param method The HTTP method for the request. This parameter must not be `GET` or `HEAD`, or `nil`. + @param URLString The URL string used to create the request URL. + @param parameters The parameters to be encoded and set in the request HTTP body. + @param block A block that takes a single argument and appends data to the HTTP body. The block argument is an object adopting the `AFMultipartFormData` protocol. + @param error The error that occured while constructing the request. + + @return An `NSMutableURLRequest` object + */ +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block + error:(NSError * __autoreleasing *)error; + +/** + Creates an `NSMutableURLRequest` by removing the `HTTPBodyStream` from a request, and asynchronously writing its contents into the specified file, invoking the completion handler when finished. + + @param request The multipart form request. The `HTTPBodyStream` property of `request` must not be `nil`. + @param fileURL The file URL to write multipart form contents to. + @param handler A handler block to execute. + + @discussion There is a bug in `NSURLSessionTask` that causes requests to not send a `Content-Length` header when streaming contents from an HTTP body, which is notably problematic when interacting with the Amazon S3 webservice. As a workaround, this method takes a request constructed with `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:`, or any other request with an `HTTPBodyStream`, writes the contents to the specified file and returns a copy of the original request with the `HTTPBodyStream` property set to `nil`. From here, the file can either be passed to `AFURLSessionManager -uploadTaskWithRequest:fromFile:progress:completionHandler:`, or have its contents read into an `NSData` that's assigned to the `HTTPBody` property of the request. + + @see https://github.com/AFNetworking/AFNetworking/issues/1398 + */ +- (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request + writingStreamContentsToFile:(NSURL *)fileURL + completionHandler:(void (^)(NSError *error))handler; + +@end + +#pragma mark - + +/** + The `AFMultipartFormData` protocol defines the methods supported by the parameter in the block argument of `AFHTTPRequestSerializer -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:`. + */ +@protocol AFMultipartFormData + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{generated filename}; name=#{name}"` and `Content-Type: #{generated mimeType}`, followed by the encoded file data and the multipart form boundary. + + The filename and MIME type for this data in the form will be automatically generated, using the last path component of the `fileURL` and system associated MIME type for the `fileURL` extension, respectively. + + @param fileURL The URL corresponding to the file whose content will be appended to the form. This parameter must not be `nil`. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param error If an error occurs, upon return contains an `NSError` object that describes the problem. + + @return `YES` if the file data was successfully appended, otherwise `NO`. + */ +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + error:(NSError * __autoreleasing *)error; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary. + + @param fileURL The URL corresponding to the file whose content will be appended to the form. This parameter must not be `nil`. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param fileName The file name to be used in the `Content-Disposition` header. This parameter must not be `nil`. + @param mimeType The declared MIME type of the file data. This parameter must not be `nil`. + @param error If an error occurs, upon return contains an `NSError` object that describes the problem. + + @return `YES` if the file data was successfully appended otherwise `NO`. + */ +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType + error:(NSError * __autoreleasing *)error; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the data from the input stream and the multipart form boundary. + + @param inputStream The input stream to be appended to the form data + @param name The name to be associated with the specified input stream. This parameter must not be `nil`. + @param fileName The filename to be associated with the specified input stream. This parameter must not be `nil`. + @param length The length of the specified input stream in bytes. + @param mimeType The MIME type of the specified data. (For example, the MIME type for a JPEG image is image/jpeg.) For a list of valid MIME types, see http://www.iana.org/assignments/media-types/. This parameter must not be `nil`. + */ +- (void)appendPartWithInputStream:(NSInputStream *)inputStream + name:(NSString *)name + fileName:(NSString *)fileName + length:(int64_t)length + mimeType:(NSString *)mimeType; + +/** + Appends the HTTP header `Content-Disposition: file; filename=#{filename}; name=#{name}"` and `Content-Type: #{mimeType}`, followed by the encoded file data and the multipart form boundary. + + @param data The data to be encoded and appended to the form data. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + @param fileName The filename to be associated with the specified data. This parameter must not be `nil`. + @param mimeType The MIME type of the specified data. (For example, the MIME type for a JPEG image is image/jpeg.) For a list of valid MIME types, see http://www.iana.org/assignments/media-types/. This parameter must not be `nil`. + */ +- (void)appendPartWithFileData:(NSData *)data + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType; + +/** + Appends the HTTP headers `Content-Disposition: form-data; name=#{name}"`, followed by the encoded data and the multipart form boundary. + + @param data The data to be encoded and appended to the form data. + @param name The name to be associated with the specified data. This parameter must not be `nil`. + */ + +- (void)appendPartWithFormData:(NSData *)data + name:(NSString *)name; + + +/** + Appends HTTP headers, followed by the encoded data and the multipart form boundary. + + @param headers The HTTP headers to be appended to the form data. + @param body The data to be encoded and appended to the form data. This parameter must not be `nil`. + */ +- (void)appendPartWithHeaders:(NSDictionary *)headers + body:(NSData *)body; + +/** + Throttles request bandwidth by limiting the packet size and adding a delay for each chunk read from the upload stream. + + When uploading over a 3G or EDGE connection, requests may fail with "request body stream exhausted". Setting a maximum packet size and delay according to the recommended values (`kAFUploadStream3GSuggestedPacketSize` and `kAFUploadStream3GSuggestedDelay`) lowers the risk of the input stream exceeding its allocated bandwidth. Unfortunately, there is no definite way to distinguish between a 3G, EDGE, or LTE connection over `NSURLConnection`. As such, it is not recommended that you throttle bandwidth based solely on network reachability. Instead, you should consider checking for the "request body stream exhausted" in a failure block, and then retrying the request with throttled bandwidth. + + @param numberOfBytes Maximum packet size, in number of bytes. The default packet size for an input stream is 16kb. + @param delay Duration of delay each time a packet is read. By default, no delay is set. + */ +- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes + delay:(NSTimeInterval)delay; + +@end + +#pragma mark - + +/** + `AFJSONRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSJSONSerialization`, setting the `Content-Type` of the encoded request to `application/json`. + */ +@interface AFJSONRequestSerializer : AFHTTPRequestSerializer + +/** + Options for writing the request JSON data from Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONWritingOptions". `0` by default. + */ +@property (nonatomic, assign) NSJSONWritingOptions writingOptions; + +/** + Creates and returns a JSON serializer with specified reading and writing options. + + @param writingOptions The specified JSON writing options. + */ ++ (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions; + +@end + +#pragma mark - + +/** + `AFPropertyListRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSPropertyListSerializer`, setting the `Content-Type` of the encoded request to `application/x-plist`. + */ +@interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer + +/** + The property list format. Possible values are described in "NSPropertyListFormat". + */ +@property (nonatomic, assign) NSPropertyListFormat format; + +/** + @warning The `writeOptions` property is currently unused. + */ +@property (nonatomic, assign) NSPropertyListWriteOptions writeOptions; + +/** + Creates and returns a property list serializer with a specified format, read options, and write options. + + @param format The property list format. + @param writeOptions The property list write options. + + @warning The `writeOptions` property is currently unused. + */ ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + writeOptions:(NSPropertyListWriteOptions)writeOptions; + +@end + +#pragma mark - + +///---------------- +/// @name Constants +///---------------- + +/** + ## Error Domains + + The following error domain is predefined. + + - `NSString * const AFURLRequestSerializationErrorDomain` + + ### Constants + + `AFURLRequestSerializationErrorDomain` + AFURLRequestSerializer errors. Error codes for `AFURLRequestSerializationErrorDomain` correspond to codes in `NSURLErrorDomain`. + */ +extern NSString * const AFURLRequestSerializationErrorDomain; + +/** + ## User info dictionary keys + + These keys may exist in the user info dictionary, in addition to those defined for NSError. + + - `NSString * const AFNetworkingOperationFailingURLRequestErrorKey` + + ### Constants + + `AFNetworkingOperationFailingURLRequestErrorKey` + The corresponding value is an `NSURLRequest` containing the request of the operation associated with an error. This key is only present in the `AFURLRequestSerializationErrorDomain`. + */ +extern NSString * const AFNetworkingOperationFailingURLRequestErrorKey; + +/** + ## Throttling Bandwidth for HTTP Request Input Streams + + @see -throttleBandwidthWithPacketSize:delay: + + ### Constants + + `kAFUploadStream3GSuggestedPacketSize` + Maximum packet size, in number of bytes. Equal to 16kb. + + `kAFUploadStream3GSuggestedDelay` + Duration of delay each time a packet is read. Equal to 0.2 seconds. + */ +extern NSUInteger const kAFUploadStream3GSuggestedPacketSize; +extern NSTimeInterval const kAFUploadStream3GSuggestedDelay; diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m new file mode 100644 index 0000000..4c1b9f3 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLRequestSerialization.m @@ -0,0 +1,1344 @@ +// AFURLRequestSerialization.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFURLRequestSerialization.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED +#import +#else +#import +#endif + +NSString * const AFURLRequestSerializationErrorDomain = @"com.alamofire.error.serialization.request"; +NSString * const AFNetworkingOperationFailingURLRequestErrorKey = @"com.alamofire.serialization.request.error.response"; + +typedef NSString * (^AFQueryStringSerializationBlock)(NSURLRequest *request, id parameters, NSError *__autoreleasing *error); + +static NSString * AFBase64EncodedStringFromString(NSString *string) { + NSData *data = [NSData dataWithBytes:[string UTF8String] length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]]; + NSUInteger length = [data length]; + NSMutableData *mutableData = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; + + uint8_t *input = (uint8_t *)[data bytes]; + uint8_t *output = (uint8_t *)[mutableData mutableBytes]; + + for (NSUInteger i = 0; i < length; i += 3) { + NSUInteger value = 0; + for (NSUInteger j = i; j < (i + 3); j++) { + value <<= 8; + if (j < length) { + value |= (0xFF & input[j]); + } + } + + static uint8_t const kAFBase64EncodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + NSUInteger idx = (i / 3) * 4; + output[idx + 0] = kAFBase64EncodingTable[(value >> 18) & 0x3F]; + output[idx + 1] = kAFBase64EncodingTable[(value >> 12) & 0x3F]; + output[idx + 2] = (i + 1) < length ? kAFBase64EncodingTable[(value >> 6) & 0x3F] : '='; + output[idx + 3] = (i + 2) < length ? kAFBase64EncodingTable[(value >> 0) & 0x3F] : '='; + } + + return [[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding]; +} + +static NSString * const kAFCharactersToBeEscapedInQueryString = @":/?&=;+!@#$()',*"; + +static NSString * AFPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { + static NSString * const kAFCharactersToLeaveUnescapedInQueryStringPairKey = @"[]."; + + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kAFCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)kAFCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); +} + +static NSString * AFPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { + return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kAFCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); +} + +#pragma mark - + +@interface AFQueryStringPair : NSObject +@property (readwrite, nonatomic, strong) id field; +@property (readwrite, nonatomic, strong) id value; + +- (id)initWithField:(id)field value:(id)value; + +- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding; +@end + +@implementation AFQueryStringPair + +- (id)initWithField:(id)field value:(id)value { + self = [super init]; + if (!self) { + return nil; + } + + self.field = field; + self.value = value; + + return self; +} + +- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding { + if (!self.value || [self.value isEqual:[NSNull null]]) { + return AFPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding); + } else { + return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedQueryStringKeyFromStringWithEncoding([self.field description], stringEncoding), AFPercentEscapedQueryStringValueFromStringWithEncoding([self.value description], stringEncoding)]; + } +} + +@end + +#pragma mark - + +extern NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary); +extern NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value); + +static NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding stringEncoding) { + NSMutableArray *mutablePairs = [NSMutableArray array]; + for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) { + [mutablePairs addObject:[pair URLEncodedStringValueWithEncoding:stringEncoding]]; + } + + return [mutablePairs componentsJoinedByString:@"&"]; +} + +NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary) { + return AFQueryStringPairsFromKeyAndValue(nil, dictionary); +} + +NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) { + NSMutableArray *mutableQueryStringComponents = [NSMutableArray array]; + + NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)]; + + if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictionary = value; + // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries + for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + id nestedValue = [dictionary objectForKey:nestedKey]; + if (nestedValue) { + [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)]; + } + } + } else if ([value isKindOfClass:[NSArray class]]) { + NSArray *array = value; + for (id nestedValue in array) { + [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; + } + } else if ([value isKindOfClass:[NSSet class]]) { + NSSet *set = value; + for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue(key, obj)]; + } + } else { + [mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]]; + } + + return mutableQueryStringComponents; +} + +#pragma mark - + +@interface AFStreamingMultipartFormData : NSObject +- (instancetype)initWithURLRequest:(NSMutableURLRequest *)urlRequest + stringEncoding:(NSStringEncoding)encoding; + +- (NSMutableURLRequest *)requestByFinalizingMultipartFormData; +@end + +#pragma mark - + +static NSArray * AFHTTPRequestSerializerObservedKeyPaths() { + static NSArray *_AFHTTPRequestSerializerObservedKeyPaths = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))]; + }); + + return _AFHTTPRequestSerializerObservedKeyPaths; +} + +static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerObserverContext; + +@interface AFHTTPRequestSerializer () +@property (readwrite, nonatomic, strong) NSMutableSet *mutableObservedChangedKeyPaths; +@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableHTTPRequestHeaders; +@property (readwrite, nonatomic, assign) AFHTTPRequestQueryStringSerializationStyle queryStringSerializationStyle; +@property (readwrite, nonatomic, copy) AFQueryStringSerializationBlock queryStringSerialization; +@end + +@implementation AFHTTPRequestSerializer + ++ (instancetype)serializer { + return [[self alloc] init]; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = NSUTF8StringEncoding; + + self.mutableHTTPRequestHeaders = [NSMutableDictionary dictionary]; + + // Accept-Language HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 + NSMutableArray *acceptLanguagesComponents = [NSMutableArray array]; + [[NSLocale preferredLanguages] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + float q = 1.0f - (idx * 0.1f); + [acceptLanguagesComponents addObject:[NSString stringWithFormat:@"%@;q=%0.1g", obj, q]]; + *stop = q <= 0.5f; + }]; + [self setValue:[acceptLanguagesComponents componentsJoinedByString:@", "] forHTTPHeaderField:@"Accept-Language"]; + + NSString *userAgent = nil; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + // User-Agent Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43 + userAgent = [NSString stringWithFormat:@"%@/%@ (%@; iOS %@; Scale/%0.2f)", [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleExecutableKey] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey], [[UIDevice currentDevice] model], [[UIDevice currentDevice] systemVersion], [[UIScreen mainScreen] scale]]; +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) + userAgent = [NSString stringWithFormat:@"%@/%@ (Mac OS X %@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleExecutableKey] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] ?: [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey], [[NSProcessInfo processInfo] operatingSystemVersionString]]; +#endif +#pragma clang diagnostic pop + if (userAgent) { + if (![userAgent canBeConvertedToEncoding:NSASCIIStringEncoding]) { + NSMutableString *mutableUserAgent = [userAgent mutableCopy]; + if (CFStringTransform((__bridge CFMutableStringRef)(mutableUserAgent), NULL, (__bridge CFStringRef)@"Any-Latin; Latin-ASCII; [:^ASCII:] Remove", false)) { + userAgent = mutableUserAgent; + } + } + [self setValue:userAgent forHTTPHeaderField:@"User-Agent"]; + } + + // HTTP Method Definitions; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + self.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", @"DELETE", nil]; + + self.mutableObservedChangedKeyPaths = [NSMutableSet set]; + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self respondsToSelector:NSSelectorFromString(keyPath)]) { + [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:AFHTTPRequestSerializerObserverContext]; + } + } + + return self; +} + +- (void)dealloc { + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self respondsToSelector:NSSelectorFromString(keyPath)]) { + [self removeObserver:self forKeyPath:keyPath context:AFHTTPRequestSerializerObserverContext]; + } + } +} + +#pragma mark - + +- (NSDictionary *)HTTPRequestHeaders { + return [NSDictionary dictionaryWithDictionary:self.mutableHTTPRequestHeaders]; +} + +- (void)setValue:(NSString *)value +forHTTPHeaderField:(NSString *)field +{ + [self.mutableHTTPRequestHeaders setValue:value forKey:field]; +} + +- (NSString *)valueForHTTPHeaderField:(NSString *)field { + return [self.mutableHTTPRequestHeaders valueForKey:field]; +} + +- (void)setAuthorizationHeaderFieldWithUsername:(NSString *)username + password:(NSString *)password +{ + NSString *basicAuthCredentials = [NSString stringWithFormat:@"%@:%@", username, password]; + [self setValue:[NSString stringWithFormat:@"Basic %@", AFBase64EncodedStringFromString(basicAuthCredentials)] forHTTPHeaderField:@"Authorization"]; +} + +- (void)setAuthorizationHeaderFieldWithToken:(NSString *)token { + [self setValue:[NSString stringWithFormat:@"Token token=\"%@\"", token] forHTTPHeaderField:@"Authorization"]; +} + +- (void)clearAuthorizationHeader { + [self.mutableHTTPRequestHeaders removeObjectForKey:@"Authorization"]; +} + +#pragma mark - + +- (void)setQueryStringSerializationWithStyle:(AFHTTPRequestQueryStringSerializationStyle)style { + self.queryStringSerializationStyle = style; + self.queryStringSerialization = nil; +} + +- (void)setQueryStringSerializationWithBlock:(NSString *(^)(NSURLRequest *, id, NSError *__autoreleasing *))block { + self.queryStringSerialization = block; +} + +#pragma mark - + +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters +{ + return [self requestWithMethod:method URLString:URLString parameters:parameters error:nil]; +} + +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(method); + NSParameterAssert(URLString); + + NSURL *url = [NSURL URLWithString:URLString]; + + NSParameterAssert(url); + + NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url]; + mutableRequest.HTTPMethod = method; + + for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) { + if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) { + [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath]; + } + } + + mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy]; + + return mutableRequest; +} + +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block +{ + return [self multipartFormRequestWithMethod:method URLString:URLString parameters:parameters constructingBodyWithBlock:block error:nil]; +} + +- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method + URLString:(NSString *)URLString + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(method); + NSParameterAssert(![method isEqualToString:@"GET"] && ![method isEqualToString:@"HEAD"]); + + NSMutableURLRequest *mutableRequest = [self requestWithMethod:method URLString:URLString parameters:nil error:error]; + + __block AFStreamingMultipartFormData *formData = [[AFStreamingMultipartFormData alloc] initWithURLRequest:mutableRequest stringEncoding:NSUTF8StringEncoding]; + + if (parameters) { + for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) { + NSData *data = nil; + if ([pair.value isKindOfClass:[NSData class]]) { + data = pair.value; + } else if ([pair.value isEqual:[NSNull null]]) { + data = [NSData data]; + } else { + data = [[pair.value description] dataUsingEncoding:self.stringEncoding]; + } + + if (data) { + [formData appendPartWithFormData:data name:[pair.field description]]; + } + } + } + + if (block) { + block(formData); + } + + return [formData requestByFinalizingMultipartFormData]; +} + +- (NSMutableURLRequest *)requestWithMultipartFormRequest:(NSURLRequest *)request + writingStreamContentsToFile:(NSURL *)fileURL + completionHandler:(void (^)(NSError *error))handler +{ + NSParameterAssert(request.HTTPBodyStream); + NSParameterAssert([fileURL isFileURL]); + + NSInputStream *inputStream = request.HTTPBodyStream; + NSOutputStream *outputStream = [[NSOutputStream alloc] initWithURL:fileURL append:NO]; + __block NSError *error = nil; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + + [inputStream open]; + [outputStream open]; + + while ([inputStream hasBytesAvailable] && [outputStream hasSpaceAvailable]) { + uint8_t buffer[1024]; + + NSInteger bytesRead = [inputStream read:buffer maxLength:1024]; + if (inputStream.streamError || bytesRead < 0) { + error = inputStream.streamError; + break; + } + + NSInteger bytesWritten = [outputStream write:buffer maxLength:(NSUInteger)bytesRead]; + if (outputStream.streamError || bytesWritten < 0) { + error = outputStream.streamError; + break; + } + + if (bytesRead == 0 && bytesWritten == 0) { + break; + } + } + + [outputStream close]; + [inputStream close]; + + if (handler) { + dispatch_async(dispatch_get_main_queue(), ^{ + handler(error); + }); + } + }); + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + mutableRequest.HTTPBodyStream = nil; + + return mutableRequest; +} + +#pragma mark - AFURLRequestSerialization + +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(request); + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + + [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { + if (![request valueForHTTPHeaderField:field]) { + [mutableRequest setValue:value forHTTPHeaderField:field]; + } + }]; + + if (parameters) { + NSString *query = nil; + if (self.queryStringSerialization) { + NSError *serializationError; + query = self.queryStringSerialization(request, parameters, &serializationError); + + if (serializationError) { + if (error) { + *error = serializationError; + } + + return nil; + } + } else { + switch (self.queryStringSerializationStyle) { + case AFHTTPRequestQueryStringDefaultStyle: + query = AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding); + break; + } + } + + if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { + mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]]; + } else { + if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { + [mutableRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; + } + [mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]]; + } + } + + return mutableRequest; +} + +#pragma mark - NSKeyValueObserving + ++ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key { + if ([AFHTTPRequestSerializerObservedKeyPaths() containsObject:key]) { + return NO; + } + + return [super automaticallyNotifiesObserversForKey:key]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(__unused id)object + change:(NSDictionary *)change + context:(void *)context +{ + if (context == AFHTTPRequestSerializerObserverContext) { + if ([change[NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { + [self.mutableObservedChangedKeyPaths removeObject:keyPath]; + } else { + [self.mutableObservedChangedKeyPaths addObject:keyPath]; + } + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [self init]; + if (!self) { + return nil; + } + + self.mutableHTTPRequestHeaders = [[decoder decodeObjectOfClass:[NSDictionary class] forKey:NSStringFromSelector(@selector(mutableHTTPRequestHeaders))] mutableCopy]; + self.queryStringSerializationStyle = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(queryStringSerializationStyle))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.mutableHTTPRequestHeaders forKey:NSStringFromSelector(@selector(mutableHTTPRequestHeaders))]; + [coder encodeInteger:self.queryStringSerializationStyle forKey:NSStringFromSelector(@selector(queryStringSerializationStyle))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPRequestSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.mutableHTTPRequestHeaders = [self.mutableHTTPRequestHeaders mutableCopyWithZone:zone]; + serializer.queryStringSerializationStyle = self.queryStringSerializationStyle; + serializer.queryStringSerialization = self.queryStringSerialization; + + return serializer; +} + +@end + +#pragma mark - + +static NSString * AFCreateMultipartFormBoundary() { + return [NSString stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()]; +} + +static NSString * const kAFMultipartFormCRLF = @"\r\n"; + +static inline NSString * AFMultipartFormInitialBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"--%@%@", boundary, kAFMultipartFormCRLF]; +} + +static inline NSString * AFMultipartFormEncapsulationBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"%@--%@%@", kAFMultipartFormCRLF, boundary, kAFMultipartFormCRLF]; +} + +static inline NSString * AFMultipartFormFinalBoundary(NSString *boundary) { + return [NSString stringWithFormat:@"%@--%@--%@", kAFMultipartFormCRLF, boundary, kAFMultipartFormCRLF]; +} + +static inline NSString * AFContentTypeForPathExtension(NSString *extension) { +#ifdef __UTTYPE__ + NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL); + NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType); + if (!contentType) { + return @"application/octet-stream"; + } else { + return contentType; + } +#else +#pragma unused (extension) + return @"application/octet-stream"; +#endif +} + +NSUInteger const kAFUploadStream3GSuggestedPacketSize = 1024 * 16; +NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2; + +@interface AFHTTPBodyPart : NSObject +@property (nonatomic, assign) NSStringEncoding stringEncoding; +@property (nonatomic, strong) NSDictionary *headers; +@property (nonatomic, copy) NSString *boundary; +@property (nonatomic, strong) id body; +@property (nonatomic, assign) unsigned long long bodyContentLength; +@property (nonatomic, strong) NSInputStream *inputStream; + +@property (nonatomic, assign) BOOL hasInitialBoundary; +@property (nonatomic, assign) BOOL hasFinalBoundary; + +@property (readonly, nonatomic, assign, getter = hasBytesAvailable) BOOL bytesAvailable; +@property (readonly, nonatomic, assign) unsigned long long contentLength; + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length; +@end + +@interface AFMultipartBodyStream : NSInputStream +@property (nonatomic, assign) NSUInteger numberOfBytesInPacket; +@property (nonatomic, assign) NSTimeInterval delay; +@property (nonatomic, strong) NSInputStream *inputStream; +@property (readonly, nonatomic, assign) unsigned long long contentLength; +@property (readonly, nonatomic, assign, getter = isEmpty) BOOL empty; + +- (id)initWithStringEncoding:(NSStringEncoding)encoding; +- (void)setInitialAndFinalBoundaries; +- (void)appendHTTPBodyPart:(AFHTTPBodyPart *)bodyPart; +@end + +#pragma mark - + +@interface AFStreamingMultipartFormData () +@property (readwrite, nonatomic, copy) NSMutableURLRequest *request; +@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding; +@property (readwrite, nonatomic, copy) NSString *boundary; +@property (readwrite, nonatomic, strong) AFMultipartBodyStream *bodyStream; +@end + +@implementation AFStreamingMultipartFormData + +- (id)initWithURLRequest:(NSMutableURLRequest *)urlRequest + stringEncoding:(NSStringEncoding)encoding +{ + self = [super init]; + if (!self) { + return nil; + } + + self.request = urlRequest; + self.stringEncoding = encoding; + self.boundary = AFCreateMultipartFormBoundary(); + self.bodyStream = [[AFMultipartBodyStream alloc] initWithStringEncoding:encoding]; + + return self; +} + +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + error:(NSError * __autoreleasing *)error +{ + NSParameterAssert(fileURL); + NSParameterAssert(name); + + NSString *fileName = [fileURL lastPathComponent]; + NSString *mimeType = AFContentTypeForPathExtension([fileURL pathExtension]); + + return [self appendPartWithFileURL:fileURL name:name fileName:fileName mimeType:mimeType error:error]; +} + +- (BOOL)appendPartWithFileURL:(NSURL *)fileURL + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType + error:(NSError * __autoreleasing *)error +{ + NSParameterAssert(fileURL); + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + if (![fileURL isFileURL]) { + NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedStringFromTable(@"Expected URL to be a file URL", @"AFNetworking", nil)}; + if (error) { + *error = [[NSError alloc] initWithDomain:AFURLRequestSerializationErrorDomain code:NSURLErrorBadURL userInfo:userInfo]; + } + + return NO; + } else if ([fileURL checkResourceIsReachableAndReturnError:error] == NO) { + NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedStringFromTable(@"File URL not reachable.", @"AFNetworking", nil)}; + if (error) { + *error = [[NSError alloc] initWithDomain:AFURLRequestSerializationErrorDomain code:NSURLErrorBadURL userInfo:userInfo]; + } + + return NO; + } + + NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[fileURL path] error:error]; + if (!fileAttributes) { + return NO; + } + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = mutableHeaders; + bodyPart.boundary = self.boundary; + bodyPart.body = fileURL; + bodyPart.bodyContentLength = [[fileAttributes objectForKey:NSFileSize] unsignedLongLongValue]; + [self.bodyStream appendHTTPBodyPart:bodyPart]; + + return YES; +} + +- (void)appendPartWithInputStream:(NSInputStream *)inputStream + name:(NSString *)name + fileName:(NSString *)fileName + length:(int64_t)length + mimeType:(NSString *)mimeType +{ + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = mutableHeaders; + bodyPart.boundary = self.boundary; + bodyPart.body = inputStream; + + bodyPart.bodyContentLength = (unsigned long long)length; + + [self.bodyStream appendHTTPBodyPart:bodyPart]; +} + +- (void)appendPartWithFileData:(NSData *)data + name:(NSString *)name + fileName:(NSString *)fileName + mimeType:(NSString *)mimeType +{ + NSParameterAssert(name); + NSParameterAssert(fileName); + NSParameterAssert(mimeType); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"]; + [mutableHeaders setValue:mimeType forKey:@"Content-Type"]; + + [self appendPartWithHeaders:mutableHeaders body:data]; +} + +- (void)appendPartWithFormData:(NSData *)data + name:(NSString *)name +{ + NSParameterAssert(name); + + NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary]; + [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"", name] forKey:@"Content-Disposition"]; + + [self appendPartWithHeaders:mutableHeaders body:data]; +} + +- (void)appendPartWithHeaders:(NSDictionary *)headers + body:(NSData *)body +{ + NSParameterAssert(body); + + AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init]; + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = headers; + bodyPart.boundary = self.boundary; + bodyPart.bodyContentLength = [body length]; + bodyPart.body = body; + + [self.bodyStream appendHTTPBodyPart:bodyPart]; +} + +- (void)throttleBandwidthWithPacketSize:(NSUInteger)numberOfBytes + delay:(NSTimeInterval)delay +{ + self.bodyStream.numberOfBytesInPacket = numberOfBytes; + self.bodyStream.delay = delay; +} + +- (NSMutableURLRequest *)requestByFinalizingMultipartFormData { + if ([self.bodyStream isEmpty]) { + return self.request; + } + + // Reset the initial and final boundaries to ensure correct Content-Length + [self.bodyStream setInitialAndFinalBoundaries]; + [self.request setHTTPBodyStream:self.bodyStream]; + + [self.request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", self.boundary] forHTTPHeaderField:@"Content-Type"]; + [self.request setValue:[NSString stringWithFormat:@"%llu", [self.bodyStream contentLength]] forHTTPHeaderField:@"Content-Length"]; + + return self.request; +} + +@end + +#pragma mark - + +@interface NSStream () +@property (readwrite) NSStreamStatus streamStatus; +@property (readwrite, copy) NSError *streamError; +@end + +@interface AFMultipartBodyStream () +@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding; +@property (readwrite, nonatomic, strong) NSMutableArray *HTTPBodyParts; +@property (readwrite, nonatomic, strong) NSEnumerator *HTTPBodyPartEnumerator; +@property (readwrite, nonatomic, strong) AFHTTPBodyPart *currentHTTPBodyPart; +@property (readwrite, nonatomic, strong) NSOutputStream *outputStream; +@property (readwrite, nonatomic, strong) NSMutableData *buffer; +@end + +@implementation AFMultipartBodyStream +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wimplicit-atomic-properties" +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1100) +@synthesize delegate; +#endif +@synthesize streamStatus; +@synthesize streamError; +#pragma clang diagnostic pop + +- (id)initWithStringEncoding:(NSStringEncoding)encoding { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = encoding; + self.HTTPBodyParts = [NSMutableArray array]; + self.numberOfBytesInPacket = NSIntegerMax; + + return self; +} + +- (void)setInitialAndFinalBoundaries { + if ([self.HTTPBodyParts count] > 0) { + for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + bodyPart.hasInitialBoundary = NO; + bodyPart.hasFinalBoundary = NO; + } + + [[self.HTTPBodyParts objectAtIndex:0] setHasInitialBoundary:YES]; + [[self.HTTPBodyParts lastObject] setHasFinalBoundary:YES]; + } +} + +- (void)appendHTTPBodyPart:(AFHTTPBodyPart *)bodyPart { + [self.HTTPBodyParts addObject:bodyPart]; +} + +- (BOOL)isEmpty { + return [self.HTTPBodyParts count] == 0; +} + +#pragma mark - NSInputStream + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ + if ([self streamStatus] == NSStreamStatusClosed) { + return 0; + } + + NSInteger totalNumberOfBytesRead = 0; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + while ((NSUInteger)totalNumberOfBytesRead < MIN(length, self.numberOfBytesInPacket)) { + if (!self.currentHTTPBodyPart || ![self.currentHTTPBodyPart hasBytesAvailable]) { + if (!(self.currentHTTPBodyPart = [self.HTTPBodyPartEnumerator nextObject])) { + break; + } + } else { + NSUInteger maxLength = length - (NSUInteger)totalNumberOfBytesRead; + NSInteger numberOfBytesRead = [self.currentHTTPBodyPart read:&buffer[totalNumberOfBytesRead] maxLength:maxLength]; + if (numberOfBytesRead == -1) { + self.streamError = self.currentHTTPBodyPart.inputStream.streamError; + break; + } else { + totalNumberOfBytesRead += numberOfBytesRead; + + if (self.delay > 0.0f) { + [NSThread sleepForTimeInterval:self.delay]; + } + } + } + } +#pragma clang diagnostic pop + + return totalNumberOfBytesRead; +} + +- (BOOL)getBuffer:(__unused uint8_t **)buffer + length:(__unused NSUInteger *)len +{ + return NO; +} + +- (BOOL)hasBytesAvailable { + return [self streamStatus] == NSStreamStatusOpen; +} + +#pragma mark - NSStream + +- (void)open { + if (self.streamStatus == NSStreamStatusOpen) { + return; + } + + self.streamStatus = NSStreamStatusOpen; + + [self setInitialAndFinalBoundaries]; + self.HTTPBodyPartEnumerator = [self.HTTPBodyParts objectEnumerator]; +} + +- (void)close { + self.streamStatus = NSStreamStatusClosed; +} + +- (id)propertyForKey:(__unused NSString *)key { + return nil; +} + +- (BOOL)setProperty:(__unused id)property + forKey:(__unused NSString *)key +{ + return NO; +} + +- (void)scheduleInRunLoop:(__unused NSRunLoop *)aRunLoop + forMode:(__unused NSString *)mode +{} + +- (void)removeFromRunLoop:(__unused NSRunLoop *)aRunLoop + forMode:(__unused NSString *)mode +{} + +- (unsigned long long)contentLength { + unsigned long long length = 0; + for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + length += [bodyPart contentLength]; + } + + return length; +} + +#pragma mark - Undocumented CFReadStream Bridged Methods + +- (void)_scheduleInCFRunLoop:(__unused CFRunLoopRef)aRunLoop + forMode:(__unused CFStringRef)aMode +{} + +- (void)_unscheduleFromCFRunLoop:(__unused CFRunLoopRef)aRunLoop + forMode:(__unused CFStringRef)aMode +{} + +- (BOOL)_setCFClientFlags:(__unused CFOptionFlags)inFlags + callback:(__unused CFReadStreamClientCallBack)inCallback + context:(__unused CFStreamClientContext *)inContext { + return NO; +} + +#pragma mark - NSCopying + +-(id)copyWithZone:(NSZone *)zone { + AFMultipartBodyStream *bodyStreamCopy = [[[self class] allocWithZone:zone] initWithStringEncoding:self.stringEncoding]; + + for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) { + [bodyStreamCopy appendHTTPBodyPart:[bodyPart copy]]; + } + + [bodyStreamCopy setInitialAndFinalBoundaries]; + + return bodyStreamCopy; +} + +@end + +#pragma mark - + +typedef enum { + AFEncapsulationBoundaryPhase = 1, + AFHeaderPhase = 2, + AFBodyPhase = 3, + AFFinalBoundaryPhase = 4, +} AFHTTPBodyPartReadPhase; + +@interface AFHTTPBodyPart () { + AFHTTPBodyPartReadPhase _phase; + NSInputStream *_inputStream; + unsigned long long _phaseReadOffset; +} + +- (BOOL)transitionToNextPhase; +- (NSInteger)readData:(NSData *)data + intoBuffer:(uint8_t *)buffer + maxLength:(NSUInteger)length; +@end + +@implementation AFHTTPBodyPart + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + [self transitionToNextPhase]; + + return self; +} + +- (void)dealloc { + if (_inputStream) { + [_inputStream close]; + _inputStream = nil; + } +} + +- (NSInputStream *)inputStream { + if (!_inputStream) { + if ([self.body isKindOfClass:[NSData class]]) { + _inputStream = [NSInputStream inputStreamWithData:self.body]; + } else if ([self.body isKindOfClass:[NSURL class]]) { + _inputStream = [NSInputStream inputStreamWithURL:self.body]; + } else if ([self.body isKindOfClass:[NSInputStream class]]) { + _inputStream = self.body; + } else { + _inputStream = [NSInputStream inputStreamWithData:[NSData data]]; + } + } + + return _inputStream; +} + +- (NSString *)stringForHeaders { + NSMutableString *headerString = [NSMutableString string]; + for (NSString *field in [self.headers allKeys]) { + [headerString appendString:[NSString stringWithFormat:@"%@: %@%@", field, [self.headers valueForKey:field], kAFMultipartFormCRLF]]; + } + [headerString appendString:kAFMultipartFormCRLF]; + + return [NSString stringWithString:headerString]; +} + +- (unsigned long long)contentLength { + unsigned long long length = 0; + + NSData *encapsulationBoundaryData = [([self hasInitialBoundary] ? AFMultipartFormInitialBoundary(self.boundary) : AFMultipartFormEncapsulationBoundary(self.boundary)) dataUsingEncoding:self.stringEncoding]; + length += [encapsulationBoundaryData length]; + + NSData *headersData = [[self stringForHeaders] dataUsingEncoding:self.stringEncoding]; + length += [headersData length]; + + length += _bodyContentLength; + + NSData *closingBoundaryData = ([self hasFinalBoundary] ? [AFMultipartFormFinalBoundary(self.boundary) dataUsingEncoding:self.stringEncoding] : [NSData data]); + length += [closingBoundaryData length]; + + return length; +} + +- (BOOL)hasBytesAvailable { + // Allows `read:maxLength:` to be called again if `AFMultipartFormFinalBoundary` doesn't fit into the available buffer + if (_phase == AFFinalBoundaryPhase) { + return YES; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcovered-switch-default" + switch (self.inputStream.streamStatus) { + case NSStreamStatusNotOpen: + case NSStreamStatusOpening: + case NSStreamStatusOpen: + case NSStreamStatusReading: + case NSStreamStatusWriting: + return YES; + case NSStreamStatusAtEnd: + case NSStreamStatusClosed: + case NSStreamStatusError: + default: + return NO; + } +#pragma clang diagnostic pop +} + +- (NSInteger)read:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ + NSInteger totalNumberOfBytesRead = 0; + + if (_phase == AFEncapsulationBoundaryPhase) { + NSData *encapsulationBoundaryData = [([self hasInitialBoundary] ? AFMultipartFormInitialBoundary(self.boundary) : AFMultipartFormEncapsulationBoundary(self.boundary)) dataUsingEncoding:self.stringEncoding]; + totalNumberOfBytesRead += [self readData:encapsulationBoundaryData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + if (_phase == AFHeaderPhase) { + NSData *headersData = [[self stringForHeaders] dataUsingEncoding:self.stringEncoding]; + totalNumberOfBytesRead += [self readData:headersData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + if (_phase == AFBodyPhase) { + NSInteger numberOfBytesRead = 0; + + numberOfBytesRead = [self.inputStream read:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + if (numberOfBytesRead == -1) { + return -1; + } else { + totalNumberOfBytesRead += numberOfBytesRead; + + if ([self.inputStream streamStatus] >= NSStreamStatusAtEnd) { + [self transitionToNextPhase]; + } + } + } + + if (_phase == AFFinalBoundaryPhase) { + NSData *closingBoundaryData = ([self hasFinalBoundary] ? [AFMultipartFormFinalBoundary(self.boundary) dataUsingEncoding:self.stringEncoding] : [NSData data]); + totalNumberOfBytesRead += [self readData:closingBoundaryData intoBuffer:&buffer[totalNumberOfBytesRead] maxLength:(length - (NSUInteger)totalNumberOfBytesRead)]; + } + + return totalNumberOfBytesRead; +} + +- (NSInteger)readData:(NSData *)data + intoBuffer:(uint8_t *)buffer + maxLength:(NSUInteger)length +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + NSRange range = NSMakeRange((NSUInteger)_phaseReadOffset, MIN([data length] - ((NSUInteger)_phaseReadOffset), length)); + [data getBytes:buffer range:range]; +#pragma clang diagnostic pop + + _phaseReadOffset += range.length; + + if (((NSUInteger)_phaseReadOffset) >= [data length]) { + [self transitionToNextPhase]; + } + + return (NSInteger)range.length; +} + +- (BOOL)transitionToNextPhase { + if (![[NSThread currentThread] isMainThread]) { + dispatch_sync(dispatch_get_main_queue(), ^{ + [self transitionToNextPhase]; + }); + return YES; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcovered-switch-default" + switch (_phase) { + case AFEncapsulationBoundaryPhase: + _phase = AFHeaderPhase; + break; + case AFHeaderPhase: + [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; + [self.inputStream open]; + _phase = AFBodyPhase; + break; + case AFBodyPhase: + [self.inputStream close]; + _phase = AFFinalBoundaryPhase; + break; + case AFFinalBoundaryPhase: + default: + _phase = AFEncapsulationBoundaryPhase; + break; + } + _phaseReadOffset = 0; +#pragma clang diagnostic pop + + return YES; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPBodyPart *bodyPart = [[[self class] allocWithZone:zone] init]; + + bodyPart.stringEncoding = self.stringEncoding; + bodyPart.headers = self.headers; + bodyPart.bodyContentLength = self.bodyContentLength; + bodyPart.body = self.body; + bodyPart.boundary = self.boundary; + + return bodyPart; +} + +@end + +#pragma mark - + +@implementation AFJSONRequestSerializer + ++ (instancetype)serializer { + return [self serializerWithWritingOptions:(NSJSONWritingOptions)0]; +} + ++ (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions +{ + AFJSONRequestSerializer *serializer = [[self alloc] init]; + serializer.writingOptions = writingOptions; + + return serializer; +} + +#pragma mark - AFURLRequestSerialization + +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(request); + + if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { + return [super requestBySerializingRequest:request withParameters:parameters error:error]; + } + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + + [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { + if (![request valueForHTTPHeaderField:field]) { + [mutableRequest setValue:value forHTTPHeaderField:field]; + } + }]; + + if (parameters) { + if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { + [mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + } + + [mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]]; + } + + return mutableRequest; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.writingOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(writingOptions))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeInteger:self.writingOptions forKey:NSStringFromSelector(@selector(writingOptions))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFJSONRequestSerializer *serializer = [super copyWithZone:zone]; + serializer.writingOptions = self.writingOptions; + + return serializer; +} + +@end + +#pragma mark - + +@implementation AFPropertyListRequestSerializer + ++ (instancetype)serializer { + return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 writeOptions:0]; +} + ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + writeOptions:(NSPropertyListWriteOptions)writeOptions +{ + AFPropertyListRequestSerializer *serializer = [[self alloc] init]; + serializer.format = format; + serializer.writeOptions = writeOptions; + + return serializer; +} + +#pragma mark - AFURLRequestSerializer + +- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request + withParameters:(id)parameters + error:(NSError *__autoreleasing *)error +{ + NSParameterAssert(request); + + if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) { + return [super requestBySerializingRequest:request withParameters:parameters error:error]; + } + + NSMutableURLRequest *mutableRequest = [request mutableCopy]; + + [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) { + if (![request valueForHTTPHeaderField:field]) { + [mutableRequest setValue:value forHTTPHeaderField:field]; + } + }]; + + if (parameters) { + if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) { + [mutableRequest setValue:@"application/x-plist" forHTTPHeaderField:@"Content-Type"]; + } + + [mutableRequest setHTTPBody:[NSPropertyListSerialization dataWithPropertyList:parameters format:self.format options:self.writeOptions error:error]]; + } + + return mutableRequest; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.format = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(format))] unsignedIntegerValue]; + self.writeOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(writeOptions))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeInteger:self.format forKey:NSStringFromSelector(@selector(format))]; + [coder encodeObject:@(self.writeOptions) forKey:NSStringFromSelector(@selector(writeOptions))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFPropertyListRequestSerializer *serializer = [super copyWithZone:zone]; + serializer.format = self.format; + serializer.writeOptions = self.writeOptions; + + return serializer; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h new file mode 100644 index 0000000..5eff8e6 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.h @@ -0,0 +1,310 @@ +// AFURLResponseSerialization.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +/** + The `AFURLResponseSerialization` protocol is adopted by an object that decodes data into a more useful object representation, according to details in the server response. Response serializers may additionally perform validation on the incoming response and data. + + For example, a JSON response serializer may check for an acceptable status code (`2XX` range) and content type (`application/json`), decoding a valid JSON response into an object. + */ +@protocol AFURLResponseSerialization + +/** + The response object decoded from the data associated with a specified response. + + @param response The response to be processed. + @param data The response data to be decoded. + @param error The error that occurred while attempting to decode the response data. + + @return The object decoded from the specified response data. + */ +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error; + +@end + +#pragma mark - + +/** + `AFHTTPResponseSerializer` conforms to the `AFURLRequestSerialization` & `AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation. + + Any request or response serializer dealing with HTTP is encouraged to subclass `AFHTTPResponseSerializer` in order to ensure consistent default behavior. + */ +@interface AFHTTPResponseSerializer : NSObject + +- (instancetype) init; + +/** + The string encoding used to serialize data received from the server, when no string encoding is specified by the response. `NSUTF8StringEncoding` by default. + */ +@property (nonatomic, assign) NSStringEncoding stringEncoding; + +/** + Creates and returns a serializer with default configuration. + */ ++ (instancetype)serializer; + +///----------------------------------------- +/// @name Configuring Response Serialization +///----------------------------------------- + +/** + The acceptable HTTP status codes for responses. When non-`nil`, responses with status codes not contained by the set will result in an error during validation. + + See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + */ +@property (nonatomic, copy) NSIndexSet *acceptableStatusCodes; + +/** + The acceptable MIME types for responses. When non-`nil`, responses with a `Content-Type` with MIME types that do not intersect with the set will result in an error during validation. + */ +@property (nonatomic, copy) NSSet *acceptableContentTypes; + +/** + Validates the specified response and data. + + In its base implementation, this method checks for an acceptable status code and content type. Subclasses may wish to add other domain-specific checks. + + @param response The response to be validated. + @param data The data associated with the response. + @param error The error that occurred while attempting to validate the response. + + @return `YES` if the response is valid, otherwise `NO`. + */ +- (BOOL)validateResponse:(NSHTTPURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error; + +@end + +#pragma mark - + + +/** + `AFJSONResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes JSON responses. + + By default, `AFJSONResponseSerializer` accepts the following MIME types, which includes the official standard, `application/json`, as well as other commonly-used types: + + - `application/json` + - `text/json` + - `text/javascript` + */ +@interface AFJSONResponseSerializer : AFHTTPResponseSerializer + +- (instancetype) init; + +/** + Options for reading the response JSON data and creating the Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". `0` by default. + */ +@property (nonatomic, assign) NSJSONReadingOptions readingOptions; + +/** + Whether to remove keys with `NSNull` values from response JSON. Defaults to `NO`. + */ +@property (nonatomic, assign) BOOL removesKeysWithNullValues; + +/** + Creates and returns a JSON serializer with specified reading and writing options. + + @param readingOptions The specified JSON reading options. + */ ++ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions; + +@end + +#pragma mark - + +/** + `AFXMLParserResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLParser` objects. + + By default, `AFXMLParserResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: + + - `application/xml` + - `text/xml` + */ +@interface AFXMLParserResponseSerializer : AFHTTPResponseSerializer + +@end + +#pragma mark - + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED + +/** + `AFXMLDocumentResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. + + By default, `AFXMLDocumentResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types: + + - `application/xml` + - `text/xml` + */ +@interface AFXMLDocumentResponseSerializer : AFHTTPResponseSerializer + +- (instancetype) init; + +/** + Input and output options specifically intended for `NSXMLDocument` objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONReadingOptions". `0` by default. + */ +@property (nonatomic, assign) NSUInteger options; + +/** + Creates and returns an XML document serializer with the specified options. + + @param mask The XML document options. + */ ++ (instancetype)serializerWithXMLDocumentOptions:(NSUInteger)mask; + +@end + +#endif + +#pragma mark - + +/** + `AFPropertyListResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects. + + By default, `AFPropertyListResponseSerializer` accepts the following MIME types: + + - `application/x-plist` + */ +@interface AFPropertyListResponseSerializer : AFHTTPResponseSerializer + +- (instancetype) init; + +/** + The property list format. Possible values are described in "NSPropertyListFormat". + */ +@property (nonatomic, assign) NSPropertyListFormat format; + +/** + The property list reading options. Possible values are described in "NSPropertyListMutabilityOptions." + */ +@property (nonatomic, assign) NSPropertyListReadOptions readOptions; + +/** + Creates and returns a property list serializer with a specified format, read options, and write options. + + @param format The property list format. + @param readOptions The property list reading options. + */ ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + readOptions:(NSPropertyListReadOptions)readOptions; + +@end + +#pragma mark - + +/** + `AFImageResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes image responses. + + By default, `AFImageResponseSerializer` accepts the following MIME types, which correspond to the image formats supported by UIImage or NSImage: + + - `image/tiff` + - `image/jpeg` + - `image/gif` + - `image/png` + - `image/ico` + - `image/x-icon` + - `image/bmp` + - `image/x-bmp` + - `image/x-xbitmap` + - `image/x-win-bitmap` + */ +@interface AFImageResponseSerializer : AFHTTPResponseSerializer + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +/** + The scale factor used when interpreting the image data to construct `responseImage`. Specifying a scale factor of 1.0 results in an image whose size matches the pixel-based dimensions of the image. Applying a different scale factor changes the size of the image as reported by the size property. This is set to the value of scale of the main screen by default, which automatically scales images for retina displays, for instance. + */ +@property (nonatomic, assign) CGFloat imageScale; + +/** + Whether to automatically inflate response image data for compressed formats (such as PNG or JPEG). Enabling this can significantly improve drawing performance on iOS when used with `setCompletionBlockWithSuccess:failure:`, as it allows a bitmap representation to be constructed in the background rather than on the main thread. `YES` by default. + */ +@property (nonatomic, assign) BOOL automaticallyInflatesResponseImage; +#endif + +@end + +#pragma mark - + +/** + `AFCompoundSerializer` is a subclass of `AFHTTPResponseSerializer` that delegates the response serialization to the first `AFHTTPResponseSerializer` object that returns an object for `responseObjectForResponse:data:error:`, falling back on the default behavior of `AFHTTPResponseSerializer`. This is useful for supporting multiple potential types and structures of server responses with a single serializer. + */ +@interface AFCompoundResponseSerializer : AFHTTPResponseSerializer + +/** + The component response serializers. + */ +@property (readonly, nonatomic, copy) NSArray *responseSerializers; + +/** + Creates and returns a compound serializer comprised of the specified response serializers. + + @warning Each response serializer specified must be a subclass of `AFHTTPResponseSerializer`, and response to `-validateResponse:data:error:`. + */ ++ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers; + +@end + +///---------------- +/// @name Constants +///---------------- + +/** + ## Error Domains + + The following error domain is predefined. + + - `NSString * const AFURLResponseSerializationErrorDomain` + + ### Constants + + `AFURLResponseSerializationErrorDomain` + AFURLResponseSerializer errors. Error codes for `AFURLResponseSerializationErrorDomain` correspond to codes in `NSURLErrorDomain`. + */ +extern NSString * const AFURLResponseSerializationErrorDomain; + +/** + ## User info dictionary keys + + These keys may exist in the user info dictionary, in addition to those defined for NSError. + + - `NSString * const AFNetworkingOperationFailingURLResponseErrorKey` + - `NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey` + + ### Constants + + `AFNetworkingOperationFailingURLResponseErrorKey` + The corresponding value is an `NSURLResponse` containing the response of the operation associated with an error. This key is only present in the `AFURLResponseSerializationErrorDomain`. + + `AFNetworkingOperationFailingURLResponseDataErrorKey` + The corresponding value is an `NSData` containing the original data of the operation associated with an error. This key is only present in the `AFURLResponseSerializationErrorDomain`. + */ +extern NSString * const AFNetworkingOperationFailingURLResponseErrorKey; + +extern NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey; + + diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m new file mode 100644 index 0000000..c5a8563 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLResponseSerialization.m @@ -0,0 +1,793 @@ +// AFURLResponseSerialization.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFURLResponseSerialization.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) +#import +#endif + +NSString * const AFURLResponseSerializationErrorDomain = @"com.alamofire.error.serialization.response"; +NSString * const AFNetworkingOperationFailingURLResponseErrorKey = @"com.alamofire.serialization.response.error.response"; +NSString * const AFNetworkingOperationFailingURLResponseDataErrorKey = @"com.alamofire.serialization.response.error.data"; + +static NSError * AFErrorWithUnderlyingError(NSError *error, NSError *underlyingError) { + if (!error) { + return underlyingError; + } + + if (!underlyingError || error.userInfo[NSUnderlyingErrorKey]) { + return error; + } + + NSMutableDictionary *mutableUserInfo = [error.userInfo mutableCopy]; + mutableUserInfo[NSUnderlyingErrorKey] = underlyingError; + + return [[NSError alloc] initWithDomain:error.domain code:error.code userInfo:mutableUserInfo]; +} + +static BOOL AFErrorOrUnderlyingErrorHasCodeInDomain(NSError *error, NSInteger code, NSString *domain) { + if ([error.domain isEqualToString:domain] && error.code == code) { + return YES; + } else if (error.userInfo[NSUnderlyingErrorKey]) { + return AFErrorOrUnderlyingErrorHasCodeInDomain(error.userInfo[NSUnderlyingErrorKey], code, domain); + } + + return NO; +} + +static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingOptions readingOptions) { + if ([JSONObject isKindOfClass:[NSArray class]]) { + NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:[(NSArray *)JSONObject count]]; + for (id value in (NSArray *)JSONObject) { + [mutableArray addObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions)]; + } + + return (readingOptions & NSJSONReadingMutableContainers) ? mutableArray : [NSArray arrayWithArray:mutableArray]; + } else if ([JSONObject isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithDictionary:JSONObject]; + for (id key in [(NSDictionary *)JSONObject allKeys]) { + id value = [(NSDictionary *)JSONObject objectForKey:key]; + if (!value || [value isEqual:[NSNull null]]) { + [mutableDictionary removeObjectForKey:key]; + } else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]) { + [mutableDictionary setObject:AFJSONObjectByRemovingKeysWithNullValues(value, readingOptions) forKey:key]; + } + } + + return (readingOptions & NSJSONReadingMutableContainers) ? mutableDictionary : [NSDictionary dictionaryWithDictionary:mutableDictionary]; + } + + return JSONObject; +} + +@implementation AFHTTPResponseSerializer + ++ (instancetype)serializer { + return [[self alloc] init]; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.stringEncoding = NSUTF8StringEncoding; + + self.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)]; + self.acceptableContentTypes = nil; + + return self; +} + +#pragma mark - + +- (BOOL)validateResponse:(NSHTTPURLResponse *)response + data:(NSData *)data + error:(NSError * __autoreleasing *)error +{ + BOOL responseIsValid = YES; + NSError *validationError = nil; + + if (response && [response isKindOfClass:[NSHTTPURLResponse class]]) { + if (self.acceptableContentTypes && ![self.acceptableContentTypes containsObject:[response MIMEType]]) { + if ([data length] > 0 && [response URL]) { + NSMutableDictionary *mutableUserInfo = [@{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: unacceptable content-type: %@", @"AFNetworking", nil), [response MIMEType]], + NSURLErrorFailingURLErrorKey:[response URL], + AFNetworkingOperationFailingURLResponseErrorKey: response, + } mutableCopy]; + if (data) { + mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data; + } + + validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:mutableUserInfo], validationError); + } + + responseIsValid = NO; + } + + if (self.acceptableStatusCodes && ![self.acceptableStatusCodes containsIndex:(NSUInteger)response.statusCode] && [response URL]) { + NSMutableDictionary *mutableUserInfo = [@{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Request failed: %@ (%ld)", @"AFNetworking", nil), [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], (long)response.statusCode], + NSURLErrorFailingURLErrorKey:[response URL], + AFNetworkingOperationFailingURLResponseErrorKey: response, + } mutableCopy]; + + if (data) { + mutableUserInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] = data; + } + + validationError = AFErrorWithUnderlyingError([NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorBadServerResponse userInfo:mutableUserInfo], validationError); + + responseIsValid = NO; + } + } + + if (error && !responseIsValid) { + *error = validationError; + } + + return responseIsValid; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + [self validateResponse:(NSHTTPURLResponse *)response data:data error:error]; + + return data; +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [self init]; + if (!self) { + return nil; + } + + self.acceptableStatusCodes = [decoder decodeObjectOfClass:[NSIndexSet class] forKey:NSStringFromSelector(@selector(acceptableStatusCodes))]; + self.acceptableContentTypes = [decoder decodeObjectOfClass:[NSIndexSet class] forKey:NSStringFromSelector(@selector(acceptableContentTypes))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.acceptableStatusCodes forKey:NSStringFromSelector(@selector(acceptableStatusCodes))]; + [coder encodeObject:self.acceptableContentTypes forKey:NSStringFromSelector(@selector(acceptableContentTypes))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFHTTPResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.acceptableStatusCodes = [self.acceptableStatusCodes copyWithZone:zone]; + serializer.acceptableContentTypes = [self.acceptableContentTypes copyWithZone:zone]; + + return serializer; +} + +@end + +#pragma mark - + +@implementation AFJSONResponseSerializer + ++ (instancetype)serializer { + return [self serializerWithReadingOptions:(NSJSONReadingOptions)0]; +} + ++ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions { + AFJSONResponseSerializer *serializer = [[self alloc] init]; + serializer.readingOptions = readingOptions; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + // Workaround for behavior of Rails to return a single space for `head :ok` (a workaround for a bug in Safari), which is not interpreted as valid input by NSJSONSerialization. + // See https://github.com/rails/rails/issues/1742 + NSStringEncoding stringEncoding = self.stringEncoding; + if (response.textEncodingName) { + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName); + if (encoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(encoding); + } + } + + id responseObject = nil; + NSError *serializationError = nil; + @autoreleasepool { + NSString *responseString = [[NSString alloc] initWithData:data encoding:stringEncoding]; + if (responseString && ![responseString isEqualToString:@" "]) { + // Workaround for a bug in NSJSONSerialization when Unicode character escape codes are used instead of the actual character + // See http://stackoverflow.com/a/12843465/157142 + data = [responseString dataUsingEncoding:NSUTF8StringEncoding]; + + if (data) { + if ([data length] > 0) { + responseObject = [NSJSONSerialization JSONObjectWithData:data options:self.readingOptions error:&serializationError]; + } else { + return nil; + } + } else { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedStringFromTable(@"Data failed decoding as a UTF-8 string", @"AFNetworking", nil), + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedStringFromTable(@"Could not decode string: %@", @"AFNetworking", nil), responseString] + }; + + serializationError = [NSError errorWithDomain:AFURLResponseSerializationErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:userInfo]; + } + } + } + + if (self.removesKeysWithNullValues && responseObject) { + responseObject = AFJSONObjectByRemovingKeysWithNullValues(responseObject, self.readingOptions); + } + + if (error) { + *error = AFErrorWithUnderlyingError(serializationError, *error); + } + + return responseObject; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.readingOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(readingOptions))] unsignedIntegerValue]; + self.removesKeysWithNullValues = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(removesKeysWithNullValues))] boolValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:@(self.readingOptions) forKey:NSStringFromSelector(@selector(readingOptions))]; + [coder encodeObject:@(self.removesKeysWithNullValues) forKey:NSStringFromSelector(@selector(removesKeysWithNullValues))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFJSONResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.readingOptions = self.readingOptions; + serializer.removesKeysWithNullValues = self.removesKeysWithNullValues; + + return serializer; +} + +@end + +#pragma mark - + +@implementation AFXMLParserResponseSerializer + ++ (instancetype)serializer { + AFXMLParserResponseSerializer *serializer = [[self alloc] init]; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSHTTPURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + return [[NSXMLParser alloc] initWithData:data]; +} + +@end + +#pragma mark - + +#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED + +@implementation AFXMLDocumentResponseSerializer + ++ (instancetype)serializer { + return [self serializerWithXMLDocumentOptions:0]; +} + ++ (instancetype)serializerWithXMLDocumentOptions:(NSUInteger)mask { + AFXMLDocumentResponseSerializer *serializer = [[self alloc] init]; + serializer.options = mask; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + NSError *serializationError = nil; + NSXMLDocument *document = [[NSXMLDocument alloc] initWithData:data options:self.options error:&serializationError]; + + if (error) { + *error = AFErrorWithUnderlyingError(serializationError, *error); + } + + return document; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.options = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(options))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:@(self.options) forKey:NSStringFromSelector(@selector(options))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFXMLDocumentResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.options = self.options; + + return serializer; +} + +@end + +#endif + +#pragma mark - + +@implementation AFPropertyListResponseSerializer + ++ (instancetype)serializer { + return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 readOptions:0]; +} + ++ (instancetype)serializerWithFormat:(NSPropertyListFormat)format + readOptions:(NSPropertyListReadOptions)readOptions +{ + AFPropertyListResponseSerializer *serializer = [[self alloc] init]; + serializer.format = format; + serializer.readOptions = readOptions; + + return serializer; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/x-plist", nil]; + + return self; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + + id responseObject; + NSError *serializationError = nil; + + if (data) { + responseObject = [NSPropertyListSerialization propertyListWithData:data options:self.readOptions format:NULL error:&serializationError]; + } + + if (error) { + *error = AFErrorWithUnderlyingError(serializationError, *error); + } + + return responseObject; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.format = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(format))] unsignedIntegerValue]; + self.readOptions = [[decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(readOptions))] unsignedIntegerValue]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:@(self.format) forKey:NSStringFromSelector(@selector(format))]; + [coder encodeObject:@(self.readOptions) forKey:NSStringFromSelector(@selector(readOptions))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFPropertyListResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.format = self.format; + serializer.readOptions = self.readOptions; + + return serializer; +} + +@end + +#pragma mark - + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +#import + +static UIImage * AFImageWithDataAtScale(NSData *data, CGFloat scale) { + UIImage *image = [[UIImage alloc] initWithData:data]; + + return [[UIImage alloc] initWithCGImage:[image CGImage] scale:scale orientation:image.imageOrientation]; +} + +static UIImage * AFInflatedImageFromResponseWithDataAtScale(NSHTTPURLResponse *response, NSData *data, CGFloat scale) { + if (!data || [data length] == 0) { + return nil; + } + + CGImageRef imageRef = NULL; + CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); + + if ([response.MIMEType isEqualToString:@"image/png"]) { + imageRef = CGImageCreateWithPNGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); + } else if ([response.MIMEType isEqualToString:@"image/jpeg"]) { + imageRef = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); + + // CGImageCreateWithJPEGDataProvider does not properly handle CMKY, so if so, fall back to AFImageWithDataAtScale + if (imageRef) { + CGColorSpaceRef imageColorSpace = CGImageGetColorSpace(imageRef); + CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(imageColorSpace); + if (imageColorSpaceModel == kCGColorSpaceModelCMYK) { + CGImageRelease(imageRef); + imageRef = NULL; + } + } + } + + CGDataProviderRelease(dataProvider); + + UIImage *image = AFImageWithDataAtScale(data, scale); + if (!imageRef) { + if (image.images || !image) { + return image; + } + + imageRef = CGImageCreateCopy([image CGImage]); + if (!imageRef) { + return nil; + } + } + + size_t width = CGImageGetWidth(imageRef); + size_t height = CGImageGetHeight(imageRef); + size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef); + + if (width * height > 1024 * 1024 || bitsPerComponent > 8) { + CGImageRelease(imageRef); + + return image; + } + + size_t bytesPerRow = 0; // CGImageGetBytesPerRow() calculates incorrectly in iOS 5.0, so defer to CGBitmapContextCreate + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace); + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); + + if (colorSpaceModel == kCGColorSpaceModelRGB) { + uint32_t alpha = (bitmapInfo & kCGBitmapAlphaInfoMask); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wassign-enum" + if (alpha == kCGImageAlphaNone) { + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaNoneSkipFirst; + } else if (!(alpha == kCGImageAlphaNoneSkipFirst || alpha == kCGImageAlphaNoneSkipLast)) { + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaPremultipliedFirst; + } +#pragma clang diagnostic pop + } + + CGContextRef context = CGBitmapContextCreate(NULL, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo); + + CGColorSpaceRelease(colorSpace); + + if (!context) { + CGImageRelease(imageRef); + + return image; + } + + CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), imageRef); + CGImageRef inflatedImageRef = CGBitmapContextCreateImage(context); + + CGContextRelease(context); + + UIImage *inflatedImage = [[UIImage alloc] initWithCGImage:inflatedImageRef scale:scale orientation:image.imageOrientation]; + + CGImageRelease(inflatedImageRef); + CGImageRelease(imageRef); + + return inflatedImage; +} +#endif + + +@implementation AFImageResponseSerializer + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap", nil]; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + self.imageScale = [[UIScreen mainScreen] scale]; + self.automaticallyInflatesResponseImage = YES; +#endif + + return self; +} + +#pragma mark - AFURLResponseSerializer + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + if (![self validateResponse:(NSHTTPURLResponse *)response data:data error:error]) { + if (!error || AFErrorOrUnderlyingErrorHasCodeInDomain(*error, NSURLErrorCannotDecodeContentData, AFURLResponseSerializationErrorDomain)) { + return nil; + } + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + if (self.automaticallyInflatesResponseImage) { + return AFInflatedImageFromResponseWithDataAtScale((NSHTTPURLResponse *)response, data, self.imageScale); + } else { + return AFImageWithDataAtScale(data, self.imageScale); + } +#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) + // Ensure that the image is set to it's correct pixel width and height + NSBitmapImageRep *bitimage = [[NSBitmapImageRep alloc] initWithData:data]; + NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize([bitimage pixelsWide], [bitimage pixelsHigh])]; + [image addRepresentation:bitimage]; + + return image; +#endif + + return nil; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + NSNumber *imageScale = [decoder decodeObjectOfClass:[NSNumber class] forKey:NSStringFromSelector(@selector(imageScale))]; +#if CGFLOAT_IS_DOUBLE + self.imageScale = [imageScale doubleValue]; +#else + self.imageScale = [imageScale floatValue]; +#endif + + self.automaticallyInflatesResponseImage = [decoder decodeBoolForKey:NSStringFromSelector(@selector(automaticallyInflatesResponseImage))]; +#endif + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + [coder encodeObject:@(self.imageScale) forKey:NSStringFromSelector(@selector(imageScale))]; + [coder encodeBool:self.automaticallyInflatesResponseImage forKey:NSStringFromSelector(@selector(automaticallyInflatesResponseImage))]; +#endif +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFImageResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + serializer.imageScale = self.imageScale; + serializer.automaticallyInflatesResponseImage = self.automaticallyInflatesResponseImage; +#endif + + return serializer; +} + +@end + +#pragma mark - + +@interface AFCompoundResponseSerializer () +@property (readwrite, nonatomic, copy) NSArray *responseSerializers; +@end + +@implementation AFCompoundResponseSerializer + ++ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers { + AFCompoundResponseSerializer *serializer = [[self alloc] init]; + serializer.responseSerializers = responseSerializers; + + return serializer; +} + +#pragma mark - AFURLResponseSerialization + +- (id)responseObjectForResponse:(NSURLResponse *)response + data:(NSData *)data + error:(NSError *__autoreleasing *)error +{ + for (id serializer in self.responseSerializers) { + if (![serializer isKindOfClass:[AFHTTPResponseSerializer class]]) { + continue; + } + + NSError *serializerError = nil; + id responseObject = [serializer responseObjectForResponse:response data:data error:&serializerError]; + if (responseObject) { + if (error) { + *error = AFErrorWithUnderlyingError(serializerError, *error); + } + + return responseObject; + } + } + + return [super responseObjectForResponse:response data:data error:error]; +} + +#pragma mark - NSSecureCoding + +- (id)initWithCoder:(NSCoder *)decoder { + self = [super initWithCoder:decoder]; + if (!self) { + return nil; + } + + self.responseSerializers = [decoder decodeObjectOfClass:[NSArray class] forKey:NSStringFromSelector(@selector(responseSerializers))]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [super encodeWithCoder:coder]; + + [coder encodeObject:self.responseSerializers forKey:NSStringFromSelector(@selector(responseSerializers))]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + AFCompoundResponseSerializer *serializer = [[[self class] allocWithZone:zone] init]; + serializer.responseSerializers = self.responseSerializers; + + return serializer; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h new file mode 100644 index 0000000..966c3e8 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLSessionManager.h @@ -0,0 +1,531 @@ +// AFURLSessionManager.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import "AFURLResponseSerialization.h" +#import "AFURLRequestSerialization.h" +#import "AFSecurityPolicy.h" +#import "AFNetworkReachabilityManager.h" + +/** + `AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to ``, ``, ``, and ``. + + ## Subclassing Notes + + This is the base class for `AFHTTPSessionManager`, which adds functionality specific to making HTTP requests. If you are looking to extend `AFURLSessionManager` specifically for HTTP, consider subclassing `AFHTTPSessionManager` instead. + + ## NSURLSession & NSURLSessionTask Delegate Methods + + `AFURLSessionManager` implements the following delegate methods: + + ### `NSURLSessionDelegate` + + - `URLSession:didBecomeInvalidWithError:` + - `URLSession:didReceiveChallenge:completionHandler:` + - `URLSessionDidFinishEventsForBackgroundURLSession:` + + ### `NSURLSessionTaskDelegate` + + - `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:` + - `URLSession:task:didReceiveChallenge:completionHandler:` + - `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:` + - `URLSession:task:didCompleteWithError:` + + ### `NSURLSessionDataDelegate` + + - `URLSession:dataTask:didReceiveResponse:completionHandler:` + - `URLSession:dataTask:didBecomeDownloadTask:` + - `URLSession:dataTask:didReceiveData:` + - `URLSession:dataTask:willCacheResponse:completionHandler:` + + ### `NSURLSessionDownloadDelegate` + + - `URLSession:downloadTask:didFinishDownloadingToURL:` + - `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:` + - `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:` + + If any of these methods are overridden in a subclass, they _must_ call the `super` implementation first. + + ## Network Reachability Monitoring + + Network reachability status and change monitoring is available through the `reachabilityManager` property. Applications may choose to monitor network reachability conditions in order to prevent or suspend any outbound requests. See `AFNetworkReachabilityManager` for more details. + + ## NSCoding Caveats + + - Encoded managers do not include any block properties. Be sure to set delegate callback blocks when using `-initWithCoder:` or `NSKeyedUnarchiver`. + + ## NSCopying Caveats + + - `-copy` and `-copyWithZone:` return a new manager with a new `NSURLSession` created from the configuration of the original. + - Operation copies do not include any delegate callback blocks, as they often strongly captures a reference to `self`, which would otherwise have the unintuitive side-effect of pointing to the _original_ session manager when copied. + + @warning Managers for background sessions must be owned for the duration of their use. This can be accomplished by creating an application-wide or shared singleton instance. + */ + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +@interface AFURLSessionManager : NSObject + +/** + The managed session. + */ +@property (readonly, nonatomic, strong) NSURLSession *session; + +/** + The operation queue on which delegate callbacks are run. + */ +@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue; + +/** + Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `AFJSONResponseSerializer`. + + @warning `responseSerializer` must not be `nil`. + */ +@property (nonatomic, strong) id responseSerializer; + +///------------------------------- +/// @name Managing Security Policy +///------------------------------- + +/** + The security policy used by created request operations to evaluate server trust for secure connections. `AFURLSessionManager` uses the `defaultPolicy` unless otherwise specified. + */ +@property (nonatomic, strong) AFSecurityPolicy *securityPolicy; + +///-------------------------------------- +/// @name Monitoring Network Reachability +///-------------------------------------- + +/** + The network reachability manager. `AFURLSessionManager` uses the `sharedManager` by default. + */ +@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager; + +///---------------------------- +/// @name Getting Session Tasks +///---------------------------- + +/** + The data, upload, and download tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *tasks; + +/** + The data tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *dataTasks; + +/** + The upload tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *uploadTasks; + +/** + The download tasks currently run by the managed session. + */ +@property (readonly, nonatomic, strong) NSArray *downloadTasks; + +///------------------------------- +/// @name Managing Callback Queues +///------------------------------- + +/** + The dispatch queue for `completionBlock`. If `NULL` (default), the main queue is used. + */ +@property (nonatomic, strong) dispatch_queue_t completionQueue; + +/** + The dispatch group for `completionBlock`. If `NULL` (default), a private dispatch group is used. + */ +@property (nonatomic, strong) dispatch_group_t completionGroup; + +///--------------------------------- +/// @name Working Around System Bugs +///--------------------------------- + +/** + Whether to attempt to retry creation of upload tasks for background sessions when initial call returns `nil`. `NO` by default. + + @bug As of iOS 7.0, there is a bug where upload tasks created for background tasks are sometimes `nil`. As a workaround, if this property is `YES`, AFNetworking will follow Apple's recommendation to try creating the task again. + + @see https://github.com/AFNetworking/AFNetworking/issues/1675 + */ +@property (nonatomic, assign) BOOL attemptsToRecreateUploadTasksForBackgroundSessions; + +///--------------------- +/// @name Initialization +///--------------------- + +/** + Creates and returns a manager for a session created with the specified configuration. This is the designated initializer. + + @param configuration The configuration used to create the managed session. + + @return A manager for a newly-created session. + */ +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration NS_DESIGNATED_INITIALIZER; + +/** + Invalidates the managed session, optionally canceling pending tasks. + + @param cancelPendingTasks Whether or not to cancel pending tasks. + */ +- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks; + +///------------------------- +/// @name Running Data Tasks +///------------------------- + +/** + Creates an `NSURLSessionDataTask` with the specified request. + + @param request The HTTP request for the request. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + */ +- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + +///--------------------------- +/// @name Running Upload Tasks +///--------------------------- + +/** + Creates an `NSURLSessionUploadTask` with the specified request for a local file. + + @param request The HTTP request for the request. + @param fileURL A URL to the local file to be uploaded. + @param progress A progress object monitoring the current upload progress. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + + @see `attemptsToRecreateUploadTasksForBackgroundSessions` + */ +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromFile:(NSURL *)fileURL + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + +/** + Creates an `NSURLSessionUploadTask` with the specified request for an HTTP body. + + @param request The HTTP request for the request. + @param bodyData A data object containing the HTTP body to be uploaded. + @param progress A progress object monitoring the current upload progress. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + */ +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromData:(NSData *)bodyData + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + +/** + Creates an `NSURLSessionUploadTask` with the specified streaming request. + + @param request The HTTP request for the request. + @param progress A progress object monitoring the current upload progress. + @param completionHandler A block object to be executed when the task finishes. This block has no return value and takes three arguments: the server response, the response object created by that serializer, and the error that occurred, if any. + */ +- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; + +///----------------------------- +/// @name Running Download Tasks +///----------------------------- + +/** + Creates an `NSURLSessionDownloadTask` with the specified request. + + @param request The HTTP request for the request. + @param progress A progress object monitoring the current download progress. + @param destination A block object to be executed in order to determine the destination of the downloaded file. This block takes two arguments, the target path & the server response, and returns the desired file URL of the resulting download. The temporary file used during the download will be automatically deleted after being moved to the returned URL. + @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any. + + @warning If using a background `NSURLSessionConfiguration` on iOS, these blocks will be lost when the app is terminated. Background sessions may prefer to use `-setDownloadTaskDidFinishDownloadingBlock:` to specify the URL for saving the downloaded file, rather than the destination block of this method. + */ +- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler; + +/** + Creates an `NSURLSessionDownloadTask` with the specified resume data. + + @param resumeData The data used to resume downloading. + @param progress A progress object monitoring the current download progress. + @param destination A block object to be executed in order to determine the destination of the downloaded file. This block takes two arguments, the target path & the server response, and returns the desired file URL of the resulting download. The temporary file used during the download will be automatically deleted after being moved to the returned URL. + @param completionHandler A block to be executed when a task finishes. This block has no return value and takes three arguments: the server response, the path of the downloaded file, and the error describing the network or parsing error that occurred, if any. + */ +- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler; + +///--------------------------------- +/// @name Getting Progress for Tasks +///--------------------------------- + +/** + Returns the upload progress of the specified task. + + @param uploadTask The session upload task. Must not be `nil`. + + @return An `NSProgress` object reporting the upload progress of a task, or `nil` if the progress is unavailable. + */ +- (NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask; + +/** + Returns the download progress of the specified task. + + @param downloadTask The session download task. Must not be `nil`. + + @return An `NSProgress` object reporting the download progress of a task, or `nil` if the progress is unavailable. + */ +- (NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask; + +///----------------------------------------- +/// @name Setting Session Delegate Callbacks +///----------------------------------------- + +/** + Sets a block to be executed when the managed session becomes invalid, as handled by the `NSURLSessionDelegate` method `URLSession:didBecomeInvalidWithError:`. + + @param block A block object to be executed when the managed session becomes invalid. The block has no return value, and takes two arguments: the session, and the error related to the cause of invalidation. + */ +- (void)setSessionDidBecomeInvalidBlock:(void (^)(NSURLSession *session, NSError *error))block; + +/** + Sets a block to be executed when a connection level authentication challenge has occurred, as handled by the `NSURLSessionDelegate` method `URLSession:didReceiveChallenge:completionHandler:`. + + @param block A block object to be executed when a connection level authentication challenge has occurred. The block returns the disposition of the authentication challenge, and takes three arguments: the session, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge. + */ +- (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block; + +///-------------------------------------- +/// @name Setting Task Delegate Callbacks +///-------------------------------------- + +/** + Sets a block to be executed when a task requires a new request body stream to send to the remote server, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:needNewBodyStream:`. + + @param block A block object to be executed when a task requires a new request body stream. + */ +- (void)setTaskNeedNewBodyStreamBlock:(NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block; + +/** + Sets a block to be executed when an HTTP request is attempting to perform a redirection to a different URL, as handled by the `NSURLSessionTaskDelegate` method `URLSession:willPerformHTTPRedirection:newRequest:completionHandler:`. + + @param block A block object to be executed when an HTTP request is attempting to perform a redirection to a different URL. The block returns the request to be made for the redirection, and takes four arguments: the session, the task, the redirection response, and the request corresponding to the redirection response. + */ +- (void)setTaskWillPerformHTTPRedirectionBlock:(NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block; + +/** + Sets a block to be executed when a session task has received a request specific authentication challenge, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didReceiveChallenge:completionHandler:`. + + @param block A block object to be executed when a session task has received a request specific authentication challenge. The block returns the disposition of the authentication challenge, and takes four arguments: the session, the task, the authentication challenge, and a pointer to the credential that should be used to resolve the challenge. + */ +- (void)setTaskDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block; + +/** + Sets a block to be executed periodically to track upload progress, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`. + + @param block A block object to be called when an undetermined number of bytes have been uploaded to the server. This block has no return value and takes five arguments: the session, the task, the number of bytes written since the last time the upload progress block was called, the total bytes written, and the total bytes expected to be written during the request, as initially determined by the length of the HTTP body. This block may be called multiple times, and will execute on the main thread. + */ +- (void)setTaskDidSendBodyDataBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block; + +/** + Sets a block to be executed as the last message related to a specific task, as handled by the `NSURLSessionTaskDelegate` method `URLSession:task:didCompleteWithError:`. + + @param block A block object to be executed when a session task is completed. The block has no return value, and takes three arguments: the session, the task, and any error that occurred in the process of executing the task. + */ +- (void)setTaskDidCompleteBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block; + +///------------------------------------------- +/// @name Setting Data Task Delegate Callbacks +///------------------------------------------- + +/** + Sets a block to be executed when a data task has received a response, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveResponse:completionHandler:`. + + @param block A block object to be executed when a data task has received a response. The block returns the disposition of the session response, and takes three arguments: the session, the data task, and the received response. + */ +- (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block; + +/** + Sets a block to be executed when a data task has become a download task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didBecomeDownloadTask:`. + + @param block A block object to be executed when a data task has become a download task. The block has no return value, and takes three arguments: the session, the data task, and the download task it has become. + */ +- (void)setDataTaskDidBecomeDownloadTaskBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block; + +/** + Sets a block to be executed when a data task receives data, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:didReceiveData:`. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the session, the data task, and the data received. This block may be called multiple times, and will execute on the session manager operation queue. + */ +- (void)setDataTaskDidReceiveDataBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block; + +/** + Sets a block to be executed to determine the caching behavior of a data task, as handled by the `NSURLSessionDataDelegate` method `URLSession:dataTask:willCacheResponse:completionHandler:`. + + @param block A block object to be executed to determine the caching behavior of a data task. The block returns the response to cache, and takes three arguments: the session, the data task, and the proposed cached URL response. + */ +- (void)setDataTaskWillCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block; + +/** + Sets a block to be executed once all messages enqueued for a session have been delivered, as handled by the `NSURLSessionDataDelegate` method `URLSessionDidFinishEventsForBackgroundURLSession:`. + + @param block A block object to be executed once all messages enqueued for a session have been delivered. The block has no return value and takes a single argument: the session. + */ +- (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block; + +///----------------------------------------------- +/// @name Setting Download Task Delegate Callbacks +///----------------------------------------------- + +/** + Sets a block to be executed when a download task has completed a download, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didFinishDownloadingToURL:`. + + @param block A block object to be executed when a download task has completed. The block returns the URL the download should be moved to, and takes three arguments: the session, the download task, and the temporary location of the downloaded file. If the file manager encounters an error while attempting to move the temporary file to the destination, an `AFURLSessionDownloadTaskDidFailToMoveFileNotification` will be posted, with the download task as its object, and the user info of the error. + */ +- (void)setDownloadTaskDidFinishDownloadingBlock:(NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block; + +/** + Sets a block to be executed periodically to track download progress, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesWritten:totalBytesExpectedToWrite:`. + + @param block A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes five arguments: the session, the download task, the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the session manager operation queue. + */ +- (void)setDownloadTaskDidWriteDataBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block; + +/** + Sets a block to be executed when a download task has been resumed, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`. + + @param block A block object to be executed when a download task has been resumed. The block has no return value and takes four arguments: the session, the download task, the file offset of the resumed download, and the total number of bytes expected to be downloaded. + */ +- (void)setDownloadTaskDidResumeBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block; + +@end + +#endif + +///-------------------- +/// @name Notifications +///-------------------- + +/** + Posted when a task begins executing. + + @deprecated Use `AFNetworkingTaskDidResumeNotification` instead. + */ +extern NSString * const AFNetworkingTaskDidStartNotification DEPRECATED_ATTRIBUTE; + +/** + Posted when a task resumes. + */ +extern NSString * const AFNetworkingTaskDidResumeNotification; + +/** + Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task. + + @deprecated Use `AFNetworkingTaskDidCompleteNotification` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishNotification DEPRECATED_ATTRIBUTE; + +/** + Posted when a task finishes executing. Includes a userInfo dictionary with additional information about the task. + */ +extern NSString * const AFNetworkingTaskDidCompleteNotification; + +/** + Posted when a task suspends its execution. + */ +extern NSString * const AFNetworkingTaskDidSuspendNotification; + +/** + Posted when a session is invalidated. + */ +extern NSString * const AFURLSessionDidInvalidateNotification; + +/** + Posted when a session download task encountered an error when moving the temporary download file to a specified destination. + */ +extern NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification; + +/** + The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if response data exists for the task. + + @deprecated Use `AFNetworkingTaskDidCompleteResponseDataKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishResponseDataKey DEPRECATED_ATTRIBUTE; + +/** + The raw response data of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if response data exists for the task. + */ +extern NSString * const AFNetworkingTaskDidCompleteResponseDataKey; + +/** + The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the response was serialized. + + @deprecated Use `AFNetworkingTaskDidCompleteSerializedResponseKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishSerializedResponseKey DEPRECATED_ATTRIBUTE; + +/** + The serialized response object of the task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the response was serialized. + */ +extern NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey; + +/** + The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the task has an associated response serializer. + + @deprecated Use `AFNetworkingTaskDidCompleteResponseSerializerKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishResponseSerializerKey DEPRECATED_ATTRIBUTE; + +/** + The response serializer used to serialize the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if the task has an associated response serializer. + */ +extern NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey; + +/** + The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an the response data has been stored directly to disk. + + @deprecated Use `AFNetworkingTaskDidCompleteAssetPathKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishAssetPathKey DEPRECATED_ATTRIBUTE; + +/** + The file path associated with the download task. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an the response data has been stored directly to disk. + */ +extern NSString * const AFNetworkingTaskDidCompleteAssetPathKey; + +/** + Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists. + + @deprecated Use `AFNetworkingTaskDidCompleteErrorKey` instead. + */ +extern NSString * const AFNetworkingTaskDidFinishErrorKey DEPRECATED_ATTRIBUTE; + +/** + Any error associated with the task, or the serialization of the response. Included in the userInfo dictionary of the `AFNetworkingTaskDidFinishNotification` if an error exists. + */ +extern NSString * const AFNetworkingTaskDidCompleteErrorKey; diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m new file mode 100644 index 0000000..a6ebbee --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/AFNetworking/AFURLSessionManager.m @@ -0,0 +1,1094 @@ +// AFURLSessionManager.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFURLSessionManager.h" +#import + +#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1090) + +static dispatch_queue_t url_session_manager_creation_queue() { + static dispatch_queue_t af_url_session_manager_creation_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_creation_queue = dispatch_queue_create("com.alamofire.networking.session.manager.creation", DISPATCH_QUEUE_SERIAL); + }); + + return af_url_session_manager_creation_queue; +} + +static dispatch_queue_t url_session_manager_processing_queue() { + static dispatch_queue_t af_url_session_manager_processing_queue; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_processing_queue = dispatch_queue_create("com.alamofire.networking.session.manager.processing", DISPATCH_QUEUE_CONCURRENT); + }); + + return af_url_session_manager_processing_queue; +} + +static dispatch_group_t url_session_manager_completion_group() { + static dispatch_group_t af_url_session_manager_completion_group; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_url_session_manager_completion_group = dispatch_group_create(); + }); + + return af_url_session_manager_completion_group; +} + +NSString * const AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume"; +NSString * const AFNetworkingTaskDidCompleteNotification = @"com.alamofire.networking.task.complete"; +NSString * const AFNetworkingTaskDidSuspendNotification = @"com.alamofire.networking.task.suspend"; +NSString * const AFURLSessionDidInvalidateNotification = @"com.alamofire.networking.session.invalidate"; +NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification = @"com.alamofire.networking.session.download.file-manager-error"; + +NSString * const AFNetworkingTaskDidStartNotification = @"com.alamofire.networking.task.resume"; // Deprecated +NSString * const AFNetworkingTaskDidFinishNotification = @"com.alamofire.networking.task.complete"; // Deprecated + +NSString * const AFNetworkingTaskDidCompleteSerializedResponseKey = @"com.alamofire.networking.task.complete.serializedresponse"; +NSString * const AFNetworkingTaskDidCompleteResponseSerializerKey = @"com.alamofire.networking.task.complete.responseserializer"; +NSString * const AFNetworkingTaskDidCompleteResponseDataKey = @"com.alamofire.networking.complete.finish.responsedata"; +NSString * const AFNetworkingTaskDidCompleteErrorKey = @"com.alamofire.networking.task.complete.error"; +NSString * const AFNetworkingTaskDidCompleteAssetPathKey = @"com.alamofire.networking.task.complete.assetpath"; + +NSString * const AFNetworkingTaskDidFinishSerializedResponseKey = @"com.alamofire.networking.task.complete.serializedresponse"; // Deprecated +NSString * const AFNetworkingTaskDidFinishResponseSerializerKey = @"com.alamofire.networking.task.complete.responseserializer"; // Deprecated +NSString * const AFNetworkingTaskDidFinishResponseDataKey = @"com.alamofire.networking.complete.finish.responsedata"; // Deprecated +NSString * const AFNetworkingTaskDidFinishErrorKey = @"com.alamofire.networking.task.complete.error"; // Deprecated +NSString * const AFNetworkingTaskDidFinishAssetPathKey = @"com.alamofire.networking.task.complete.assetpath"; // Deprecated + +static NSString * const AFURLSessionManagerLockName = @"com.alamofire.networking.session.manager.lock"; + +static NSUInteger const AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask = 3; + +static void * AFTaskStateChangedContext = &AFTaskStateChangedContext; + +typedef void (^AFURLSessionDidBecomeInvalidBlock)(NSURLSession *session, NSError *error); +typedef NSURLSessionAuthChallengeDisposition (^AFURLSessionDidReceiveAuthenticationChallengeBlock)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential); + +typedef NSURLRequest * (^AFURLSessionTaskWillPerformHTTPRedirectionBlock)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request); +typedef NSURLSessionAuthChallengeDisposition (^AFURLSessionTaskDidReceiveAuthenticationChallengeBlock)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential); +typedef void (^AFURLSessionDidFinishEventsForBackgroundURLSessionBlock)(NSURLSession *session); + +typedef NSInputStream * (^AFURLSessionTaskNeedNewBodyStreamBlock)(NSURLSession *session, NSURLSessionTask *task); +typedef void (^AFURLSessionTaskDidSendBodyDataBlock)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend); +typedef void (^AFURLSessionTaskDidCompleteBlock)(NSURLSession *session, NSURLSessionTask *task, NSError *error); + +typedef NSURLSessionResponseDisposition (^AFURLSessionDataTaskDidReceiveResponseBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response); +typedef void (^AFURLSessionDataTaskDidBecomeDownloadTaskBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask); +typedef void (^AFURLSessionDataTaskDidReceiveDataBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data); +typedef NSCachedURLResponse * (^AFURLSessionDataTaskWillCacheResponseBlock)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse); + +typedef NSURL * (^AFURLSessionDownloadTaskDidFinishDownloadingBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location); +typedef void (^AFURLSessionDownloadTaskDidWriteDataBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite); +typedef void (^AFURLSessionDownloadTaskDidResumeBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes); + +typedef void (^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id responseObject, NSError *error); + +#pragma mark - + +@interface AFURLSessionManagerTaskDelegate : NSObject +@property (nonatomic, weak) AFURLSessionManager *manager; +@property (nonatomic, strong) NSMutableData *mutableData; +@property (nonatomic, strong) NSProgress *progress; +@property (nonatomic, copy) NSURL *downloadFileURL; +@property (nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading; +@property (nonatomic, copy) AFURLSessionTaskCompletionHandler completionHandler; +@end + +@implementation AFURLSessionManagerTaskDelegate + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.mutableData = [NSMutableData data]; + + self.progress = [NSProgress progressWithTotalUnitCount:0]; + + return self; +} + +#pragma mark - NSURLSessionTaskDelegate + +- (void)URLSession:(__unused NSURLSession *)session + task:(__unused NSURLSessionTask *)task + didSendBodyData:(__unused int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend +{ + self.progress.totalUnitCount = totalBytesExpectedToSend; + self.progress.completedUnitCount = totalBytesSent; +} + +- (void)URLSession:(__unused NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error +{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + __strong AFURLSessionManager *manager = self.manager; + + __block id responseObject = nil; + + __block NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + userInfo[AFNetworkingTaskDidCompleteResponseSerializerKey] = manager.responseSerializer; + + if (self.downloadFileURL) { + userInfo[AFNetworkingTaskDidCompleteAssetPathKey] = self.downloadFileURL; + } else if (self.mutableData) { + userInfo[AFNetworkingTaskDidCompleteResponseDataKey] = [NSData dataWithData:self.mutableData]; + } + + if (error) { + userInfo[AFNetworkingTaskDidCompleteErrorKey] = error; + + dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{ + if (self.completionHandler) { + self.completionHandler(task.response, responseObject, error); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo]; + }); + }); + } else { + dispatch_async(url_session_manager_processing_queue(), ^{ + NSError *serializationError = nil; + responseObject = [manager.responseSerializer responseObjectForResponse:task.response data:[NSData dataWithData:self.mutableData] error:&serializationError]; + + if (self.downloadFileURL) { + responseObject = self.downloadFileURL; + } + + if (responseObject) { + userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey] = responseObject; + } + + if (serializationError) { + userInfo[AFNetworkingTaskDidCompleteErrorKey] = serializationError; + } + + dispatch_group_async(manager.completionGroup ?: url_session_manager_completion_group(), manager.completionQueue ?: dispatch_get_main_queue(), ^{ + if (self.completionHandler) { + self.completionHandler(task.response, responseObject, serializationError); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo]; + }); + }); + }); + } +#pragma clang diagnostic pop +} + +#pragma mark - NSURLSessionDataTaskDelegate + +- (void)URLSession:(__unused NSURLSession *)session + dataTask:(__unused NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data +{ + [self.mutableData appendData:data]; +} + +#pragma mark - NSURLSessionDownloadTaskDelegate + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location +{ + NSError *fileManagerError = nil; + self.downloadFileURL = nil; + + if (self.downloadTaskDidFinishDownloading) { + self.downloadFileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location); + if (self.downloadFileURL) { + [[NSFileManager defaultManager] moveItemAtURL:location toURL:self.downloadFileURL error:&fileManagerError]; + + if (fileManagerError) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:fileManagerError.userInfo]; + } + } + } +} + +- (void)URLSession:(__unused NSURLSession *)session + downloadTask:(__unused NSURLSessionDownloadTask *)downloadTask + didWriteData:(__unused int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite +{ + self.progress.totalUnitCount = totalBytesExpectedToWrite; + self.progress.completedUnitCount = totalBytesWritten; +} + +- (void)URLSession:(__unused NSURLSession *)session + downloadTask:(__unused NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes { + self.progress.totalUnitCount = expectedTotalBytes; + self.progress.completedUnitCount = fileOffset; +} + +@end + +#pragma mark - + +/* + A workaround for issues related to key-value observing the `state` of an `NSURLSessionTask`. + + See https://github.com/AFNetworking/AFNetworking/issues/1477 + */ + +static inline void af_swizzleSelector(Class class, SEL originalSelector, SEL swizzledSelector) { + Method originalMethod = class_getInstanceMethod(class, originalSelector); + Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); + if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) { + class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); + } else { + method_exchangeImplementations(originalMethod, swizzledMethod); + } +} + +static NSString * const AFNSURLSessionTaskDidResumeNotification = @"com.alamofire.networking.nsurlsessiontask.resume"; +static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofire.networking.nsurlsessiontask.suspend"; + +@interface NSURLSessionTask (_AFStateObserving) +@end + +@implementation NSURLSessionTask (_AFStateObserving) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + af_swizzleSelector([self class], @selector(resume), @selector(af_resume)); + af_swizzleSelector([self class], @selector(suspend), @selector(af_suspend)); + }); +} + +#pragma mark - + +- (void)af_resume { + NSURLSessionTaskState state = self.state; + [self af_resume]; + + if (state != NSURLSessionTaskStateRunning) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidResumeNotification object:self]; + } +} + +- (void)af_suspend { + NSURLSessionTaskState state = self.state; + [self af_suspend]; + + if (state != NSURLSessionTaskStateSuspended) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFNSURLSessionTaskDidSuspendNotification object:self]; + } +} + +@end + +#pragma mark - + +@interface AFURLSessionManager () +@property (readwrite, nonatomic, strong) NSURLSessionConfiguration *sessionConfiguration; +@property (readwrite, nonatomic, strong) NSOperationQueue *operationQueue; +@property (readwrite, nonatomic, strong) NSURLSession *session; +@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableTaskDelegatesKeyedByTaskIdentifier; +@property (readonly, nonatomic, copy) NSString *taskDescriptionForSessionTasks; +@property (readwrite, nonatomic, strong) NSLock *lock; +@property (readwrite, nonatomic, copy) AFURLSessionDidBecomeInvalidBlock sessionDidBecomeInvalid; +@property (readwrite, nonatomic, copy) AFURLSessionDidReceiveAuthenticationChallengeBlock sessionDidReceiveAuthenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLSessionDidFinishEventsForBackgroundURLSessionBlock didFinishEventsForBackgroundURLSession; +@property (readwrite, nonatomic, copy) AFURLSessionTaskWillPerformHTTPRedirectionBlock taskWillPerformHTTPRedirection; +@property (readwrite, nonatomic, copy) AFURLSessionTaskDidReceiveAuthenticationChallengeBlock taskDidReceiveAuthenticationChallenge; +@property (readwrite, nonatomic, copy) AFURLSessionTaskNeedNewBodyStreamBlock taskNeedNewBodyStream; +@property (readwrite, nonatomic, copy) AFURLSessionTaskDidSendBodyDataBlock taskDidSendBodyData; +@property (readwrite, nonatomic, copy) AFURLSessionTaskDidCompleteBlock taskDidComplete; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidReceiveResponseBlock dataTaskDidReceiveResponse; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidBecomeDownloadTaskBlock dataTaskDidBecomeDownloadTask; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskDidReceiveDataBlock dataTaskDidReceiveData; +@property (readwrite, nonatomic, copy) AFURLSessionDataTaskWillCacheResponseBlock dataTaskWillCacheResponse; +@property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading; +@property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidWriteDataBlock downloadTaskDidWriteData; +@property (readwrite, nonatomic, copy) AFURLSessionDownloadTaskDidResumeBlock downloadTaskDidResume; +@end + +@implementation AFURLSessionManager + +- (instancetype)init { + return [self initWithSessionConfiguration:nil]; +} + +- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration { + self = [super init]; + if (!self) { + return nil; + } + + if (!configuration) { + configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; + } + + self.sessionConfiguration = configuration; + + self.operationQueue = [[NSOperationQueue alloc] init]; + self.operationQueue.maxConcurrentOperationCount = 1; + + self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; + + self.responseSerializer = [AFJSONResponseSerializer serializer]; + + self.securityPolicy = [AFSecurityPolicy defaultPolicy]; + + self.reachabilityManager = [AFNetworkReachabilityManager sharedManager]; + + self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init]; + + self.lock = [[NSLock alloc] init]; + self.lock.name = AFURLSessionManagerLockName; + + [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { + for (NSURLSessionDataTask *task in dataTasks) { + [self addDelegateForDataTask:task completionHandler:nil]; + } + + for (NSURLSessionUploadTask *uploadTask in uploadTasks) { + [self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil]; + } + + for (NSURLSessionDownloadTask *downloadTask in downloadTasks) { + [self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil]; + } + }]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidResume:) name:AFNSURLSessionTaskDidResumeNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskDidSuspend:) name:AFNSURLSessionTaskDidSuspendNotification object:nil]; + + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - + +- (NSString *)taskDescriptionForSessionTasks { + return [NSString stringWithFormat:@"%p", self]; +} + +- (void)taskDidResume:(NSNotification *)notification { + NSURLSessionTask *task = notification.object; + if ([task isKindOfClass:[NSURLSessionTask class]]) { + if ([task.taskDescription isEqualToString:self.taskDescriptionForSessionTasks]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidResumeNotification object:task]; + }); + } + } +} + +- (void)taskDidSuspend:(NSNotification *)notification { + NSURLSessionTask *task = notification.object; + if ([task isKindOfClass:[NSURLSessionTask class]]) { + if ([task.taskDescription isEqualToString:self.taskDescriptionForSessionTasks]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidSuspendNotification object:task]; + }); + } + } +} + +#pragma mark - + +- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task { + NSParameterAssert(task); + + AFURLSessionManagerTaskDelegate *delegate = nil; + [self.lock lock]; + delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)]; + [self.lock unlock]; + + return delegate; +} + +- (void)setDelegate:(AFURLSessionManagerTaskDelegate *)delegate + forTask:(NSURLSessionTask *)task +{ + NSParameterAssert(task); + NSParameterAssert(delegate); + + [self.lock lock]; + self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate; + [self.lock unlock]; +} + +- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init]; + delegate.manager = self; + delegate.completionHandler = completionHandler; + + dataTask.taskDescription = self.taskDescriptionForSessionTasks; + [self setDelegate:delegate forTask:dataTask]; +} + +- (void)addDelegateForUploadTask:(NSURLSessionUploadTask *)uploadTask + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init]; + delegate.manager = self; + delegate.completionHandler = completionHandler; + + int64_t totalUnitCount = uploadTask.countOfBytesExpectedToSend; + if(totalUnitCount == NSURLSessionTransferSizeUnknown) { + NSString *contentLength = [uploadTask.originalRequest valueForHTTPHeaderField:@"Content-Length"]; + if(contentLength) { + totalUnitCount = (int64_t)[contentLength longLongValue]; + } + } + + if (delegate.progress) { + delegate.progress.totalUnitCount = totalUnitCount; + } else { + delegate.progress = [NSProgress progressWithTotalUnitCount:totalUnitCount]; + } + + delegate.progress.pausingHandler = ^{ + [uploadTask suspend]; + }; + delegate.progress.cancellationHandler = ^{ + [uploadTask cancel]; + }; + + if (progress) { + *progress = delegate.progress; + } + + uploadTask.taskDescription = self.taskDescriptionForSessionTasks; + + [self setDelegate:delegate forTask:uploadTask]; +} + +- (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler +{ + AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init]; + delegate.manager = self; + delegate.completionHandler = completionHandler; + + if (destination) { + delegate.downloadTaskDidFinishDownloading = ^NSURL * (NSURLSession * __unused session, NSURLSessionDownloadTask *task, NSURL *location) { + return destination(location, task.response); + }; + } + + if (progress) { + *progress = delegate.progress; + } + + downloadTask.taskDescription = self.taskDescriptionForSessionTasks; + + [self setDelegate:delegate forTask:downloadTask]; +} + +- (void)removeDelegateForTask:(NSURLSessionTask *)task { + NSParameterAssert(task); + + [self.lock lock]; + [self.mutableTaskDelegatesKeyedByTaskIdentifier removeObjectForKey:@(task.taskIdentifier)]; + [self.lock unlock]; +} + +- (void)removeAllDelegates { + [self.lock lock]; + [self.mutableTaskDelegatesKeyedByTaskIdentifier removeAllObjects]; + [self.lock unlock]; +} + +#pragma mark - + +- (NSArray *)tasksForKeyPath:(NSString *)keyPath { + __block NSArray *tasks = nil; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { + if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))]) { + tasks = dataTasks; + } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(uploadTasks))]) { + tasks = uploadTasks; + } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(downloadTasks))]) { + tasks = downloadTasks; + } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(tasks))]) { + tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:@"@unionOfArrays.self"]; + } + + dispatch_semaphore_signal(semaphore); + }]; + + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + + return tasks; +} + +- (NSArray *)tasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +- (NSArray *)dataTasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +- (NSArray *)uploadTasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +- (NSArray *)downloadTasks { + return [self tasksForKeyPath:NSStringFromSelector(_cmd)]; +} + +#pragma mark - + +- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks { + dispatch_async(dispatch_get_main_queue(), ^{ + if (cancelPendingTasks) { + [self.session invalidateAndCancel]; + } else { + [self.session finishTasksAndInvalidate]; + } + }); +} + +#pragma mark - + +- (void)setResponseSerializer:(id )responseSerializer { + NSParameterAssert(responseSerializer); + + _responseSerializer = responseSerializer; +} + +#pragma mark - + +- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionDataTask *dataTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + dataTask = [self.session dataTaskWithRequest:request]; + }); + + [self addDelegateForDataTask:dataTask completionHandler:completionHandler]; + + return dataTask; +} + +#pragma mark - + +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromFile:(NSURL *)fileURL + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; + }); + + if (!uploadTask && self.attemptsToRecreateUploadTasksForBackgroundSessions && self.session.configuration.identifier) { + for (NSUInteger attempts = 0; !uploadTask && attempts < AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask; attempts++) { + uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL]; + } + } + + [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; + + return uploadTask; +} + +- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request + fromData:(NSData *)bodyData + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithRequest:request fromData:bodyData]; + }); + + [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; + + return uploadTask; +} + +- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler +{ + __block NSURLSessionUploadTask *uploadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + uploadTask = [self.session uploadTaskWithStreamedRequest:request]; + }); + + [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler]; + + return uploadTask; +} + +#pragma mark - + +- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler +{ + __block NSURLSessionDownloadTask *downloadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + downloadTask = [self.session downloadTaskWithRequest:request]; + }); + + [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler]; + + return downloadTask; +} + +- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData + progress:(NSProgress * __autoreleasing *)progress + destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination + completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler +{ + __block NSURLSessionDownloadTask *downloadTask = nil; + dispatch_sync(url_session_manager_creation_queue(), ^{ + downloadTask = [self.session downloadTaskWithResumeData:resumeData]; + }); + + [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler]; + + return downloadTask; +} + +#pragma mark - + +- (NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask { + return [[self delegateForTask:uploadTask] progress]; +} + +- (NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask { + return [[self delegateForTask:downloadTask] progress]; +} + +#pragma mark - + +- (void)setSessionDidBecomeInvalidBlock:(void (^)(NSURLSession *session, NSError *error))block { + self.sessionDidBecomeInvalid = block; +} + +- (void)setSessionDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block { + self.sessionDidReceiveAuthenticationChallenge = block; +} + +- (void)setDidFinishEventsForBackgroundURLSessionBlock:(void (^)(NSURLSession *session))block { + self.didFinishEventsForBackgroundURLSession = block; +} + +#pragma mark - + +- (void)setTaskNeedNewBodyStreamBlock:(NSInputStream * (^)(NSURLSession *session, NSURLSessionTask *task))block { + self.taskNeedNewBodyStream = block; +} + +- (void)setTaskWillPerformHTTPRedirectionBlock:(NSURLRequest * (^)(NSURLSession *session, NSURLSessionTask *task, NSURLResponse *response, NSURLRequest *request))block { + self.taskWillPerformHTTPRedirection = block; +} + +- (void)setTaskDidReceiveAuthenticationChallengeBlock:(NSURLSessionAuthChallengeDisposition (^)(NSURLSession *session, NSURLSessionTask *task, NSURLAuthenticationChallenge *challenge, NSURLCredential * __autoreleasing *credential))block { + self.taskDidReceiveAuthenticationChallenge = block; +} + +- (void)setTaskDidSendBodyDataBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend))block { + self.taskDidSendBodyData = block; +} + +- (void)setTaskDidCompleteBlock:(void (^)(NSURLSession *session, NSURLSessionTask *task, NSError *error))block { + self.taskDidComplete = block; +} + +#pragma mark - + +- (void)setDataTaskDidReceiveResponseBlock:(NSURLSessionResponseDisposition (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLResponse *response))block { + self.dataTaskDidReceiveResponse = block; +} + +- (void)setDataTaskDidBecomeDownloadTaskBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSURLSessionDownloadTask *downloadTask))block { + self.dataTaskDidBecomeDownloadTask = block; +} + +- (void)setDataTaskDidReceiveDataBlock:(void (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSData *data))block { + self.dataTaskDidReceiveData = block; +} + +- (void)setDataTaskWillCacheResponseBlock:(NSCachedURLResponse * (^)(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse))block { + self.dataTaskWillCacheResponse = block; +} + +#pragma mark - + +- (void)setDownloadTaskDidFinishDownloadingBlock:(NSURL * (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block { + self.downloadTaskDidFinishDownloading = block; +} + +- (void)setDownloadTaskDidWriteDataBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite))block { + self.downloadTaskDidWriteData = block; +} + +- (void)setDownloadTaskDidResumeBlock:(void (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes))block { + self.downloadTaskDidResume = block; +} + +#pragma mark - NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p, session: %@, operationQueue: %@>", NSStringFromClass([self class]), self, self.session, self.operationQueue]; +} + +- (BOOL)respondsToSelector:(SEL)selector { + if (selector == @selector(URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:)) { + return self.taskWillPerformHTTPRedirection != nil; + } else if (selector == @selector(URLSession:dataTask:didReceiveResponse:completionHandler:)) { + return self.dataTaskDidReceiveResponse != nil; + } else if (selector == @selector(URLSession:dataTask:willCacheResponse:completionHandler:)) { + return self.dataTaskWillCacheResponse != nil; + } else if (selector == @selector(URLSessionDidFinishEventsForBackgroundURLSession:)) { + return self.didFinishEventsForBackgroundURLSession != nil; + } + + return [[self class] instancesRespondToSelector:selector]; +} + +#pragma mark - NSURLSessionDelegate + +- (void)URLSession:(NSURLSession *)session +didBecomeInvalidWithError:(NSError *)error +{ + if (self.sessionDidBecomeInvalid) { + self.sessionDidBecomeInvalid(session, error); + } + + [self removeAllDelegates]; + [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDidInvalidateNotification object:session]; +} + +- (void)URLSession:(NSURLSession *)session +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler +{ + NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; + __block NSURLCredential *credential = nil; + + if (self.sessionDidReceiveAuthenticationChallenge) { + disposition = self.sessionDidReceiveAuthenticationChallenge(session, challenge, &credential); + } else { + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + if (credential) { + disposition = NSURLSessionAuthChallengeUseCredential; + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } else { + disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; + } + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } + + if (completionHandler) { + completionHandler(disposition, credential); + } +} + +#pragma mark - NSURLSessionTaskDelegate + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +willPerformHTTPRedirection:(NSHTTPURLResponse *)response + newRequest:(NSURLRequest *)request + completionHandler:(void (^)(NSURLRequest *))completionHandler +{ + NSURLRequest *redirectRequest = request; + + if (self.taskWillPerformHTTPRedirection) { + redirectRequest = self.taskWillPerformHTTPRedirection(session, task, response, request); + } + + if (completionHandler) { + completionHandler(redirectRequest); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge + completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler +{ + NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; + __block NSURLCredential *credential = nil; + + if (self.taskDidReceiveAuthenticationChallenge) { + disposition = self.taskDidReceiveAuthenticationChallenge(session, task, challenge, &credential); + } else { + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if ([self.securityPolicy evaluateServerTrust:challenge.protectionSpace.serverTrust forDomain:challenge.protectionSpace.host]) { + disposition = NSURLSessionAuthChallengeUseCredential; + credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + } else { + disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; + } + } else { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } + } + + if (completionHandler) { + completionHandler(disposition, credential); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + needNewBodyStream:(void (^)(NSInputStream *bodyStream))completionHandler +{ + NSInputStream *inputStream = nil; + + if (self.taskNeedNewBodyStream) { + inputStream = self.taskNeedNewBodyStream(session, task); + } else if (task.originalRequest.HTTPBodyStream && [task.originalRequest.HTTPBodyStream conformsToProtocol:@protocol(NSCopying)]) { + inputStream = [task.originalRequest.HTTPBodyStream copy]; + } + + if (completionHandler) { + completionHandler(inputStream); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task + didSendBodyData:(int64_t)bytesSent + totalBytesSent:(int64_t)totalBytesSent +totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend +{ + + int64_t totalUnitCount = totalBytesExpectedToSend; + if(totalUnitCount == NSURLSessionTransferSizeUnknown) { + NSString *contentLength = [task.originalRequest valueForHTTPHeaderField:@"Content-Length"]; + if(contentLength) { + totalUnitCount = (int64_t) [contentLength longLongValue]; + } + } + + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task]; + [delegate URLSession:session task:task didSendBodyData:bytesSent totalBytesSent:totalBytesSent totalBytesExpectedToSend:totalUnitCount]; + + if (self.taskDidSendBodyData) { + self.taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalUnitCount); + } +} + +- (void)URLSession:(NSURLSession *)session + task:(NSURLSessionTask *)task +didCompleteWithError:(NSError *)error +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task]; + + // delegate may be nil when completing a task in the background + if (delegate) { + [delegate URLSession:session task:task didCompleteWithError:error]; + + [self removeDelegateForTask:task]; + } + + if (self.taskDidComplete) { + self.taskDidComplete(session, task, error); + } + +} + +#pragma mark - NSURLSessionDataDelegate + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler +{ + NSURLSessionResponseDisposition disposition = NSURLSessionResponseAllow; + + if (self.dataTaskDidReceiveResponse) { + disposition = self.dataTaskDidReceiveResponse(session, dataTask, response); + } + + if (completionHandler) { + completionHandler(disposition); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:dataTask]; + if (delegate) { + [self removeDelegateForTask:dataTask]; + [self setDelegate:delegate forTask:downloadTask]; + } + + if (self.dataTaskDidBecomeDownloadTask) { + self.dataTaskDidBecomeDownloadTask(session, dataTask, downloadTask); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + didReceiveData:(NSData *)data +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:dataTask]; + [delegate URLSession:session dataTask:dataTask didReceiveData:data]; + + if (self.dataTaskDidReceiveData) { + self.dataTaskDidReceiveData(session, dataTask, data); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler +{ + NSCachedURLResponse *cachedResponse = proposedResponse; + + if (self.dataTaskWillCacheResponse) { + cachedResponse = self.dataTaskWillCacheResponse(session, dataTask, proposedResponse); + } + + if (completionHandler) { + completionHandler(cachedResponse); + } +} + +- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { + if (self.didFinishEventsForBackgroundURLSession) { + dispatch_async(dispatch_get_main_queue(), ^{ + self.didFinishEventsForBackgroundURLSession(session); + }); + } +} + +#pragma mark - NSURLSessionDownloadDelegate + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask +didFinishDownloadingToURL:(NSURL *)location +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + if (self.downloadTaskDidFinishDownloading) { + NSURL *fileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location); + if (fileURL) { + delegate.downloadFileURL = fileURL; + NSError *error = nil; + [[NSFileManager defaultManager] moveItemAtURL:location toURL:fileURL error:&error]; + if (error) { + [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:error.userInfo]; + } + + return; + } + } + + if (delegate) { + [delegate URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location]; + } +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didWriteData:(int64_t)bytesWritten + totalBytesWritten:(int64_t)totalBytesWritten +totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + [delegate URLSession:session downloadTask:downloadTask didWriteData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite]; + + if (self.downloadTaskDidWriteData) { + self.downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } +} + +- (void)URLSession:(NSURLSession *)session + downloadTask:(NSURLSessionDownloadTask *)downloadTask + didResumeAtOffset:(int64_t)fileOffset +expectedTotalBytes:(int64_t)expectedTotalBytes +{ + AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask]; + [delegate URLSession:session downloadTask:downloadTask didResumeAtOffset:fileOffset expectedTotalBytes:expectedTotalBytes]; + + if (self.downloadTaskDidResume) { + self.downloadTaskDidResume(session, downloadTask, fileOffset, expectedTotalBytes); + } +} + +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (id)initWithCoder:(NSCoder *)decoder { + NSURLSessionConfiguration *configuration = [decoder decodeObjectOfClass:[NSURLSessionConfiguration class] forKey:@"sessionConfiguration"]; + + self = [self initWithSessionConfiguration:configuration]; + if (!self) { + return nil; + } + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.session.configuration forKey:@"sessionConfiguration"]; +} + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + return [[[self class] allocWithZone:zone] initWithSessionConfiguration:self.session.configuration]; +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/LICENSE b/iOSStudy/iOSStudy/Pods/AFNetworking/LICENSE new file mode 100644 index 0000000..22508e7 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/README.md b/iOSStudy/iOSStudy/Pods/AFNetworking/README.md new file mode 100644 index 0000000..74104f0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/README.md @@ -0,0 +1,387 @@ +

+ AFNetworking +

+ +[![Build Status](https://travis-ci.org/AFNetworking/AFNetworking.svg)](https://travis-ci.org/AFNetworking/AFNetworking) + +AFNetworking is a delightful networking library for iOS and Mac OS X. It's built on top of the [Foundation URL Loading System](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html), extending the powerful high-level networking abstractions built into Cocoa. It has a modular architecture with well-designed, feature-rich APIs that are a joy to use. + +Perhaps the most important feature of all, however, is the amazing community of developers who use and contribute to AFNetworking every day. AFNetworking powers some of the most popular and critically-acclaimed apps on the iPhone, iPad, and Mac. + +Choose AFNetworking for your next project, or migrate over your existing projects—you'll be happy you did! + +## How To Get Started + +- [Download AFNetworking](https://github.com/AFNetworking/AFNetworking/archive/master.zip) and try out the included Mac and iPhone example apps +- Read the ["Getting Started" guide](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking), [FAQ](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ), or [other articles on the Wiki](https://github.com/AFNetworking/AFNetworking/wiki) +- Check out the [documentation](http://cocoadocs.org/docsets/AFNetworking/) for a comprehensive look at all of the APIs available in AFNetworking +- Read the [AFNetworking 2.0 Migration Guide](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Guide) for an overview of the architectural changes from 1.0. + +## Communication + +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/afnetworking). (Tag 'afnetworking') +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/afnetworking). +- If you **found a bug**, _and can provide steps to reliably reproduce it_, open an issue. +- If you **have a feature request**, open an issue. +- If you **want to contribute**, submit a pull request. + +### Installation with CocoaPods + +[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like AFNetworking in your projects. See the ["Getting Started" guide for more information](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking). + +#### Podfile + +```ruby +platform :ios, '7.0' +pod "AFNetworking", "~> 2.0" +``` + +## Requirements + +| AFNetworking Version | Minimum iOS Target | Minimum OS X Target | Notes | +|:--------------------:|:---------------------------:|:----------------------------:|:-------------------------------------------------------------------------:| +| 2.x | iOS 6 | OS X 10.8 | Xcode 5 is required. `NSURLSession` subspec requires iOS 7 or OS X 10.9. | +| [1.x](https://github.com/AFNetworking/AFNetworking/tree/1.x) | iOS 5 | Mac OS X 10.7 | | +| [0.10.x](https://github.com/AFNetworking/AFNetworking/tree/0.10.x) | iOS 4 | Mac OS X 10.6 | | + +(OS X projects must support [64-bit with modern Cocoa runtime](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtVersionsPlatforms.html)). + +> Programming in Swift? Try [Alamofire](https://github.com/Alamofire/Alamofire) for a more conventional set of APIs. + +## Architecture + +### NSURLConnection + +- `AFURLConnectionOperation` +- `AFHTTPRequestOperation` +- `AFHTTPRequestOperationManager` + +### NSURLSession _(iOS 7 / Mac OS X 10.9)_ + +- `AFURLSessionManager` +- `AFHTTPSessionManager` + +### Serialization + +* `` + - `AFHTTPRequestSerializer` + - `AFJSONRequestSerializer` + - `AFPropertyListRequestSerializer` +* `` + - `AFHTTPResponseSerializer` + - `AFJSONResponseSerializer` + - `AFXMLParserResponseSerializer` + - `AFXMLDocumentResponseSerializer` _(Mac OS X)_ + - `AFPropertyListResponseSerializer` + - `AFImageResponseSerializer` + - `AFCompoundResponseSerializer` + +### Additional Functionality + +- `AFSecurityPolicy` +- `AFNetworkReachabilityManager` + +## Usage + +### HTTP Request Operation Manager + +`AFHTTPRequestOperationManager` encapsulates the common patterns of communicating with a web application over HTTP, including request creation, response serialization, network reachability monitoring, and security, as well as request operation management. + +#### `GET` Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +#### `POST` URL-Form-Encoded Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +NSDictionary *parameters = @{@"foo": @"bar"}; +[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +#### `POST` Multi-Part Request + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +NSDictionary *parameters = @{@"foo": @"bar"}; +NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; +[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:filePath name:@"image" error:nil]; +} success:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"Success: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +``` + +--- + +### AFURLSessionManager + +`AFURLSessionManager` creates and manages an `NSURLSession` object based on a specified `NSURLSessionConfiguration` object, which conforms to ``, ``, ``, and ``. + +#### Creating a Download Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { + NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; + return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]]; +} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { + NSLog(@"File downloaded to: %@", filePath); +}]; +[downloadTask resume]; +``` + +#### Creating an Upload Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; +NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"Success: %@ %@", response, responseObject); + } +}]; +[uploadTask resume]; +``` + +#### Creating an Upload Task for a Multi-Part Request, with Progress + +```objective-c +NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil]; + } error:nil]; + +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; +NSProgress *progress = nil; + +NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"%@ %@", response, responseObject); + } +}]; + +[uploadTask resume]; +``` + +#### Creating a Data Task + +```objective-c +NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; +AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; + +NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; + +NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { + if (error) { + NSLog(@"Error: %@", error); + } else { + NSLog(@"%@ %@", response, responseObject); + } +}]; +[dataTask resume]; +``` + +--- + +### Request Serialization + +Request serializers create requests from URL strings, encoding parameters as either a query string or HTTP body. + +```objective-c +NSString *URLString = @"http://example.com"; +NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]}; +``` + +#### Query String Parameter Encoding + +```objective-c +[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil]; +``` + + GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3 + +#### URL Form Parameter Encoding + +```objective-c +[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters]; +``` + + POST http://example.com/ + Content-Type: application/x-www-form-urlencoded + + foo=bar&baz[]=1&baz[]=2&baz[]=3 + +#### JSON Parameter Encoding + +```objective-c +[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters]; +``` + + POST http://example.com/ + Content-Type: application/json + + {"foo": "bar", "baz": [1,2,3]} + +--- + +### Network Reachability Manager + +`AFNetworkReachabilityManager` monitors the reachability of domains, and addresses for both WWAN and WiFi network interfaces. + +**Network reachability is a diagnostic tool that can be used to understand why a request might have failed. It should not be used to determine whether or not to make a request.** + +#### Shared Network Reachability + +```objective-c +[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); +}]; +``` + +#### HTTP Manager Reachability + +```objective-c +NSURL *baseURL = [NSURL URLWithString:@"http://example.com/"]; +AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL]; + +NSOperationQueue *operationQueue = manager.operationQueue; +[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + switch (status) { + case AFNetworkReachabilityStatusReachableViaWWAN: + case AFNetworkReachabilityStatusReachableViaWiFi: + [operationQueue setSuspended:NO]; + break; + case AFNetworkReachabilityStatusNotReachable: + default: + [operationQueue setSuspended:YES]; + break; + } +}]; + +[manager.reachabilityManager startMonitoring]; +``` + +--- + +### Security Policy + +`AFSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. + +Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled. + +#### Allowing Invalid SSL Certificates + +```objective-c +AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; +manager.securityPolicy.allowInvalidCertificates = YES; // not recommended for production +``` + +--- + +### AFHTTPRequestOperation + +`AFHTTPRequestOperation` is a subclass of `AFURLConnectionOperation` for requests using the HTTP or HTTPS protocols. It encapsulates the concept of acceptable status codes and content types, which determine the success or failure of a request. + +Although `AFHTTPRequestOperationManager` is usually the best way to go about making requests, `AFHTTPRequestOperation` can be used by itself. + +#### `GET` with `AFHTTPRequestOperation` + +```objective-c +NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"]; +NSURLRequest *request = [NSURLRequest requestWithURL:URL]; +AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; +op.responseSerializer = [AFJSONResponseSerializer serializer]; +[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + NSLog(@"JSON: %@", responseObject); +} failure:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); +}]; +[[NSOperationQueue mainQueue] addOperation:op]; +``` + +#### Batch of Operations + +```objective-c +NSMutableArray *mutableOperations = [NSMutableArray array]; +for (NSURL *fileURL in filesToUpload) { + NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id formData) { + [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil]; + }]; + + AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + + [mutableOperations addObject:operation]; +} + +NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { + NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations); +} completionBlock:^(NSArray *operations) { + NSLog(@"All operations in batch complete"); +}]; +[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO]; +``` + +## Unit Tests + +AFNetworking includes a suite of unit tests within the Tests subdirectory. In order to run the unit tests, you must install the testing dependencies via [CocoaPods](http://cocoapods.org/): + + $ cd Tests + $ pod install + +Once testing dependencies are installed, you can execute the test suite via the 'iOS Tests' and 'OS X Tests' schemes within Xcode. + +### Running Tests from the Command Line + +Tests can also be run from the command line or within a continuous integration environment. The [`xcpretty`](https://github.com/mneorr/xcpretty) utility needs to be installed before running the tests from the command line: + + $ gem install xcpretty + +Once `xcpretty` is installed, you can execute the suite via `rake test`. + +## Credits + +AFNetworking was originally created by [Scott Raymond](https://github.com/sco/) and [Mattt Thompson](https://github.com/mattt/) in the development of [Gowalla for iPhone](http://en.wikipedia.org/wiki/Gowalla). + +AFNetworking's logo was designed by [Alan Defibaugh](http://www.alandefibaugh.com/). + +And most of all, thanks to AFNetworking's [growing list of contributors](https://github.com/AFNetworking/AFNetworking/contributors). + +## Contact + +Follow AFNetworking on Twitter ([@AFNetworking](https://twitter.com/AFNetworking)) + +### Maintainers + +- [Mattt Thompson](http://github.com/mattt) ([@mattt](https://twitter.com/mattt)) + +## License + +AFNetworking is available under the MIT license. See the LICENSE file for more info. diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h new file mode 100644 index 0000000..afebad3 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h @@ -0,0 +1,76 @@ +// AFNetworkActivityIndicatorManager.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +/** + `AFNetworkActivityIndicatorManager` manages the state of the network activity indicator in the status bar. When enabled, it will listen for notifications indicating that a network request operation has started or finished, and start or stop animating the indicator accordingly. The number of active requests is incremented and decremented much like a stack or a semaphore, and the activity indicator will animate so long as that number is greater than zero. + + You should enable the shared instance of `AFNetworkActivityIndicatorManager` when your application finishes launching. In `AppDelegate application:didFinishLaunchingWithOptions:` you can do so with the following code: + + [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; + + By setting `enabled` to `YES` for `sharedManager`, the network activity indicator will show and hide automatically as requests start and finish. You should not ever need to call `incrementActivityCount` or `decrementActivityCount` yourself. + + See the Apple Human Interface Guidelines section about the Network Activity Indicator for more information: + http://developer.apple.com/library/iOS/#documentation/UserExperience/Conceptual/MobileHIG/UIElementGuidelines/UIElementGuidelines.html#//apple_ref/doc/uid/TP40006556-CH13-SW44 + */ +@interface AFNetworkActivityIndicatorManager : NSObject + +/** + A Boolean value indicating whether the manager is enabled. + + If YES, the manager will change status bar network activity indicator according to network operation notifications it receives. The default value is NO. + */ +@property (nonatomic, assign, getter = isEnabled) BOOL enabled; + +/** + A Boolean value indicating whether the network activity indicator is currently displayed in the status bar. + */ +@property (readonly, nonatomic, assign) BOOL isNetworkActivityIndicatorVisible; + +/** + Returns the shared network activity indicator manager object for the system. + + @return The systemwide network activity indicator manager. + */ ++ (instancetype)sharedManager; + +/** + Increments the number of active network requests. If this number was zero before incrementing, this will start animating the status bar network activity indicator. + */ +- (void)incrementActivityCount; + +/** + Decrements the number of active network requests. If this number becomes zero after decrementing, this will stop animating the status bar network activity indicator. + */ +- (void)decrementActivityCount; + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m new file mode 100644 index 0000000..5c6d4fa --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m @@ -0,0 +1,171 @@ +// AFNetworkActivityIndicatorManager.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "AFNetworkActivityIndicatorManager.h" + +#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) + +#import "AFHTTPRequestOperation.h" + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 +#import "AFURLSessionManager.h" +#endif + +static NSTimeInterval const kAFNetworkActivityIndicatorInvisibilityDelay = 0.17; + +static NSURLRequest * AFNetworkRequestFromNotification(NSNotification *notification) { + if ([[notification object] isKindOfClass:[AFURLConnectionOperation class]]) { + return [(AFURLConnectionOperation *)[notification object] request]; + } + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + if ([[notification object] respondsToSelector:@selector(originalRequest)]) { + return [(NSURLSessionTask *)[notification object] originalRequest]; + } +#endif + + return nil; +} + +@interface AFNetworkActivityIndicatorManager () +@property (readwrite, nonatomic, assign) NSInteger activityCount; +@property (readwrite, nonatomic, strong) NSTimer *activityIndicatorVisibilityTimer; +@property (readonly, nonatomic, getter = isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible; + +- (void)updateNetworkActivityIndicatorVisibility; +- (void)updateNetworkActivityIndicatorVisibilityDelayed; +@end + +@implementation AFNetworkActivityIndicatorManager +@dynamic networkActivityIndicatorVisible; + ++ (instancetype)sharedManager { + static AFNetworkActivityIndicatorManager *_sharedManager = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _sharedManager = [[self alloc] init]; + }); + + return _sharedManager; +} + ++ (NSSet *)keyPathsForValuesAffectingIsNetworkActivityIndicatorVisible { + return [NSSet setWithObject:@"activityCount"]; +} + +- (id)init { + self = [super init]; + if (!self) { + return nil; + } + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidStart:) name:AFNetworkingOperationDidStartNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingOperationDidFinishNotification object:nil]; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidStart:) name:AFNetworkingTaskDidResumeNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingTaskDidSuspendNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingTaskDidCompleteNotification object:nil]; +#endif + + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [_activityIndicatorVisibilityTimer invalidate]; +} + +- (void)updateNetworkActivityIndicatorVisibilityDelayed { + if (self.enabled) { + // Delay hiding of activity indicator for a short interval, to avoid flickering + if (![self isNetworkActivityIndicatorVisible]) { + [self.activityIndicatorVisibilityTimer invalidate]; + self.activityIndicatorVisibilityTimer = [NSTimer timerWithTimeInterval:kAFNetworkActivityIndicatorInvisibilityDelay target:self selector:@selector(updateNetworkActivityIndicatorVisibility) userInfo:nil repeats:NO]; + [[NSRunLoop mainRunLoop] addTimer:self.activityIndicatorVisibilityTimer forMode:NSRunLoopCommonModes]; + } else { + [self performSelectorOnMainThread:@selector(updateNetworkActivityIndicatorVisibility) withObject:nil waitUntilDone:NO modes:@[NSRunLoopCommonModes]]; + } + } +} + +- (BOOL)isNetworkActivityIndicatorVisible { + return self.activityCount > 0; +} + +- (void)updateNetworkActivityIndicatorVisibility { + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:[self isNetworkActivityIndicatorVisible]]; +} + +- (void)setActivityCount:(NSInteger)activityCount { + @synchronized(self) { + _activityCount = activityCount; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)incrementActivityCount { + [self willChangeValueForKey:@"activityCount"]; + @synchronized(self) { + _activityCount++; + } + [self didChangeValueForKey:@"activityCount"]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)decrementActivityCount { + [self willChangeValueForKey:@"activityCount"]; + @synchronized(self) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + _activityCount = MAX(_activityCount - 1, 0); +#pragma clang diagnostic pop + } + [self didChangeValueForKey:@"activityCount"]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateNetworkActivityIndicatorVisibilityDelayed]; + }); +} + +- (void)networkRequestDidStart:(NSNotification *)notification { + if ([AFNetworkRequestFromNotification(notification) URL]) { + [self incrementActivityCount]; + } +} + +- (void)networkRequestDidFinish:(NSNotification *)notification { + if ([AFNetworkRequestFromNotification(notification) URL]) { + [self decrementActivityCount]; + } +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h new file mode 100644 index 0000000..cbefccd --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -0,0 +1,64 @@ +// UIActivityIndicatorView+AFNetworking.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIActivityIndicatorView` class. The methods in this category provide support for automatically starting and stopping animation depending on the loading state of a request operation or session task. + */ +@interface UIActivityIndicatorView (AFNetworking) + +///---------------------------------- +/// @name Animating for Session Tasks +///---------------------------------- + +/** + Binds the animating state to the state of the specified task. + + @param task The task. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task; +#endif + +///--------------------------------------- +/// @name Animating for Request Operations +///--------------------------------------- + +/** + Binds the animating state to the execution state of the specified operation. + + @param operation The operation. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation; + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m new file mode 100644 index 0000000..c981314 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m @@ -0,0 +1,97 @@ +// UIActivityIndicatorView+AFNetworking.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIActivityIndicatorView+AFNetworking.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +@implementation UIActivityIndicatorView (AFNetworking) + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setAnimatingWithStateOfTask:(NSURLSessionTask *)task { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + + if (task) { + if (task.state != NSURLSessionTaskStateCompleted) { + if (task.state == NSURLSessionTaskStateRunning) { + [self startAnimating]; + } else { + [self stopAnimating]; + } + + [notificationCenter addObserver:self selector:@selector(af_startAnimating) name:AFNetworkingTaskDidResumeNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingTaskDidCompleteNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingTaskDidSuspendNotification object:task]; + } + } +} +#endif + +#pragma mark - + +- (void)setAnimatingWithStateOfOperation:(AFURLConnectionOperation *)operation { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; + + if (operation) { + if (![operation isFinished]) { + if ([operation isExecuting]) { + [self startAnimating]; + } else { + [self stopAnimating]; + } + + [notificationCenter addObserver:self selector:@selector(af_startAnimating) name:AFNetworkingOperationDidStartNotification object:operation]; + [notificationCenter addObserver:self selector:@selector(af_stopAnimating) name:AFNetworkingOperationDidFinishNotification object:operation]; + } + } +} + +#pragma mark - + +- (void)af_startAnimating { + dispatch_async(dispatch_get_main_queue(), ^{ + [self startAnimating]; + }); +} + +- (void)af_stopAnimating { + dispatch_async(dispatch_get_main_queue(), ^{ + [self stopAnimating]; + }); +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h new file mode 100644 index 0000000..3cc1694 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h @@ -0,0 +1,96 @@ +// UIAlertView+AFNetworking.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIAlertView` class. The methods in this category provide support for automatically showing an alert if a session task or request operation finishes with an error. Alert title and message are filled from the corresponding `localizedDescription` & `localizedRecoverySuggestion` or `localizedFailureReason` of the error. + */ +@interface UIAlertView (AFNetworking) + +///------------------------------------- +/// @name Showing Alert for Session Task +///------------------------------------- + +/** + Shows an alert view with the error of the specified session task, if any. + + @param task The session task. + @param delegate The alert view delegate. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate; +#endif + +/** + Shows an alert view with the error of the specified session task, if any, with a custom cancel button title and other button titles. + + @param task The session task. + @param delegate The alert view delegate. + @param cancelButtonTitle The title of the cancel button or nil if there is no cancel button. Using this argument is equivalent to setting the cancel button index to the value returned by invoking addButtonWithTitle: specifying this title. + @param otherButtonTitles The title of another button. Using this argument is equivalent to invoking addButtonWithTitle: with this title to add more buttons. Too many buttons can cause the alert view to scroll. For guidelines on the best ways to use an alert in an app, see "Temporary Views". Titles of additional buttons to add to the receiver, terminated with `nil`. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION; +#endif + +///------------------------------------------ +/// @name Showing Alert for Request Operation +///------------------------------------------ + +/** + Shows an alert view with the error of the specified request operation, if any. + + @param operation The request operation. + @param delegate The alert view delegate. + */ ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate; + +/** + Shows an alert view with the error of the specified request operation, if any, with a custom cancel button title and other button titles. + + @param operation The request operation. + @param delegate The alert view delegate. + @param cancelButtonTitle The title of the cancel button or nil if there is no cancel button. Using this argument is equivalent to setting the cancel button index to the value returned by invoking addButtonWithTitle: specifying this title. + @param otherButtonTitles The title of another button. Using this argument is equivalent to invoking addButtonWithTitle: with this title to add more buttons. Too many buttons can cause the alert view to scroll. For guidelines on the best ways to use an alert in an app, see "Temporary Views". Titles of additional buttons to add to the receiver, terminated with `nil`. + */ ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION; + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m new file mode 100644 index 0000000..bb4eabc --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.m @@ -0,0 +1,129 @@ +// UIAlertView+AFNetworking.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIAlertView+AFNetworking.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLConnectionOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +static void AFGetAlertViewTitleAndMessageFromError(NSError *error, NSString * __autoreleasing *title, NSString * __autoreleasing *message) { + if (error.localizedDescription && (error.localizedRecoverySuggestion || error.localizedFailureReason)) { + *title = error.localizedDescription; + + if (error.localizedRecoverySuggestion) { + *message = error.localizedRecoverySuggestion; + } else { + *message = error.localizedFailureReason; + } + } else if (error.localizedDescription) { + *title = NSLocalizedStringFromTable(@"Error", @"AFNetworking", @"Fallback Error Description"); + *message = error.localizedDescription; + } else { + *title = NSLocalizedStringFromTable(@"Error", @"AFNetworking", @"Fallback Error Description"); + *message = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%@ Error: %ld", @"AFNetworking", @"Fallback Error Failure Reason Format"), error.domain, (long)error.code]; + } +} + +@implementation UIAlertView (AFNetworking) + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate +{ + [self showAlertViewForTaskWithErrorOnCompletion:task delegate:delegate cancelButtonTitle:NSLocalizedStringFromTable(@"Dismiss", @"AFNetworking", @"UIAlertView Cancel Button Title") otherButtonTitles:nil, nil]; +} + ++ (void)showAlertViewForTaskWithErrorOnCompletion:(NSURLSessionTask *)task + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION +{ + va_list otherTitleList; + va_start(otherTitleList, otherButtonTitles); + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil, nil]; + for(NSString *otherTitle = otherButtonTitles; otherTitle != nil; otherTitle = va_arg(otherTitleList, NSString *)){ + [alertView addButtonWithTitle:otherTitle]; + } + va_end(otherTitleList); + __block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingTaskDidCompleteNotification object:task queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { + + NSError *error = notification.userInfo[AFNetworkingTaskDidCompleteErrorKey]; + if (error) { + NSString *title, *message; + AFGetAlertViewTitleAndMessageFromError(error, &title, &message); + + [alertView setTitle:title]; + [alertView setMessage:message]; + [alertView show]; + } + + [[NSNotificationCenter defaultCenter] removeObserver:observer name:AFNetworkingTaskDidCompleteNotification object:notification.object]; + }]; +} +#endif + +#pragma mark - + ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate +{ + [self showAlertViewForRequestOperationWithErrorOnCompletion:operation delegate:delegate cancelButtonTitle:NSLocalizedStringFromTable(@"Dismiss", @"AFNetworking", @"UIAlertView Cancel Button Title") otherButtonTitles:nil, nil]; +} + ++ (void)showAlertViewForRequestOperationWithErrorOnCompletion:(AFURLConnectionOperation *)operation + delegate:(id)delegate + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION +{ + va_list otherTitleList; + va_start(otherTitleList, otherButtonTitles); + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil, nil]; + for(NSString *otherTitle = otherButtonTitles; otherTitle != nil; otherTitle = va_arg(otherTitleList, NSString *)){ + [alertView addButtonWithTitle:otherTitle]; + } + va_end(otherTitleList); + __block id observer = [[NSNotificationCenter defaultCenter] addObserverForName:AFNetworkingOperationDidFinishNotification object:operation queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { + + if (notification.object && [notification.object isKindOfClass:[AFURLConnectionOperation class]]) { + NSError *error = [(AFURLConnectionOperation *)notification.object error]; + if (error) { + NSString *title, *message; + AFGetAlertViewTitleAndMessageFromError(error, &title, &message); + + [alertView setTitle:title]; + [alertView setMessage:message]; + [alertView show]; + } + } + + [[NSNotificationCenter defaultCenter] removeObserver:observer name:AFNetworkingOperationDidFinishNotification object:notification.object]; + }]; +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h new file mode 100644 index 0000000..af8ff82 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h @@ -0,0 +1,181 @@ +// UIButton+AFNetworking.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@protocol AFURLResponseSerialization, AFImageCache; + +/** + This category adds methods to the UIKit framework's `UIButton` class. The methods in this category provide support for loading remote images and background images asynchronously from a URL. + + @warning Compound values for control `state` (such as `UIControlStateHighlighted | UIControlStateDisabled`) are unsupported. + */ +@interface UIButton (AFNetworking) + +///---------------------------- +/// @name Accessing Image Cache +///---------------------------- + +/** + The image cache used to improve image loadiing performance on scroll views. By default, `UIButton` will use the `sharedImageCache` of `UIImageView`. + */ ++ (id )sharedImageCache; + +/** + Set the cache used for image loading. + + @param imageCache The image cache. + */ ++ (void)setSharedImageCache:(id )imageCache; + +///------------------------------------ +/// @name Accessing Response Serializer +///------------------------------------ + +/** + The response serializer used to create an image representation from the server response and response data. By default, this is an instance of `AFImageResponseSerializer`. + + @discussion Subclasses of `AFImageResponseSerializer` could be used to perform post-processing, such as color correction, face detection, or other effects. See https://github.com/AFNetworking/AFCoreImageSerializer + */ +@property (nonatomic, strong) id imageResponseSerializer; + +///-------------------- +/// @name Setting Image +///-------------------- + +/** + Asynchronously downloads an image from the specified URL, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the image request. + */ +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url; + +/** + Asynchronously downloads an image from the specified URL, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the button will not change its image until the image request finishes. + */ +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage; + +/** + Asynchronously downloads an image from the specified URL request, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the button before returning. If no success block is specified, the default behavior of setting the image with `setImage:forState:` is applied. + + @param state The control state. + @param urlRequest The URL request used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the button will not change its image until the image request finishes. + @param success A block to be executed when the image request operation finishes successfully. This block has no return value and takes two arguments: the server response and the image. If the image was returned from cache, the request and response parameters will be `nil`. + @param failure A block object to be executed when the image request operation finishes unsuccessfully, or that finishes successfully. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)setImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure; + + +///------------------------------- +/// @name Setting Background Image +///------------------------------- + +/** + Asynchronously downloads an image from the specified URL, and sets it as the background image for the specified state once the request is finished. Any previous background image request for the receiver will be cancelled. + + If the background image is cached locally, the background image is set immediately, otherwise the specified placeholder background image will be set immediately, and then the remote background image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the background image request. + */ +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url; + +/** + Asynchronously downloads an image from the specified URL, and sets it as the background image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + @param state The control state. + @param url The URL used for the background image request. + @param placeholderImage The background image to be set initially, until the background image request finishes. If `nil`, the button will not change its background image until the background image request finishes. + */ +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage; + +/** + Asynchronously downloads an image from the specified URL request, and sets it as the image for the specified state once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the button before returning. If no success block is specified, the default behavior of setting the image with `setBackgroundImage:forState:` is applied. + + @param state The control state. + @param urlRequest The URL request used for the image request. + @param placeholderImage The background image to be set initially, until the background image request finishes. If `nil`, the button will not change its background image until the background image request finishes. + */ +- (void)setBackgroundImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure; + + +///------------------------------ +/// @name Canceling Image Loading +///------------------------------ + +/** + Cancels any executing image operation for the specified control state of the receiver, if one exists. + + @param state The control state. + */ +- (void)cancelImageRequestOperationForState:(UIControlState)state; + +/** + Cancels any executing background image operation for the specified control state of the receiver, if one exists. + + @param state The control state. + */ +- (void)cancelBackgroundImageRequestOperationForState:(UIControlState)state; + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m new file mode 100644 index 0000000..d7a0a1b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.m @@ -0,0 +1,294 @@ +// UIButton+AFNetworking.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIButton+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLResponseSerialization.h" +#import "AFHTTPRequestOperation.h" + +#import "UIImageView+AFNetworking.h" + +@interface UIButton (_AFNetworking) +@end + +@implementation UIButton (_AFNetworking) + ++ (NSOperationQueue *)af_sharedImageRequestOperationQueue { + static NSOperationQueue *_af_sharedImageRequestOperationQueue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_sharedImageRequestOperationQueue = [[NSOperationQueue alloc] init]; + _af_sharedImageRequestOperationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; + }); + + return _af_sharedImageRequestOperationQueue; +} + +#pragma mark - + +static char AFImageRequestOperationNormal; +static char AFImageRequestOperationHighlighted; +static char AFImageRequestOperationSelected; +static char AFImageRequestOperationDisabled; + +static const char * af_imageRequestOperationKeyForState(UIControlState state) { + switch (state) { + case UIControlStateHighlighted: + return &AFImageRequestOperationHighlighted; + case UIControlStateSelected: + return &AFImageRequestOperationSelected; + case UIControlStateDisabled: + return &AFImageRequestOperationDisabled; + case UIControlStateNormal: + default: + return &AFImageRequestOperationNormal; + } +} + +- (AFHTTPRequestOperation *)af_imageRequestOperationForState:(UIControlState)state { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, af_imageRequestOperationKeyForState(state)); +} + +- (void)af_setImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation + forState:(UIControlState)state +{ + objc_setAssociatedObject(self, af_imageRequestOperationKeyForState(state), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +static char AFBackgroundImageRequestOperationNormal; +static char AFBackgroundImageRequestOperationHighlighted; +static char AFBackgroundImageRequestOperationSelected; +static char AFBackgroundImageRequestOperationDisabled; + +static const char * af_backgroundImageRequestOperationKeyForState(UIControlState state) { + switch (state) { + case UIControlStateHighlighted: + return &AFBackgroundImageRequestOperationHighlighted; + case UIControlStateSelected: + return &AFBackgroundImageRequestOperationSelected; + case UIControlStateDisabled: + return &AFBackgroundImageRequestOperationDisabled; + case UIControlStateNormal: + default: + return &AFBackgroundImageRequestOperationNormal; + } +} + +- (AFHTTPRequestOperation *)af_backgroundImageRequestOperationForState:(UIControlState)state { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, af_backgroundImageRequestOperationKeyForState(state)); +} + +- (void)af_setBackgroundImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation + forState:(UIControlState)state +{ + objc_setAssociatedObject(self, af_backgroundImageRequestOperationKeyForState(state), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIButton (AFNetworking) + ++ (id )sharedImageCache { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(sharedImageCache)) ?: [UIImageView sharedImageCache]; +#pragma clang diagnostic pop +} + ++ (void)setSharedImageCache:(id )imageCache { + objc_setAssociatedObject(self, @selector(sharedImageCache), imageCache, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (id )imageResponseSerializer { + static id _af_defaultImageResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultImageResponseSerializer = [AFImageResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(imageResponseSerializer)) ?: _af_defaultImageResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setImageResponseSerializer:(id )serializer { + objc_setAssociatedObject(self, @selector(imageResponseSerializer), serializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url +{ + [self setImageForState:state withURL:url placeholderImage:nil]; +} + +- (void)setImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure +{ + [self cancelImageRequestOperationForState:state]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(nil, nil, cachedImage); + } else { + [self setImage:cachedImage forState:state]; + } + + [self af_setImageRequestOperation:nil forState:state]; + } else { + if (placeholderImage) { + [self setImage:placeholderImage forState:state]; + } + + __weak __typeof(self)weakSelf = self; + AFHTTPRequestOperation *imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + imageRequestOperation.responseSerializer = self.imageResponseSerializer; + [imageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (success) { + success(operation.request, operation.response, responseObject); + } else if (responseObject) { + [strongSelf setImage:responseObject forState:state]; + } + } + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (failure) { + failure(error); + } + } + }]; + + [self af_setImageRequestOperation:imageRequestOperation forState:state]; + [[[self class] af_sharedImageRequestOperationQueue] addOperation:imageRequestOperation]; + } +} + +#pragma mark - + +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url +{ + [self setBackgroundImageForState:state withURL:url placeholderImage:nil]; +} + +- (void)setBackgroundImageForState:(UIControlState)state + withURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setBackgroundImageForState:state withURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setBackgroundImageForState:(UIControlState)state + withURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSError *error))failure +{ + [self cancelBackgroundImageRequestOperationForState:state]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(nil, nil, cachedImage); + } else { + [self setBackgroundImage:cachedImage forState:state]; + } + + [self af_setBackgroundImageRequestOperation:nil forState:state]; + } else { + if (placeholderImage) { + [self setBackgroundImage:placeholderImage forState:state]; + } + + __weak __typeof(self)weakSelf = self; + AFHTTPRequestOperation *backgroundImageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + backgroundImageRequestOperation.responseSerializer = self.imageResponseSerializer; + [backgroundImageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (success) { + success(operation.request, operation.response, responseObject); + } else if (responseObject) { + [strongSelf setBackgroundImage:responseObject forState:state]; + } + } + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if ([[urlRequest URL] isEqual:[operation.request URL]]) { + if (failure) { + failure(error); + } + } + }]; + + [self af_setBackgroundImageRequestOperation:backgroundImageRequestOperation forState:state]; + [[[self class] af_sharedImageRequestOperationQueue] addOperation:backgroundImageRequestOperation]; + } +} + +#pragma mark - + +- (void)cancelImageRequestOperationForState:(UIControlState)state { + [[self af_imageRequestOperationForState:state] cancel]; + [self af_setImageRequestOperation:nil forState:state]; +} + +- (void)cancelBackgroundImageRequestOperationForState:(UIControlState)state { + [[self af_backgroundImageRequestOperationForState:state] cancel]; + [self af_setBackgroundImageRequestOperation:nil forState:state]; +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h new file mode 100644 index 0000000..5838b56 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h @@ -0,0 +1,143 @@ +// UIImageView+AFNetworking.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@protocol AFURLResponseSerialization, AFImageCache; + +/** + This category adds methods to the UIKit framework's `UIImageView` class. The methods in this category provide support for loading remote images asynchronously from a URL. + */ +@interface UIImageView (AFNetworking) + +///---------------------------- +/// @name Accessing Image Cache +///---------------------------- + +/** + The image cache used to improve image loadiing performance on scroll views. By default, this is an `NSCache` subclass conforming to the `AFImageCache` protocol, which listens for notification warnings and evicts objects accordingly. +*/ ++ (id )sharedImageCache; + +/** + Set the cache used for image loading. + + @param imageCache The image cache. + */ ++ (void)setSharedImageCache:(id )imageCache; + +///------------------------------------ +/// @name Accessing Response Serializer +///------------------------------------ + +/** + The response serializer used to create an image representation from the server response and response data. By default, this is an instance of `AFImageResponseSerializer`. + + @discussion Subclasses of `AFImageResponseSerializer` could be used to perform post-processing, such as color correction, face detection, or other effects. See https://github.com/AFNetworking/AFCoreImageSerializer + */ +@property (nonatomic, strong) id imageResponseSerializer; + +///-------------------- +/// @name Setting Image +///-------------------- + +/** + Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + By default, URL requests have a `Accept` header field value of "image / *", a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` + + @param url The URL used for the image request. + */ +- (void)setImageWithURL:(NSURL *)url; + +/** + Asynchronously downloads an image from the specified URL, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + By default, URL requests have a `Accept` header field value of "image / *", a cache policy of `NSURLCacheStorageAllowed` and a timeout interval of 30 seconds, and are set not handle cookies. To configure URL requests differently, use `setImageWithURLRequest:placeholderImage:success:failure:` + + @param url The URL used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. + */ +- (void)setImageWithURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage; + +/** + Asynchronously downloads an image from the specified URL request, and sets it once the request is finished. Any previous image request for the receiver will be cancelled. + + If the image is cached locally, the image is set immediately, otherwise the specified placeholder image will be set immediately, and then the remote image will be set once the request is finished. + + If a success block is specified, it is the responsibility of the block to set the image of the image view before returning. If no success block is specified, the default behavior of setting the image with `self.image = image` is applied. + + @param urlRequest The URL request used for the image request. + @param placeholderImage The image to be set initially, until the image request finishes. If `nil`, the image view will not change its image until the image request finishes. + @param success A block to be executed when the image request operation finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the image created from the response data of request. If the image was returned from cache, the request and response parameters will be `nil`. + @param failure A block object to be executed when the image request operation finishes unsuccessfully, or that finishes successfully. This block has no return value and takes three arguments: the request sent from the client, the response received from the server, and the error object describing the network or parsing error that occurred. + */ +- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure; + +/** + Cancels any executing image operation for the receiver, if one exists. + */ +- (void)cancelImageRequestOperation; + +@end + +#pragma mark - + +/** + The `AFImageCache` protocol is adopted by an object used to cache images loaded by the AFNetworking category on `UIImageView`. + */ +@protocol AFImageCache + +/** + Returns a cached image for the specififed request, if available. + + @param request The image request. + + @return The cached image. + */ +- (UIImage *)cachedImageForRequest:(NSURLRequest *)request; + +/** + Caches a particular image for the specified request. + + @param image The image to cache. + @param request The request to be used as a cache key. + */ +- (void)cacheImage:(UIImage *)image + forRequest:(NSURLRequest *)request; +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m new file mode 100644 index 0000000..04b6b0c --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.m @@ -0,0 +1,216 @@ +// UIImageView+AFNetworking.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIImageView+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" + +@interface AFImageCache : NSCache +@end + +#pragma mark - + +@interface UIImageView (_AFNetworking) +@property (readwrite, nonatomic, strong, setter = af_setImageRequestOperation:) AFHTTPRequestOperation *af_imageRequestOperation; +@end + +@implementation UIImageView (_AFNetworking) + ++ (NSOperationQueue *)af_sharedImageRequestOperationQueue { + static NSOperationQueue *_af_sharedImageRequestOperationQueue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_sharedImageRequestOperationQueue = [[NSOperationQueue alloc] init]; + _af_sharedImageRequestOperationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; + }); + + return _af_sharedImageRequestOperationQueue; +} + +- (AFHTTPRequestOperation *)af_imageRequestOperation { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, @selector(af_imageRequestOperation)); +} + +- (void)af_setImageRequestOperation:(AFHTTPRequestOperation *)imageRequestOperation { + objc_setAssociatedObject(self, @selector(af_imageRequestOperation), imageRequestOperation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIImageView (AFNetworking) +@dynamic imageResponseSerializer; + ++ (id )sharedImageCache { + static AFImageCache *_af_defaultImageCache = nil; + static dispatch_once_t oncePredicate; + dispatch_once(&oncePredicate, ^{ + _af_defaultImageCache = [[AFImageCache alloc] init]; + + [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * __unused notification) { + [_af_defaultImageCache removeAllObjects]; + }]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(sharedImageCache)) ?: _af_defaultImageCache; +#pragma clang diagnostic pop +} + ++ (void)setSharedImageCache:(id )imageCache { + objc_setAssociatedObject(self, @selector(sharedImageCache), imageCache, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (id )imageResponseSerializer { + static id _af_defaultImageResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultImageResponseSerializer = [AFImageResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(imageResponseSerializer)) ?: _af_defaultImageResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setImageResponseSerializer:(id )serializer { + objc_setAssociatedObject(self, @selector(imageResponseSerializer), serializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)setImageWithURL:(NSURL *)url { + [self setImageWithURL:url placeholderImage:nil]; +} + +- (void)setImageWithURL:(NSURL *)url + placeholderImage:(UIImage *)placeholderImage +{ + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; + + [self setImageWithURLRequest:request placeholderImage:placeholderImage success:nil failure:nil]; +} + +- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest + placeholderImage:(UIImage *)placeholderImage + success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success + failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure +{ + [self cancelImageRequestOperation]; + + UIImage *cachedImage = [[[self class] sharedImageCache] cachedImageForRequest:urlRequest]; + if (cachedImage) { + if (success) { + success(nil, nil, cachedImage); + } else { + self.image = cachedImage; + } + + self.af_imageRequestOperation = nil; + } else { + if (placeholderImage) { + self.image = placeholderImage; + } + + __weak __typeof(self)weakSelf = self; + self.af_imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; + self.af_imageRequestOperation.responseSerializer = self.imageResponseSerializer; + [self.af_imageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[strongSelf.af_imageRequestOperation.request URL]]) { + if (success) { + success(urlRequest, operation.response, responseObject); + } else if (responseObject) { + strongSelf.image = responseObject; + } + + if (operation == strongSelf.af_imageRequestOperation){ + strongSelf.af_imageRequestOperation = nil; + } + } + + [[[strongSelf class] sharedImageCache] cacheImage:responseObject forRequest:urlRequest]; + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if ([[urlRequest URL] isEqual:[strongSelf.af_imageRequestOperation.request URL]]) { + if (failure) { + failure(urlRequest, operation.response, error); + } + + if (operation == strongSelf.af_imageRequestOperation){ + strongSelf.af_imageRequestOperation = nil; + } + } + }]; + + [[[self class] af_sharedImageRequestOperationQueue] addOperation:self.af_imageRequestOperation]; + } +} + +- (void)cancelImageRequestOperation { + [self.af_imageRequestOperation cancel]; + self.af_imageRequestOperation = nil; +} + +@end + +#pragma mark - + +static inline NSString * AFImageCacheKeyFromURLRequest(NSURLRequest *request) { + return [[request URL] absoluteString]; +} + +@implementation AFImageCache + +- (UIImage *)cachedImageForRequest:(NSURLRequest *)request { + switch ([request cachePolicy]) { + case NSURLRequestReloadIgnoringCacheData: + case NSURLRequestReloadIgnoringLocalAndRemoteCacheData: + return nil; + default: + break; + } + + return [self objectForKey:AFImageCacheKeyFromURLRequest(request)]; +} + +- (void)cacheImage:(UIImage *)image + forRequest:(NSURLRequest *)request +{ + if (image && request) { + [self setObject:image forKey:AFImageCacheKeyFromURLRequest(request)]; + } +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h new file mode 100644 index 0000000..94082f6 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h @@ -0,0 +1,38 @@ +// UIKit+AFNetworking.h +// +// Copyright (c) 2013 AFNetworking (http://afnetworking.com/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#ifndef _UIKIT_AFNETWORKING_ + #define _UIKIT_AFNETWORKING_ + + #import "AFNetworkActivityIndicatorManager.h" + + #import "UIActivityIndicatorView+AFNetworking.h" + #import "UIAlertView+AFNetworking.h" + #import "UIButton+AFNetworking.h" + #import "UIImageView+AFNetworking.h" + #import "UIKit+AFNetworking.h" + #import "UIProgressView+AFNetworking.h" + #import "UIRefreshControl+AFNetworking.h" + #import "UIWebView+AFNetworking.h" +#endif /* _UIKIT_AFNETWORKING_ */ diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h new file mode 100644 index 0000000..06f3808 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h @@ -0,0 +1,88 @@ +// UIProgressView+AFNetworking.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIProgressView` class. The methods in this category provide support for binding the progress to the upload and download progress of a session task or request operation. + */ +@interface UIProgressView (AFNetworking) + +///------------------------------------ +/// @name Setting Session Task Progress +///------------------------------------ + +/** + Binds the progress to the upload progress of the specified session task. + + @param task The session task. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task + animated:(BOOL)animated; +#endif + +/** + Binds the progress to the download progress of the specified session task. + + @param task The session task. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setProgressWithDownloadProgressOfTask:(NSURLSessionDownloadTask *)task + animated:(BOOL)animated; +#endif + +///------------------------------------ +/// @name Setting Session Task Progress +///------------------------------------ + +/** + Binds the progress to the upload progress of the specified request operation. + + @param operation The request operation. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +- (void)setProgressWithUploadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated; + +/** + Binds the progress to the download progress of the specified request operation. + + @param operation The request operation. + @param animated `YES` if the change should be animated, `NO` if the change should happen immediately. + */ +- (void)setProgressWithDownloadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated; + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m new file mode 100644 index 0000000..dfe4151 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.m @@ -0,0 +1,183 @@ +// UIProgressView+AFNetworking.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIProgressView+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFURLConnectionOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +static void * AFTaskCountOfBytesSentContext = &AFTaskCountOfBytesSentContext; +static void * AFTaskCountOfBytesReceivedContext = &AFTaskCountOfBytesReceivedContext; + +@interface AFURLConnectionOperation (_UIProgressView) +@property (readwrite, nonatomic, copy) void (^uploadProgress)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +@property (readwrite, nonatomic, assign, setter = af_setUploadProgressAnimated:) BOOL af_uploadProgressAnimated; + +@property (readwrite, nonatomic, copy) void (^downloadProgress)(NSUInteger bytes, long long totalBytes, long long totalBytesExpected); +@property (readwrite, nonatomic, assign, setter = af_setDownloadProgressAnimated:) BOOL af_downloadProgressAnimated; +@end + +@implementation AFURLConnectionOperation (_UIProgressView) +@dynamic uploadProgress; // Implemented in AFURLConnectionOperation +@dynamic af_uploadProgressAnimated; + +@dynamic downloadProgress; // Implemented in AFURLConnectionOperation +@dynamic af_downloadProgressAnimated; +@end + +#pragma mark - + +@implementation UIProgressView (AFNetworking) + +- (BOOL)af_uploadProgressAnimated { + return [(NSNumber *)objc_getAssociatedObject(self, @selector(af_uploadProgressAnimated)) boolValue]; +} + +- (void)af_setUploadProgressAnimated:(BOOL)animated { + objc_setAssociatedObject(self, @selector(af_uploadProgressAnimated), @(animated), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)af_downloadProgressAnimated { + return [(NSNumber *)objc_getAssociatedObject(self, @selector(af_downloadProgressAnimated)) boolValue]; +} + +- (void)af_setDownloadProgressAnimated:(BOOL)animated { + objc_setAssociatedObject(self, @selector(af_downloadProgressAnimated), @(animated), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task + animated:(BOOL)animated +{ + [task addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesSentContext]; + [task addObserver:self forKeyPath:@"countOfBytesSent" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesSentContext]; + + [self af_setUploadProgressAnimated:animated]; +} + +- (void)setProgressWithDownloadProgressOfTask:(NSURLSessionDownloadTask *)task + animated:(BOOL)animated +{ + [task addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; + [task addObserver:self forKeyPath:@"countOfBytesReceived" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; + + [self af_setDownloadProgressAnimated:animated]; +} +#endif + +#pragma mark - + +- (void)setProgressWithUploadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated +{ + __weak __typeof(self)weakSelf = self; + void (^original)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) = [operation.uploadProgress copy]; + [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { + if (original) { + original(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + if (totalBytesExpectedToWrite > 0) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + [strongSelf setProgress:(totalBytesWritten / (totalBytesExpectedToWrite * 1.0f)) animated:animated]; + } + }); + }]; +} + +- (void)setProgressWithDownloadProgressOfOperation:(AFURLConnectionOperation *)operation + animated:(BOOL)animated +{ + __weak __typeof(self)weakSelf = self; + void (^original)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) = [operation.downloadProgress copy]; + [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { + if (original) { + original(bytesRead, totalBytesRead, totalBytesExpectedToRead); + } + + dispatch_async(dispatch_get_main_queue(), ^{ + if (totalBytesExpectedToRead > 0) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + [strongSelf setProgress:(totalBytesRead / (totalBytesExpectedToRead * 1.0f)) animated:animated]; + } + }); + }]; +} + +#pragma mark - NSKeyValueObserving + +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(__unused NSDictionary *)change + context:(void *)context +{ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 + if (context == AFTaskCountOfBytesSentContext || context == AFTaskCountOfBytesReceivedContext) { + if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesSent))]) { + if ([object countOfBytesExpectedToSend] > 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self setProgress:[object countOfBytesSent] / ([object countOfBytesExpectedToSend] * 1.0f) animated:self.af_uploadProgressAnimated]; + }); + } + } + + if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesReceived))]) { + if ([object countOfBytesExpectedToReceive] > 0) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self setProgress:[object countOfBytesReceived] / ([object countOfBytesExpectedToReceive] * 1.0f) animated:self.af_downloadProgressAnimated]; + }); + } + } + + if ([keyPath isEqualToString:NSStringFromSelector(@selector(state))]) { + if ([(NSURLSessionTask *)object state] == NSURLSessionTaskStateCompleted) { + @try { + [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(state))]; + + if (context == AFTaskCountOfBytesSentContext) { + [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesSent))]; + } + + if (context == AFTaskCountOfBytesReceivedContext) { + [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesReceived))]; + } + } + @catch (NSException * __unused exception) {} + } + } + } +#endif +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h new file mode 100644 index 0000000..18c12ea --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h @@ -0,0 +1,64 @@ +// UIRefreshControl+AFNetworking.m +// +// Copyright (c) 2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFURLConnectionOperation; + +/** + This category adds methods to the UIKit framework's `UIRefreshControl` class. The methods in this category provide support for automatically begining and ending refreshing depending on the loading state of a request operation or session task. + */ +@interface UIRefreshControl (AFNetworking) + +///----------------------------------- +/// @name Refreshing for Session Tasks +///----------------------------------- + +/** + Binds the refreshing state to the state of the specified task. + + @param task The task. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task; +#endif + +///---------------------------------------- +/// @name Refreshing for Request Operations +///---------------------------------------- + +/** + Binds the refreshing state to the execution state of the specified operation. + + @param operation The operation. If `nil`, automatic updating from any previously specified operation will be disabled. + */ +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation; + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m new file mode 100644 index 0000000..e266451 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.m @@ -0,0 +1,93 @@ +// UIRefreshControl+AFNetworking.m +// +// Copyright (c) 2014 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIRefreshControl+AFNetworking.h" + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +#import "AFURLSessionManager.h" +#endif + +@implementation UIRefreshControl (AFNetworking) + +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000 +- (void)setRefreshingWithStateOfTask:(NSURLSessionTask *)task { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingTaskDidResumeNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidSuspendNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingTaskDidCompleteNotification object:nil]; + + if (task) { + if (task.state == NSURLSessionTaskStateRunning) { + [self beginRefreshing]; + + [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingTaskDidResumeNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidCompleteNotification object:task]; + [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingTaskDidSuspendNotification object:task]; + } else { + [self endRefreshing]; + } + } +} +#endif + +- (void)setRefreshingWithStateOfOperation:(AFURLConnectionOperation *)operation { + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + + [notificationCenter removeObserver:self name:AFNetworkingOperationDidStartNotification object:nil]; + [notificationCenter removeObserver:self name:AFNetworkingOperationDidFinishNotification object:nil]; + + if (operation) { + if (![operation isFinished]) { + if ([operation isExecuting]) { + [self beginRefreshing]; + } else { + [self endRefreshing]; + } + + [notificationCenter addObserver:self selector:@selector(af_beginRefreshing) name:AFNetworkingOperationDidStartNotification object:operation]; + [notificationCenter addObserver:self selector:@selector(af_endRefreshing) name:AFNetworkingOperationDidFinishNotification object:operation]; + } + } +} + +#pragma mark - + +- (void)af_beginRefreshing { + dispatch_async(dispatch_get_main_queue(), ^{ + [self beginRefreshing]; + }); +} + +- (void)af_endRefreshing { + dispatch_async(dispatch_get_main_queue(), ^{ + [self endRefreshing]; + }); +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h new file mode 100644 index 0000000..159a51a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h @@ -0,0 +1,83 @@ +// UIWebView+AFNetworking.h +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import + +@class AFHTTPRequestSerializer, AFHTTPResponseSerializer; +@protocol AFURLRequestSerialization, AFURLResponseSerialization; + +/** + This category adds methods to the UIKit framework's `UIWebView` class. The methods in this category provide increased control over the request cycle, including progress monitoring and success / failure handling. + + @discussion When using these category methods, make sure to assign `delegate` for the web view, which implements `–webView:shouldStartLoadWithRequest:navigationType:` appropriately. This allows for tapped links to be loaded through AFNetworking, and can ensure that `canGoBack` & `canGoForward` update their values correctly. + */ +@interface UIWebView (AFNetworking) + +/** + The request serializer used to serialize requests made with the `-loadRequest:...` category methods. By default, this is an instance of `AFHTTPRequestSerializer`. + */ +@property (nonatomic, strong) AFHTTPRequestSerializer * requestSerializer; + +/** + The response serializer used to serialize responses made with the `-loadRequest:...` category methods. By default, this is an instance of `AFHTTPResponseSerializer`. + */ +@property (nonatomic, strong) AFHTTPResponseSerializer * responseSerializer; + +/** + Asynchronously loads the specified request. + + @param request A URL request identifying the location of the content to load. This must not be `nil`. + @param progress A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + @param success A block object to be executed when the request finishes loading successfully. This block returns the HTML string to be loaded by the web view, and takes two arguments: the response, and the response string. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)loadRequest:(NSURLRequest *)request + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))success + failure:(void (^)(NSError *error))failure; + +/** + Asynchronously loads the data associated with a particular request with a specified MIME type and text encoding. + + @param request A URL request identifying the location of the content to load. This must not be `nil`. + @param MIMEType The MIME type of the content. Defaults to the content type of the response if not specified. + @param textEncodingName The IANA encoding name, as in `utf-8` or `utf-16`. Defaults to the response text encoding if not specified. + @param progress A block object to be called when an undetermined number of bytes have been downloaded from the server. This block has no return value and takes three arguments: the number of bytes read since the last time the download progress block was called, the total bytes read, and the total bytes expected to be read during the request, as initially determined by the expected content size of the `NSHTTPURLResponse` object. This block may be called multiple times, and will execute on the main thread. + @param success A block object to be executed when the request finishes loading successfully. This block returns the data to be loaded by the web view and takes two arguments: the response, and the downloaded data. + @param failure A block object to be executed when the request operation finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a single argument: the error that occurred. + */ +- (void)loadRequest:(NSURLRequest *)request + MIMEType:(NSString *)MIMEType + textEncodingName:(NSString *)textEncodingName + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSData * (^)(NSHTTPURLResponse *response, NSData *data))success + failure:(void (^)(NSError *error))failure; + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m new file mode 100644 index 0000000..4ff13e4 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.m @@ -0,0 +1,151 @@ +// UIWebView+AFNetworking.m +// +// Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIWebView+AFNetworking.h" + +#import + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) + +#import "AFHTTPRequestOperation.h" +#import "AFURLResponseSerialization.h" +#import "AFURLRequestSerialization.h" + +@interface UIWebView (_AFNetworking) +@property (readwrite, nonatomic, strong, setter = af_setHTTPRequestOperation:) AFHTTPRequestOperation *af_HTTPRequestOperation; +@end + +@implementation UIWebView (_AFNetworking) + +- (AFHTTPRequestOperation *)af_HTTPRequestOperation { + return (AFHTTPRequestOperation *)objc_getAssociatedObject(self, @selector(af_HTTPRequestOperation)); +} + +- (void)af_setHTTPRequestOperation:(AFHTTPRequestOperation *)operation { + objc_setAssociatedObject(self, @selector(af_HTTPRequestOperation), operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end + +#pragma mark - + +@implementation UIWebView (AFNetworking) + +- (AFHTTPRequestSerializer *)requestSerializer { + static AFHTTPRequestSerializer *_af_defaultRequestSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultRequestSerializer = [AFHTTPRequestSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(requestSerializer)) ?: _af_defaultRequestSerializer; +#pragma clang diagnostic pop +} + +- (void)setRequestSerializer:(AFHTTPRequestSerializer *)requestSerializer { + objc_setAssociatedObject(self, @selector(requestSerializer), requestSerializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (AFHTTPResponseSerializer *)responseSerializer { + static AFHTTPResponseSerializer *_af_defaultResponseSerializer = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _af_defaultResponseSerializer = [AFHTTPResponseSerializer serializer]; + }); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + return objc_getAssociatedObject(self, @selector(responseSerializer)) ?: _af_defaultResponseSerializer; +#pragma clang diagnostic pop +} + +- (void)setResponseSerializer:(AFHTTPResponseSerializer *)responseSerializer { + objc_setAssociatedObject(self, @selector(responseSerializer), responseSerializer, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - + +- (void)loadRequest:(NSURLRequest *)request + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSString * (^)(NSHTTPURLResponse *response, NSString *HTML))success + failure:(void (^)(NSError *error))failure +{ + [self loadRequest:request MIMEType:nil textEncodingName:nil progress:progress success:^NSData *(NSHTTPURLResponse *response, NSData *data) { + NSStringEncoding stringEncoding = NSUTF8StringEncoding; + if (response.textEncodingName) { + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)response.textEncodingName); + if (encoding != kCFStringEncodingInvalidId) { + stringEncoding = CFStringConvertEncodingToNSStringEncoding(encoding); + } + } + + NSString *string = [[NSString alloc] initWithData:data encoding:stringEncoding]; + if (success) { + string = success(response, string); + } + + return [string dataUsingEncoding:stringEncoding]; + } failure:failure]; +} + +- (void)loadRequest:(NSURLRequest *)request + MIMEType:(NSString *)MIMEType + textEncodingName:(NSString *)textEncodingName + progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress + success:(NSData * (^)(NSHTTPURLResponse *response, NSData *data))success + failure:(void (^)(NSError *error))failure +{ + NSParameterAssert(request); + + if (self.af_HTTPRequestOperation) { + [self.af_HTTPRequestOperation cancel]; + } + + request = [self.requestSerializer requestBySerializingRequest:request withParameters:nil error:nil]; + + self.af_HTTPRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + self.af_HTTPRequestOperation.responseSerializer = self.responseSerializer; + + __weak __typeof(self)weakSelf = self; + [self.af_HTTPRequestOperation setDownloadProgressBlock:progress]; + [self.af_HTTPRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id __unused responseObject) { + NSData *data = success ? success(operation.response, operation.responseData) : operation.responseData; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu" + __strong __typeof(weakSelf) strongSelf = weakSelf; + [strongSelf loadData:data MIMEType:(MIMEType ?: [operation.response MIMEType]) textEncodingName:(textEncodingName ?: [operation.response textEncodingName]) baseURL:[operation.response URL]]; +#pragma clang diagnostic pop + } failure:^(AFHTTPRequestOperation * __unused operation, NSError *error) { + if (failure) { + failure(error); + } + }]; + + [self.af_HTTPRequestOperation start]; +} + +@end + +#endif diff --git a/iOSStudy/iOSStudy/Pods/FMDB/LICENSE.txt b/iOSStudy/iOSStudy/Pods/FMDB/LICENSE.txt new file mode 100644 index 0000000..addfc1a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/LICENSE.txt @@ -0,0 +1,28 @@ +If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/FMDB/README.markdown b/iOSStudy/iOSStudy/Pods/FMDB/README.markdown new file mode 100644 index 0000000..ac104fe --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/README.markdown @@ -0,0 +1,336 @@ +# FMDB v2.5 +This is an Objective-C wrapper around SQLite: http://sqlite.org/ + +## The FMDB Mailing List: +http://groups.google.com/group/fmdb + +## Read the SQLite FAQ: +http://www.sqlite.org/faq.html + +Since FMDB is built on top of SQLite, you're going to want to read this page top to bottom at least once. And while you're there, make sure to bookmark the SQLite Documentation page: http://www.sqlite.org/docs.html + +## Contributing +Do you have an awesome idea that deserves to be in FMDB? You might consider pinging ccgus first to make sure he hasn't already ruled it out for some reason. Otherwise pull requests are great, and make sure you stick to the local coding conventions. However, please be patient and if you haven't heard anything from ccgus for a week or more, you might want to send a note asking what's up. + +## CocoaPods + +[![Dependency Status](https://www.versioneye.com/objective-c/fmdb/2.3/badge.svg?style=flat)](https://www.versioneye.com/objective-c/fmdb/2.3) +[![Reference Status](https://www.versioneye.com/objective-c/fmdb/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/fmdb/references) + +FMDB can be installed using [CocoaPods](http://cocoapods.org/). + +``` +pod 'FMDB' +# pod 'FMDB/FTS' # FMDB with FTS +# pod 'FMDB/standalone' # FMDB with latest SQLite amalgamation source +# pod 'FMDB/standalone/FTS' # FMDB with latest SQLite amalgamation source and FTS +# pod 'FMDB/SQLCipher' # FMDB with SQLCipher +``` + +**If using FMDB with [SQLCipher](http://sqlcipher.net/) you must use the FMDB/SQLCipher subspec. The FMDB/SQLCipher subspec declares SQLCipher as a dependency, allowing FMDB to be compiled with the `-DSQLITE_HAS_CODEC` flag.** + +## FMDB Class Reference: +http://ccgus.github.io/fmdb/html/index.html + +## Automatic Reference Counting (ARC) or Manual Memory Management? +You can use either style in your Cocoa project. FMDB Will figure out which you are using at compile time and do the right thing. + +## Usage +There are three main classes in FMDB: + +1. `FMDatabase` - Represents a single SQLite database. Used for executing SQL statements. +2. `FMResultSet` - Represents the results of executing a query on an `FMDatabase`. +3. `FMDatabaseQueue` - If you're wanting to perform queries and updates on multiple threads, you'll want to use this class. It's described in the "Thread Safety" section below. + +### Database Creation +An `FMDatabase` is created with a path to a SQLite database file. This path can be one of these three: + +1. A file system path. The file does not have to exist on disk. If it does not exist, it is created for you. +2. An empty string (`@""`). An empty database is created at a temporary location. This database is deleted with the `FMDatabase` connection is closed. +3. `NULL`. An in-memory database is created. This database will be destroyed with the `FMDatabase` connection is closed. + +(For more information on temporary and in-memory databases, read the sqlite documentation on the subject: http://www.sqlite.org/inmemorydb.html) + + FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; + +### Opening + +Before you can interact with the database, it must be opened. Opening fails if there are insufficient resources or permissions to open and/or create the database. + + if (![db open]) { + [db release]; + return; + } + +### Executing Updates + +Any sort of SQL statement which is not a `SELECT` statement qualifies as an update. This includes `CREATE`, `UPDATE`, `INSERT`, `ALTER`, `COMMIT`, `BEGIN`, `DETACH`, `DELETE`, `DROP`, `END`, `EXPLAIN`, `VACUUM`, and `REPLACE` statements (plus many more). Basically, if your SQL statement does not begin with `SELECT`, it is an update statement. + +Executing updates returns a single value, a `BOOL`. A return value of `YES` means the update was successfully executed, and a return value of `NO` means that some error was encountered. You may invoke the `-lastErrorMessage` and `-lastErrorCode` methods to retrieve more information. + +### Executing Queries + +A `SELECT` statement is a query and is executed via one of the `-executeQuery...` methods. + +Executing queries returns an `FMResultSet` object if successful, and `nil` upon failure. You should use the `-lastErrorMessage` and `-lastErrorCode` methods to determine why a query failed. + +In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" from one record to the other. With FMDB, the easiest way to do that is like this: + + FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"]; + while ([s next]) { + //retrieve values for each record + } + +You must always invoke `-[FMResultSet next]` before attempting to access the values returned in a query, even if you're only expecting one: + + FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"]; + if ([s next]) { + int totalCount = [s intForColumnIndex:0]; + } + +`FMResultSet` has many methods to retrieve data in an appropriate format: + +- `intForColumn:` +- `longForColumn:` +- `longLongIntForColumn:` +- `boolForColumn:` +- `doubleForColumn:` +- `stringForColumn:` +- `dateForColumn:` +- `dataForColumn:` +- `dataNoCopyForColumn:` +- `UTF8StringForColumnName:` +- `objectForColumnName:` + +Each of these methods also has a `{type}ForColumnIndex:` variant that is used to retrieve the data based on the position of the column in the results, as opposed to the column's name. + +Typically, there's no need to `-close` an `FMResultSet` yourself, since that happens when either the result set is deallocated, or the parent database is closed. + +### Closing + +When you have finished executing queries and updates on the database, you should `-close` the `FMDatabase` connection so that SQLite will relinquish any resources it has acquired during the course of its operation. + + [db close]; + +### Transactions + +`FMDatabase` can begin and commit a transaction by invoking one of the appropriate methods or executing a begin/end transaction statement. + +### Multiple Statements and Batch Stuff + +You can use `FMDatabase`'s executeStatements:withResultBlock: to do multiple statements in a string: + +``` +NSString *sql = @"create table bulktest1 (id integer primary key autoincrement, x text);" + "create table bulktest2 (id integer primary key autoincrement, y text);" + "create table bulktest3 (id integer primary key autoincrement, z text);" + "insert into bulktest1 (x) values ('XXX');" + "insert into bulktest2 (y) values ('YYY');" + "insert into bulktest3 (z) values ('ZZZ');"; + +success = [db executeStatements:sql]; + +sql = @"select count(*) as count from bulktest1;" + "select count(*) as count from bulktest2;" + "select count(*) as count from bulktest3;"; + +success = [self.db executeStatements:sql withResultBlock:^int(NSDictionary *dictionary) { + NSInteger count = [dictionary[@"count"] integerValue]; + XCTAssertEqual(count, 1, @"expected one record for dictionary %@", dictionary); + return 0; +}]; +``` + +### Data Sanitization + +When providing a SQL statement to FMDB, you should not attempt to "sanitize" any values before insertion. Instead, you should use the standard SQLite binding syntax: + + INSERT INTO myTable VALUES (?, ?, ?) + +The `?` character is recognized by SQLite as a placeholder for a value to be inserted. The execution methods all accept a variable number of arguments (or a representation of those arguments, such as an `NSArray`, `NSDictionary`, or a `va_list`), which are properly escaped for you. + +Alternatively, you may use named parameters syntax: + + INSERT INTO myTable VALUES (:id, :name, :value) + +The parameters *must* start with a colon. SQLite itself supports other characters, but internally the Dictionary keys are prefixed with a colon, do **not** include the colon in your dictionary keys. + + NSDictionary *argsDict = [NSDictionary dictionaryWithObjectsAndKeys:@"My Name", @"name", nil]; + [db executeUpdate:@"INSERT INTO myTable (name) VALUES (:name)" withParameterDictionary:argsDict]; + +Thus, you SHOULD NOT do this (or anything like this): + + [db executeUpdate:[NSString stringWithFormat:@"INSERT INTO myTable VALUES (%@)", @"this has \" lots of ' bizarre \" quotes '"]]; + +Instead, you SHOULD do: + + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @"this has \" lots of ' bizarre \" quotes '"]; + +All arguments provided to the `-executeUpdate:` method (or any of the variants that accept a `va_list` as a parameter) must be objects. The following will not work (and will result in a crash): + + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", 42]; + +The proper way to insert a number is to box it in an `NSNumber` object: + + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:42]]; + +Alternatively, you can use the `-execute*WithFormat:` variant to use `NSString`-style substitution: + + [db executeUpdateWithFormat:@"INSERT INTO myTable VALUES (%d)", 42]; + +Internally, the `-execute*WithFormat:` methods are properly boxing things for you. The following percent modifiers are recognized: `%@`, `%c`, `%s`, `%d`, `%D`, `%i`, `%u`, `%U`, `%hi`, `%hu`, `%qi`, `%qu`, `%f`, `%g`, `%ld`, `%lu`, `%lld`, and `%llu`. Using a modifier other than those will have unpredictable results. If, for some reason, you need the `%` character to appear in your SQL statement, you should use `%%`. + + +

Using FMDatabaseQueue and Thread Safety.

+ +Using a single instance of FMDatabase from multiple threads at once is a bad idea. It has always been OK to make a FMDatabase object *per thread*. Just don't share a single instance across threads, and definitely not across multiple threads at the same time. Bad things will eventually happen and you'll eventually get something to crash, or maybe get an exception, or maybe meteorites will fall out of the sky and hit your Mac Pro. *This would suck*. + +**So don't instantiate a single FMDatabase object and use it across multiple threads.** + +Instead, use FMDatabaseQueue. It's your friend and it's here to help. Here's how to use it: + +First, make your queue. + + FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; + +Then use it like so: + + [queue inDatabase:^(FMDatabase *db) { + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]]; + + FMResultSet *rs = [db executeQuery:@"select * from foo"]; + while ([rs next]) { + … + } + }]; + +An easy way to wrap things up in a transaction can be done like this: + + [queue inTransaction:^(FMDatabase *db, BOOL *rollback) { + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]]; + + if (whoopsSomethingWrongHappened) { + *rollback = YES; + return; + } + // etc… + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]]; + }]; + + +FMDatabaseQueue will run the blocks on a serialized queue (hence the name of the class). So if you call FMDatabaseQueue's methods from multiple threads at the same time, they will be executed in the order they are received. This way queries and updates won't step on each other's toes, and every one is happy. + +**Note:** The calls to FMDatabaseQueue's methods are blocking. So even though you are passing along blocks, they will **not** be run on another thread. + +## Making custom sqlite functions, based on blocks. + +You can do this! For an example, look for "makeFunctionNamed:" in main.m + +## Swift + +You can use FMDB in Swift projects too. + +To do this, you must: + +1. Copy the FMDB `.m` and `.h` files into your project. + +2. If prompted to create a "bridging header", you should do so. If not prompted and if you don't already have a bridging header, add one. + + For more information on bridging headers, see [Swift and Objective-C in the Same Project](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_76). + +3. In your briding header, add a line that says: + + #import "FMDB.h" + +4. Optionally, copy the `FMDatabaseVariadic.swift` from the "src/extra/Swift Extensions" folder into your project. This allows you to use `executeUpdate` and `executeQuery` with variadic parameters, rather than the `withArgumentsInArray` rendition. + +If you do the above, you can then write Swift code that uses FMDatabase. For example: + + let documentsFolder = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String + let path = documentsFolder.stringByAppendingPathComponent("test.sqlite") + + let database = FMDatabase(path: path) + + if !database.open() { + println("Unable to open database") + return + } + + if !database.executeUpdate("create table test(x text, y text, z text)", withArgumentsInArray: nil) { + println("create table failed: \(database.lastErrorMessage())") + } + + if !database.executeUpdate("insert into test (x, y, z) values (?, ?, ?)", withArgumentsInArray: ["a", "b", "c"]) { + println("insert 1 table failed: \(database.lastErrorMessage())") + } + + if !database.executeUpdate("insert into test (x, y, z) values (?, ?, ?)", withArgumentsInArray: ["e", "f", "g"]) { + println("insert 2 table failed: \(database.lastErrorMessage())") + } + + if let rs = database.executeQuery("select x, y, z from test", withArgumentsInArray: nil) { + while rs.next() { + let x = rs.stringForColumn("x") + let y = rs.stringForColumn("y") + let z = rs.stringForColumn("z") + println("x = \(x); y = \(y); z = \(z)") + } + } else { + println("select failed: \(database.lastErrorMessage())") + } + + database.close() + + +## History + +The history and changes are availbe on its [GitHub page](https://github.com/ccgus/fmdb) and are summarized in the "CHANGES_AND_TODO_LIST.txt" file. + +## Contributors + +The contributors to FMDB are contained in the "Contributors.txt" file. + +## Additional projects using FMDB, which might be interesting to the discerning developer. + + * FMDBMigrationManager, A SQLite schema migration management system for FMDB: https://github.com/layerhq/FMDBMigrationManager + * FCModel, An alternative to Core Data for people who like having direct SQL access: https://github.com/marcoarment/FCModel + +## Quick notes on FMDB's coding style + +Spaces, not tabs. Square brackets, not dot notation. Look at what FMDB already does with curly brackets and such, and stick to that style. + +## Reporting bugs + +Reduce your bug down to the smallest amount of code possible. You want to make it super easy for the developers to see and reproduce your bug. If it helps, pretend that the person who can fix your bug is active on shipping 3 major products, works on a handful of open source projects, has a newborn baby, and is generally very very busy. + +And we've even added a template function to main.m (FMDBReportABugFunction) in the FMDB distribution to help you out: + +* Open up fmdb project in Xcode. +* Open up main.m and modify the FMDBReportABugFunction to reproduce your bug. + * Setup your table(s) in the code. + * Make your query or update(s). + * Add some assertions which demonstrate the bug. + +Then you can bring it up on the FMDB mailing list by showing your nice and compact FMDBReportABugFunction, or you can report the bug via the github FMDB bug reporter. + +**Optional:** + +Figure out where the bug is, fix it, and send a patch in or bring that up on the mailing list. Make sure all the other tests run after your modifications. + +## Support + +The support channels for FMDB are the mailing list (see above), filing a bug here, or maybe on Stack Overflow. So that is to say, support is provided by the community and on a voluntary basis. + +FMDB development is overseen by Gus Mueller of Flying Meat. If FMDB been helpful to you, consider purchasing an app from FM or telling all your friends about it. + +## License + +The license for FMDB is contained in the "License.txt" file. + +If you happen to come across either Gus Mueller or Rob Ryan in a bar, you might consider purchasing a drink of their choosing if FMDB has been useful to you. + +(The drink is for them of course, shame on you for trying to keep it.) \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDB.h b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDB.h new file mode 100644 index 0000000..39e2f43 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDB.h @@ -0,0 +1,5 @@ +#import "FMDatabase.h" +#import "FMResultSet.h" +#import "FMDatabaseAdditions.h" +#import "FMDatabaseQueue.h" +#import "FMDatabasePool.h" diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.h b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.h new file mode 100644 index 0000000..9628655 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.h @@ -0,0 +1,1083 @@ +#import +#import "sqlite3.h" +#import "FMResultSet.h" +#import "FMDatabasePool.h" + + +#if ! __has_feature(objc_arc) + #define FMDBAutorelease(__v) ([__v autorelease]); + #define FMDBReturnAutoreleased FMDBAutorelease + + #define FMDBRetain(__v) ([__v retain]); + #define FMDBReturnRetained FMDBRetain + + #define FMDBRelease(__v) ([__v release]); + + #define FMDBDispatchQueueRelease(__v) (dispatch_release(__v)); +#else + // -fobjc-arc + #define FMDBAutorelease(__v) + #define FMDBReturnAutoreleased(__v) (__v) + + #define FMDBRetain(__v) + #define FMDBReturnRetained(__v) (__v) + + #define FMDBRelease(__v) + +// If OS_OBJECT_USE_OBJC=1, then the dispatch objects will be treated like ObjC objects +// and will participate in ARC. +// See the section on "Dispatch Queues and Automatic Reference Counting" in "Grand Central Dispatch (GCD) Reference" for details. + #if OS_OBJECT_USE_OBJC + #define FMDBDispatchQueueRelease(__v) + #else + #define FMDBDispatchQueueRelease(__v) (dispatch_release(__v)); + #endif +#endif + +#if !__has_feature(objc_instancetype) + #define instancetype id +#endif + + +typedef int(^FMDBExecuteStatementsCallbackBlock)(NSDictionary *resultsDictionary); + + +/** A SQLite ([http://sqlite.org/](http://sqlite.org/)) Objective-C wrapper. + + ### Usage + The three main classes in FMDB are: + + - `FMDatabase` - Represents a single SQLite database. Used for executing SQL statements. + - `` - Represents the results of executing a query on an `FMDatabase`. + - `` - If you want to perform queries and updates on multiple threads, you'll want to use this class. + + ### See also + + - `` - A pool of `FMDatabase` objects. + - `` - A wrapper for `sqlite_stmt`. + + ### External links + + - [FMDB on GitHub](https://github.com/ccgus/fmdb) including introductory documentation + - [SQLite web site](http://sqlite.org/) + - [FMDB mailing list](http://groups.google.com/group/fmdb) + - [SQLite FAQ](http://www.sqlite.org/faq.html) + + @warning Do not instantiate a single `FMDatabase` object and use it across multiple threads. Instead, use ``. + + */ + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-interface-ivars" + + +@interface FMDatabase : NSObject { + + sqlite3* _db; + NSString* _databasePath; + BOOL _logsErrors; + BOOL _crashOnErrors; + BOOL _traceExecution; + BOOL _checkedOut; + BOOL _shouldCacheStatements; + BOOL _isExecutingStatement; + BOOL _inTransaction; + NSTimeInterval _maxBusyRetryTimeInterval; + NSTimeInterval _startBusyRetryTime; + + NSMutableDictionary *_cachedStatements; + NSMutableSet *_openResultSets; + NSMutableSet *_openFunctions; + + NSDateFormatter *_dateFormat; +} + +///----------------- +/// @name Properties +///----------------- + +/** Whether should trace execution */ + +@property (atomic, assign) BOOL traceExecution; + +/** Whether checked out or not */ + +@property (atomic, assign) BOOL checkedOut; + +/** Crash on errors */ + +@property (atomic, assign) BOOL crashOnErrors; + +/** Logs errors */ + +@property (atomic, assign) BOOL logsErrors; + +/** Dictionary of cached statements */ + +@property (atomic, retain) NSMutableDictionary *cachedStatements; + +///--------------------- +/// @name Initialization +///--------------------- + +/** Create a `FMDatabase` object. + + An `FMDatabase` is created with a path to a SQLite database file. This path can be one of these three: + + 1. A file system path. The file does not have to exist on disk. If it does not exist, it is created for you. + 2. An empty string (`@""`). An empty database is created at a temporary location. This database is deleted with the `FMDatabase` connection is closed. + 3. `nil`. An in-memory database is created. This database will be destroyed with the `FMDatabase` connection is closed. + + For example, to create/open a database in your Mac OS X `tmp` folder: + + FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; + + Or, in iOS, you might open a database in the app's `Documents` directory: + + NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + NSString *dbPath = [docsPath stringByAppendingPathComponent:@"test.db"]; + FMDatabase *db = [FMDatabase databaseWithPath:dbPath]; + + (For more information on temporary and in-memory databases, read the sqlite documentation on the subject: [http://www.sqlite.org/inmemorydb.html](http://www.sqlite.org/inmemorydb.html)) + + @param inPath Path of database file + + @return `FMDatabase` object if successful; `nil` if failure. + + */ + ++ (instancetype)databaseWithPath:(NSString*)inPath; + +/** Initialize a `FMDatabase` object. + + An `FMDatabase` is created with a path to a SQLite database file. This path can be one of these three: + + 1. A file system path. The file does not have to exist on disk. If it does not exist, it is created for you. + 2. An empty string (`@""`). An empty database is created at a temporary location. This database is deleted with the `FMDatabase` connection is closed. + 3. `nil`. An in-memory database is created. This database will be destroyed with the `FMDatabase` connection is closed. + + For example, to create/open a database in your Mac OS X `tmp` folder: + + FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; + + Or, in iOS, you might open a database in the app's `Documents` directory: + + NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + NSString *dbPath = [docsPath stringByAppendingPathComponent:@"test.db"]; + FMDatabase *db = [FMDatabase databaseWithPath:dbPath]; + + (For more information on temporary and in-memory databases, read the sqlite documentation on the subject: [http://www.sqlite.org/inmemorydb.html](http://www.sqlite.org/inmemorydb.html)) + + @param inPath Path of database file + + @return `FMDatabase` object if successful; `nil` if failure. + + */ + +- (instancetype)initWithPath:(NSString*)inPath; + + +///----------------------------------- +/// @name Opening and closing database +///----------------------------------- + +/** Opening a new database connection + + The database is opened for reading and writing, and is created if it does not already exist. + + @return `YES` if successful, `NO` on error. + + @see [sqlite3_open()](http://sqlite.org/c3ref/open.html) + @see openWithFlags: + @see close + */ + +- (BOOL)open; + +/** Opening a new database connection with flags + + @param flags one of the following three values, optionally combined with the `SQLITE_OPEN_NOMUTEX`, `SQLITE_OPEN_FULLMUTEX`, `SQLITE_OPEN_SHAREDCACHE`, `SQLITE_OPEN_PRIVATECACHE`, and/or `SQLITE_OPEN_URI` flags: + + `SQLITE_OPEN_READONLY` + + The database is opened in read-only mode. If the database does not already exist, an error is returned. + + `SQLITE_OPEN_READWRITE` + + The database is opened for reading and writing if possible, or reading only if the file is write protected by the operating system. In either case the database must already exist, otherwise an error is returned. + + `SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE` + + The database is opened for reading and writing, and is created if it does not already exist. This is the behavior that is always used for `open` method. + + @return `YES` if successful, `NO` on error. + + @see [sqlite3_open_v2()](http://sqlite.org/c3ref/open.html) + @see open + @see close + */ + +#if SQLITE_VERSION_NUMBER >= 3005000 +- (BOOL)openWithFlags:(int)flags; +#endif + +/** Closing a database connection + + @return `YES` if success, `NO` on error. + + @see [sqlite3_close()](http://sqlite.org/c3ref/close.html) + @see open + @see openWithFlags: + */ + +- (BOOL)close; + +/** Test to see if we have a good connection to the database. + + This will confirm whether: + + - is database open + - if open, it will try a simple SELECT statement and confirm that it succeeds. + + @return `YES` if everything succeeds, `NO` on failure. + */ + +- (BOOL)goodConnection; + + +///---------------------- +/// @name Perform updates +///---------------------- + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html), [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) to bind values to `?` placeholders in the SQL with the optional list of parameters, and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param outErr A reference to the `NSError` pointer to be updated with an auto released `NSError` object if an error if an error occurs. If `nil`, no `NSError` object will be returned. + + @param ... Optional parameters to bind to `?` placeholders in the SQL statement. These should be Objective-C objects (e.g. `NSString`, `NSNumber`, etc.), not fundamental C data types (e.g. `int`, `char *`, etc.). + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + @see [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) + */ + +- (BOOL)executeUpdate:(NSString*)sql withErrorAndBindings:(NSError**)outErr, ...; + +/** Execute single update statement + + @see executeUpdate:withErrorAndBindings: + + @warning **Deprecated**: Please use `` instead. + */ + +- (BOOL)update:(NSString*)sql withErrorAndBindings:(NSError**)outErr, ... __attribute__ ((deprecated)); + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html), [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) to bind values to `?` placeholders in the SQL with the optional list of parameters, and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param ... Optional parameters to bind to `?` placeholders in the SQL statement. These should be Objective-C objects (e.g. `NSString`, `NSNumber`, etc.), not fundamental C data types (e.g. `int`, `char *`, etc.). + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + @see [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) + + @note This technique supports the use of `?` placeholders in the SQL, automatically binding any supplied value parameters to those placeholders. This approach is more robust than techniques that entail using `stringWithFormat` to manually build SQL statements, which can be problematic if the values happened to include any characters that needed to be quoted. + + @note If you want to use this from Swift, please note that you must include `FMDatabaseVariadic.swift` in your project. Without that, you cannot use this method directly, and instead have to use methods such as ``. + */ + +- (BOOL)executeUpdate:(NSString*)sql, ...; + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html) and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. Unlike the other `executeUpdate` methods, this uses printf-style formatters (e.g. `%s`, `%d`, etc.) to build the SQL. Do not use `?` placeholders in the SQL if you use this method. + + @param format The SQL to be performed, with `printf`-style escape sequences. + + @param ... Optional parameters to bind to use in conjunction with the `printf`-style escape sequences in the SQL statement. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see executeUpdate: + @see lastError + @see lastErrorCode + @see lastErrorMessage + + @note This method does not technically perform a traditional printf-style replacement. What this method actually does is replace the printf-style percent sequences with a SQLite `?` placeholder, and then bind values to that placeholder. Thus the following command + + [db executeUpdateWithFormat:@"INSERT INTO test (name) VALUES (%@)", @"Gus"]; + + is actually replacing the `%@` with `?` placeholder, and then performing something equivalent to `` + + [db executeUpdate:@"INSERT INTO test (name) VALUES (?)", @"Gus"]; + + There are two reasons why this distinction is important. First, the printf-style escape sequences can only be used where it is permissible to use a SQLite `?` placeholder. You can use it only for values in SQL statements, but not for table names or column names or any other non-value context. This method also cannot be used in conjunction with `pragma` statements and the like. Second, note the lack of quotation marks in the SQL. The `VALUES` clause was _not_ `VALUES ('%@')` (like you might have to do if you built a SQL statement using `NSString` method `stringWithFormat`), but rather simply `VALUES (%@)`. + */ + +- (BOOL)executeUpdateWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2); + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html) and [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) binding any `?` placeholders in the SQL with the optional list of parameters. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param arguments A `NSArray` of objects to be used when binding values to the `?` placeholders in the SQL statement. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + */ + +- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments; + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html) and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. Unlike the other `executeUpdate` methods, this uses printf-style formatters (e.g. `%s`, `%d`, etc.) to build the SQL. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param arguments A `NSDictionary` of objects keyed by column names that will be used when binding values to the `?` placeholders in the SQL statement. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage +*/ + +- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments; + + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html) and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. Unlike the other `executeUpdate` methods, this uses printf-style formatters (e.g. `%s`, `%d`, etc.) to build the SQL. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param args A `va_list` of arguments. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + */ + +- (BOOL)executeUpdate:(NSString*)sql withVAList: (va_list)args; + +/** Execute multiple SQL statements + + This executes a series of SQL statements that are combined in a single string (e.g. the SQL generated by the `sqlite3` command line `.dump` command). This accepts no value parameters, but rather simply expects a single string with multiple SQL statements, each terminated with a semicolon. This uses `sqlite3_exec`. + + @param sql The SQL to be performed + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see executeStatements:withResultBlock: + @see [sqlite3_exec()](http://sqlite.org/c3ref/exec.html) + + */ + +- (BOOL)executeStatements:(NSString *)sql; + +/** Execute multiple SQL statements with callback handler + + This executes a series of SQL statements that are combined in a single string (e.g. the SQL generated by the `sqlite3` command line `.dump` command). This accepts no value parameters, but rather simply expects a single string with multiple SQL statements, each terminated with a semicolon. This uses `sqlite3_exec`. + + @param sql The SQL to be performed. + @param block A block that will be called for any result sets returned by any SQL statements. + Note, if you supply this block, it must return integer value, zero upon success (this would be a good opportunity to use SQLITE_OK), + non-zero value upon failure (which will stop the bulk execution of the SQL). If a statement returns values, the block will be called with the results from the query in NSDictionary *resultsDictionary. + This may be `nil` if you don't care to receive any results. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, + ``, or `` for diagnostic information regarding the failure. + + @see executeStatements: + @see [sqlite3_exec()](http://sqlite.org/c3ref/exec.html) + + */ + +- (BOOL)executeStatements:(NSString *)sql withResultBlock:(FMDBExecuteStatementsCallbackBlock)block; + +/** Last insert rowid + + Each entry in an SQLite table has a unique 64-bit signed integer key called the "rowid". The rowid is always available as an undeclared column named `ROWID`, `OID`, or `_ROWID_` as long as those names are not also used by explicitly declared columns. If the table has a column of type `INTEGER PRIMARY KEY` then that column is another alias for the rowid. + + This routine returns the rowid of the most recent successful `INSERT` into the database from the database connection in the first argument. As of SQLite version 3.7.7, this routines records the last insert rowid of both ordinary tables and virtual tables. If no successful `INSERT`s have ever occurred on that database connection, zero is returned. + + @return The rowid of the last inserted row. + + @see [sqlite3_last_insert_rowid()](http://sqlite.org/c3ref/last_insert_rowid.html) + + */ + +- (sqlite_int64)lastInsertRowId; + +/** The number of rows changed by prior SQL statement. + + This function returns the number of database rows that were changed or inserted or deleted by the most recently completed SQL statement on the database connection specified by the first parameter. Only changes that are directly specified by the INSERT, UPDATE, or DELETE statement are counted. + + @return The number of rows changed by prior SQL statement. + + @see [sqlite3_changes()](http://sqlite.org/c3ref/changes.html) + + */ + +- (int)changes; + + +///------------------------- +/// @name Retrieving results +///------------------------- + +/** Execute select statement + + Executing queries returns an `` object if successful, and `nil` upon failure. Like executing updates, there is a variant that accepts an `NSError **` parameter. Otherwise you should use the `` and `` methods to determine why a query failed. + + In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" (via `<[FMResultSet next]>`) from one record to the other. + + This method employs [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) for any optional value parameters. This properly escapes any characters that need escape sequences (e.g. quotation marks), which eliminates simple SQL errors as well as protects against SQL injection attacks. This method natively handles `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects. All other object types will be interpreted as text values using the object's `description` method. + + @param sql The SELECT statement to be performed, with optional `?` placeholders. + + @param ... Optional parameters to bind to `?` placeholders in the SQL statement. These should be Objective-C objects (e.g. `NSString`, `NSNumber`, etc.), not fundamental C data types (e.g. `int`, `char *`, etc.). + + @return A `` for the result set upon success; `nil` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see FMResultSet + @see [`FMResultSet next`](<[FMResultSet next]>) + @see [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) + */ + +- (FMResultSet *)executeQuery:(NSString*)sql, ...; + +/** Execute select statement + + Executing queries returns an `` object if successful, and `nil` upon failure. Like executing updates, there is a variant that accepts an `NSError **` parameter. Otherwise you should use the `` and `` methods to determine why a query failed. + + In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" (via `<[FMResultSet next]>`) from one record to the other. + + @param format The SQL to be performed, with `printf`-style escape sequences. + + @param ... Optional parameters to bind to use in conjunction with the `printf`-style escape sequences in the SQL statement. + + @return A `` for the result set upon success; `nil` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see executeQuery: + @see FMResultSet + @see [`FMResultSet next`](<[FMResultSet next]>) + + @note This method does not technically perform a traditional printf-style replacement. What this method actually does is replace the printf-style percent sequences with a SQLite `?` placeholder, and then bind values to that placeholder. Thus the following command + + [db executeQueryWithFormat:@"SELECT * FROM test WHERE name=%@", @"Gus"]; + + is actually replacing the `%@` with `?` placeholder, and then performing something equivalent to `` + + [db executeQuery:@"SELECT * FROM test WHERE name=?", @"Gus"]; + + There are two reasons why this distinction is important. First, the printf-style escape sequences can only be used where it is permissible to use a SQLite `?` placeholder. You can use it only for values in SQL statements, but not for table names or column names or any other non-value context. This method also cannot be used in conjunction with `pragma` statements and the like. Second, note the lack of quotation marks in the SQL. The `WHERE` clause was _not_ `WHERE name='%@'` (like you might have to do if you built a SQL statement using `NSString` method `stringWithFormat`), but rather simply `WHERE name=%@`. + + @note If you want to use this from Swift, please note that you must include `FMDatabaseVariadic.swift` in your project. Without that, you cannot use this method directly, and instead have to use methods such as ``. + + */ + +- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); + +/** Execute select statement + + Executing queries returns an `` object if successful, and `nil` upon failure. Like executing updates, there is a variant that accepts an `NSError **` parameter. Otherwise you should use the `` and `` methods to determine why a query failed. + + In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" (via `<[FMResultSet next]>`) from one record to the other. + + @param sql The SELECT statement to be performed, with optional `?` placeholders. + + @param arguments A `NSArray` of objects to be used when binding values to the `?` placeholders in the SQL statement. + + @return A `` for the result set upon success; `nil` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see FMResultSet + @see [`FMResultSet next`](<[FMResultSet next]>) + */ + +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments; + +/** Execute select statement + + Executing queries returns an `` object if successful, and `nil` upon failure. Like executing updates, there is a variant that accepts an `NSError **` parameter. Otherwise you should use the `` and `` methods to determine why a query failed. + + In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" (via `<[FMResultSet next]>`) from one record to the other. + + @param sql The SELECT statement to be performed, with optional `?` placeholders. + + @param arguments A `NSDictionary` of objects keyed by column names that will be used when binding values to the `?` placeholders in the SQL statement. + + @return A `` for the result set upon success; `nil` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see FMResultSet + @see [`FMResultSet next`](<[FMResultSet next]>) + */ + +- (FMResultSet *)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary *)arguments; + + +// Documentation forthcoming. +- (FMResultSet *)executeQuery:(NSString*)sql withVAList: (va_list)args; + +///------------------- +/// @name Transactions +///------------------- + +/** Begin a transaction + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see commit + @see rollback + @see beginDeferredTransaction + @see inTransaction + */ + +- (BOOL)beginTransaction; + +/** Begin a deferred transaction + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see commit + @see rollback + @see beginTransaction + @see inTransaction + */ + +- (BOOL)beginDeferredTransaction; + +/** Commit a transaction + + Commit a transaction that was initiated with either `` or with ``. + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see beginTransaction + @see beginDeferredTransaction + @see rollback + @see inTransaction + */ + +- (BOOL)commit; + +/** Rollback a transaction + + Rollback a transaction that was initiated with either `` or with ``. + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see beginTransaction + @see beginDeferredTransaction + @see commit + @see inTransaction + */ + +- (BOOL)rollback; + +/** Identify whether currently in a transaction or not + + @return `YES` if currently within transaction; `NO` if not. + + @see beginTransaction + @see beginDeferredTransaction + @see commit + @see rollback + */ + +- (BOOL)inTransaction; + + +///---------------------------------------- +/// @name Cached statements and result sets +///---------------------------------------- + +/** Clear cached statements */ + +- (void)clearCachedStatements; + +/** Close all open result sets */ + +- (void)closeOpenResultSets; + +/** Whether database has any open result sets + + @return `YES` if there are open result sets; `NO` if not. + */ + +- (BOOL)hasOpenResultSets; + +/** Return whether should cache statements or not + + @return `YES` if should cache statements; `NO` if not. + */ + +- (BOOL)shouldCacheStatements; + +/** Set whether should cache statements or not + + @param value `YES` if should cache statements; `NO` if not. + */ + +- (void)setShouldCacheStatements:(BOOL)value; + + +///------------------------- +/// @name Encryption methods +///------------------------- + +/** Set encryption key. + + @param key The key to be used. + + @return `YES` if success, `NO` on error. + + @see http://www.sqlite-encrypt.com/develop-guide.htm + + @warning You need to have purchased the sqlite encryption extensions for this method to work. + */ + +- (BOOL)setKey:(NSString*)key; + +/** Reset encryption key + + @param key The key to be used. + + @return `YES` if success, `NO` on error. + + @see http://www.sqlite-encrypt.com/develop-guide.htm + + @warning You need to have purchased the sqlite encryption extensions for this method to work. + */ + +- (BOOL)rekey:(NSString*)key; + +/** Set encryption key using `keyData`. + + @param keyData The `NSData` to be used. + + @return `YES` if success, `NO` on error. + + @see http://www.sqlite-encrypt.com/develop-guide.htm + + @warning You need to have purchased the sqlite encryption extensions for this method to work. + */ + +- (BOOL)setKeyWithData:(NSData *)keyData; + +/** Reset encryption key using `keyData`. + + @param keyData The `NSData` to be used. + + @return `YES` if success, `NO` on error. + + @see http://www.sqlite-encrypt.com/develop-guide.htm + + @warning You need to have purchased the sqlite encryption extensions for this method to work. + */ + +- (BOOL)rekeyWithData:(NSData *)keyData; + + +///------------------------------ +/// @name General inquiry methods +///------------------------------ + +/** The path of the database file + + @return path of database. + + */ + +- (NSString *)databasePath; + +/** The underlying SQLite handle + + @return The `sqlite3` pointer. + + */ + +- (sqlite3*)sqliteHandle; + + +///----------------------------- +/// @name Retrieving error codes +///----------------------------- + +/** Last error message + + Returns the English-language text that describes the most recent failed SQLite API call associated with a database connection. If a prior API call failed but the most recent API call succeeded, this return value is undefined. + + @return `NSString` of the last error message. + + @see [sqlite3_errmsg()](http://sqlite.org/c3ref/errcode.html) + @see lastErrorCode + @see lastError + + */ + +- (NSString*)lastErrorMessage; + +/** Last error code + + Returns the numeric result code or extended result code for the most recent failed SQLite API call associated with a database connection. If a prior API call failed but the most recent API call succeeded, this return value is undefined. + + @return Integer value of the last error code. + + @see [sqlite3_errcode()](http://sqlite.org/c3ref/errcode.html) + @see lastErrorMessage + @see lastError + + */ + +- (int)lastErrorCode; + +/** Had error + + @return `YES` if there was an error, `NO` if no error. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + + */ + +- (BOOL)hadError; + +/** Last error + + @return `NSError` representing the last error. + + @see lastErrorCode + @see lastErrorMessage + + */ + +- (NSError*)lastError; + + +// description forthcoming +- (void)setMaxBusyRetryTimeInterval:(NSTimeInterval)timeoutInSeconds; +- (NSTimeInterval)maxBusyRetryTimeInterval; + + +#if SQLITE_VERSION_NUMBER >= 3007000 + +///------------------ +/// @name Save points +///------------------ + +/** Start save point + + @param name Name of save point. + + @param outErr A `NSError` object to receive any error object (if any). + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see releaseSavePointWithName:error: + @see rollbackToSavePointWithName:error: + */ + +- (BOOL)startSavePointWithName:(NSString*)name error:(NSError**)outErr; + +/** Release save point + + @param name Name of save point. + + @param outErr A `NSError` object to receive any error object (if any). + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see startSavePointWithName:error: + @see rollbackToSavePointWithName:error: + + */ + +- (BOOL)releaseSavePointWithName:(NSString*)name error:(NSError**)outErr; + +/** Roll back to save point + + @param name Name of save point. + @param outErr A `NSError` object to receive any error object (if any). + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see startSavePointWithName:error: + @see releaseSavePointWithName:error: + + */ + +- (BOOL)rollbackToSavePointWithName:(NSString*)name error:(NSError**)outErr; + +/** Start save point + + @param block Block of code to perform from within save point. + + @return The NSError corresponding to the error, if any. If no error, returns `nil`. + + @see startSavePointWithName:error: + @see releaseSavePointWithName:error: + @see rollbackToSavePointWithName:error: + + */ + +- (NSError*)inSavePoint:(void (^)(BOOL *rollback))block; + +#endif + +///---------------------------- +/// @name SQLite library status +///---------------------------- + +/** Test to see if the library is threadsafe + + @return `NO` if and only if SQLite was compiled with mutexing code omitted due to the SQLITE_THREADSAFE compile-time option being set to 0. + + @see [sqlite3_threadsafe()](http://sqlite.org/c3ref/threadsafe.html) + */ + ++ (BOOL)isSQLiteThreadSafe; + +/** Run-time library version numbers + + @return The sqlite library version string. + + @see [sqlite3_libversion()](http://sqlite.org/c3ref/libversion.html) + */ + ++ (NSString*)sqliteLibVersion; + + ++ (NSString*)FMDBUserVersion; + ++ (SInt32)FMDBVersion; + + +///------------------------ +/// @name Make SQL function +///------------------------ + +/** Adds SQL functions or aggregates or to redefine the behavior of existing SQL functions or aggregates. + + For example: + + [queue inDatabase:^(FMDatabase *adb) { + + [adb executeUpdate:@"create table ftest (foo text)"]; + [adb executeUpdate:@"insert into ftest values ('hello')"]; + [adb executeUpdate:@"insert into ftest values ('hi')"]; + [adb executeUpdate:@"insert into ftest values ('not h!')"]; + [adb executeUpdate:@"insert into ftest values ('definitely not h!')"]; + + [adb makeFunctionNamed:@"StringStartsWithH" maximumArguments:1 withBlock:^(sqlite3_context *context, int aargc, sqlite3_value **aargv) { + if (sqlite3_value_type(aargv[0]) == SQLITE_TEXT) { + @autoreleasepool { + const char *c = (const char *)sqlite3_value_text(aargv[0]); + NSString *s = [NSString stringWithUTF8String:c]; + sqlite3_result_int(context, [s hasPrefix:@"h"]); + } + } + else { + NSLog(@"Unknown formart for StringStartsWithH (%d) %s:%d", sqlite3_value_type(aargv[0]), __FUNCTION__, __LINE__); + sqlite3_result_null(context); + } + }]; + + int rowCount = 0; + FMResultSet *ars = [adb executeQuery:@"select * from ftest where StringStartsWithH(foo)"]; + while ([ars next]) { + rowCount++; + NSLog(@"Does %@ start with 'h'?", [rs stringForColumnIndex:0]); + } + FMDBQuickCheck(rowCount == 2); + }]; + + @param name Name of function + + @param count Maximum number of parameters + + @param block The block of code for the function + + @see [sqlite3_create_function()](http://sqlite.org/c3ref/create_function.html) + */ + +- (void)makeFunctionNamed:(NSString*)name maximumArguments:(int)count withBlock:(void (^)(sqlite3_context *context, int argc, sqlite3_value **argv))block; + + +///--------------------- +/// @name Date formatter +///--------------------- + +/** Generate an `NSDateFormatter` that won't be broken by permutations of timezones or locales. + + Use this method to generate values to set the dateFormat property. + + Example: + + myDB.dateFormat = [FMDatabase storeableDateFormat:@"yyyy-MM-dd HH:mm:ss"]; + + @param format A valid NSDateFormatter format string. + + @return A `NSDateFormatter` that can be used for converting dates to strings and vice versa. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + + @warning Note that `NSDateFormatter` is not thread-safe, so the formatter generated by this method should be assigned to only one FMDB instance and should not be used for other purposes. + + */ + ++ (NSDateFormatter *)storeableDateFormat:(NSString *)format; + +/** Test whether the database has a date formatter assigned. + + @return `YES` if there is a date formatter; `NO` if not. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + */ + +- (BOOL)hasDateFormatter; + +/** Set to a date formatter to use string dates with sqlite instead of the default UNIX timestamps. + + @param format Set to nil to use UNIX timestamps. Defaults to nil. Should be set using a formatter generated using FMDatabase::storeableDateFormat. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + + @warning Note there is no direct getter for the `NSDateFormatter`, and you should not use the formatter you pass to FMDB for other purposes, as `NSDateFormatter` is not thread-safe. + */ + +- (void)setDateFormat:(NSDateFormatter *)format; + +/** Convert the supplied NSString to NSDate, using the current database formatter. + + @param s `NSString` to convert to `NSDate`. + + @return The `NSDate` object; or `nil` if no formatter is set. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + */ + +- (NSDate *)dateFromString:(NSString *)s; + +/** Convert the supplied NSDate to NSString, using the current database formatter. + + @param date `NSDate` of date to convert to `NSString`. + + @return The `NSString` representation of the date; `nil` if no formatter is set. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + */ + +- (NSString *)stringFromDate:(NSDate *)date; + +@end + + +/** Objective-C wrapper for `sqlite3_stmt` + + This is a wrapper for a SQLite `sqlite3_stmt`. Generally when using FMDB you will not need to interact directly with `FMStatement`, but rather with `` and `` only. + + ### See also + + - `` + - `` + - [`sqlite3_stmt`](http://www.sqlite.org/c3ref/stmt.html) + */ + +@interface FMStatement : NSObject { + sqlite3_stmt *_statement; + NSString *_query; + long _useCount; + BOOL _inUse; +} + +///----------------- +/// @name Properties +///----------------- + +/** Usage count */ + +@property (atomic, assign) long useCount; + +/** SQL statement */ + +@property (atomic, retain) NSString *query; + +/** SQLite sqlite3_stmt + + @see [`sqlite3_stmt`](http://www.sqlite.org/c3ref/stmt.html) + */ + +@property (atomic, assign) sqlite3_stmt *statement; + +/** Indication of whether the statement is in use */ + +@property (atomic, assign) BOOL inUse; + +///---------------------------- +/// @name Closing and Resetting +///---------------------------- + +/** Close statement */ + +- (void)close; + +/** Reset statement */ + +- (void)reset; + +@end + +#pragma clang diagnostic pop + diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.m b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.m new file mode 100644 index 0000000..725c855 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabase.m @@ -0,0 +1,1424 @@ +#import "FMDatabase.h" +#import "unistd.h" +#import + +@interface FMDatabase () + +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args; +- (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args; + +@end + +@implementation FMDatabase +@synthesize cachedStatements=_cachedStatements; +@synthesize logsErrors=_logsErrors; +@synthesize crashOnErrors=_crashOnErrors; +@synthesize checkedOut=_checkedOut; +@synthesize traceExecution=_traceExecution; + +#pragma mark FMDatabase instantiation and deallocation + ++ (instancetype)databaseWithPath:(NSString*)aPath { + return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath]); +} + +- (instancetype)init { + return [self initWithPath:nil]; +} + +- (instancetype)initWithPath:(NSString*)aPath { + + assert(sqlite3_threadsafe()); // whoa there big boy- gotta make sure sqlite it happy with what we're going to do. + + self = [super init]; + + if (self) { + _databasePath = [aPath copy]; + _openResultSets = [[NSMutableSet alloc] init]; + _db = nil; + _logsErrors = YES; + _crashOnErrors = NO; + _maxBusyRetryTimeInterval = 2; + } + + return self; +} + +- (void)finalize { + [self close]; + [super finalize]; +} + +- (void)dealloc { + [self close]; + FMDBRelease(_openResultSets); + FMDBRelease(_cachedStatements); + FMDBRelease(_dateFormat); + FMDBRelease(_databasePath); + FMDBRelease(_openFunctions); + +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + +- (NSString *)databasePath { + return _databasePath; +} + ++ (NSString*)FMDBUserVersion { + return @"2.5"; +} + +// returns 0x0240 for version 2.4. This makes it super easy to do things like: +// /* need to make sure to do X with FMDB version 2.4 or later */ +// if ([FMDatabase FMDBVersion] >= 0x0240) { … } + ++ (SInt32)FMDBVersion { + + // we go through these hoops so that we only have to change the version number in a single spot. + static dispatch_once_t once; + static SInt32 FMDBVersionVal = 0; + + dispatch_once(&once, ^{ + NSString *prodVersion = [self FMDBUserVersion]; + + if ([[prodVersion componentsSeparatedByString:@"."] count] < 3) { + prodVersion = [prodVersion stringByAppendingString:@".0"]; + } + + NSString *junk = [prodVersion stringByReplacingOccurrencesOfString:@"." withString:@""]; + + char *e = nil; + FMDBVersionVal = (int) strtoul([junk UTF8String], &e, 16); + + }); + + + return FMDBVersionVal; +} + +#pragma mark SQLite information + ++ (NSString*)sqliteLibVersion { + return [NSString stringWithFormat:@"%s", sqlite3_libversion()]; +} + ++ (BOOL)isSQLiteThreadSafe { + // make sure to read the sqlite headers on this guy! + return sqlite3_threadsafe() != 0; +} + +- (sqlite3*)sqliteHandle { + return _db; +} + +- (const char*)sqlitePath { + + if (!_databasePath) { + return ":memory:"; + } + + if ([_databasePath length] == 0) { + return ""; // this creates a temporary database (it's an sqlite thing). + } + + return [_databasePath fileSystemRepresentation]; + +} + +#pragma mark Open and close database + +- (BOOL)open { + if (_db) { + return YES; + } + + int err = sqlite3_open([self sqlitePath], &_db ); + if(err != SQLITE_OK) { + NSLog(@"error opening!: %d", err); + return NO; + } + + if (_maxBusyRetryTimeInterval > 0.0) { + // set the handler + [self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval]; + } + + + return YES; +} + +#if SQLITE_VERSION_NUMBER >= 3005000 +- (BOOL)openWithFlags:(int)flags { + if (_db) { + return YES; + } + + int err = sqlite3_open_v2([self sqlitePath], &_db, flags, NULL /* Name of VFS module to use */); + if(err != SQLITE_OK) { + NSLog(@"error opening!: %d", err); + return NO; + } + + if (_maxBusyRetryTimeInterval > 0.0) { + // set the handler + [self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval]; + } + + return YES; +} +#endif + + +- (BOOL)close { + + [self clearCachedStatements]; + [self closeOpenResultSets]; + + if (!_db) { + return YES; + } + + int rc; + BOOL retry; + BOOL triedFinalizingOpenStatements = NO; + + do { + retry = NO; + rc = sqlite3_close(_db); + if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) { + if (!triedFinalizingOpenStatements) { + triedFinalizingOpenStatements = YES; + sqlite3_stmt *pStmt; + while ((pStmt = sqlite3_next_stmt(_db, nil)) !=0) { + NSLog(@"Closing leaked statement"); + sqlite3_finalize(pStmt); + retry = YES; + } + } + } + else if (SQLITE_OK != rc) { + NSLog(@"error closing!: %d", rc); + } + } + while (retry); + + _db = nil; + return YES; +} + +#pragma mark Busy handler routines + +// NOTE: appledoc seems to choke on this function for some reason; +// so when generating documentation, you might want to ignore the +// .m files so that it only documents the public interfaces outlined +// in the .h files. +// +// This is a known appledoc bug that it has problems with C functions +// within a class implementation, but for some reason, only this +// C function causes problems; the rest don't. Anyway, ignoring the .m +// files with appledoc will prevent this problem from occurring. + +static int FMDBDatabaseBusyHandler(void *f, int count) { + FMDatabase *self = (__bridge FMDatabase*)f; + + if (count == 0) { + self->_startBusyRetryTime = [NSDate timeIntervalSinceReferenceDate]; + return 1; + } + + NSTimeInterval delta = [NSDate timeIntervalSinceReferenceDate] - (self->_startBusyRetryTime); + + if (delta < [self maxBusyRetryTimeInterval]) { + int requestedSleepInMillseconds = arc4random_uniform(50) + 50; + int actualSleepInMilliseconds = sqlite3_sleep(requestedSleepInMillseconds); + if (actualSleepInMilliseconds != requestedSleepInMillseconds) { + NSLog(@"WARNING: Requested sleep of %i milliseconds, but SQLite returned %i. Maybe SQLite wasn't built with HAVE_USLEEP=1?", requestedSleepInMillseconds, actualSleepInMilliseconds); + } + return 1; + } + + return 0; +} + +- (void)setMaxBusyRetryTimeInterval:(NSTimeInterval)timeout { + + _maxBusyRetryTimeInterval = timeout; + + if (!_db) { + return; + } + + if (timeout > 0) { + sqlite3_busy_handler(_db, &FMDBDatabaseBusyHandler, (__bridge void *)(self)); + } + else { + // turn it off otherwise + sqlite3_busy_handler(_db, nil, nil); + } +} + +- (NSTimeInterval)maxBusyRetryTimeInterval { + return _maxBusyRetryTimeInterval; +} + + +// we no longer make busyRetryTimeout public +// but for folks who don't bother noticing that the interface to FMDatabase changed, +// we'll still implement the method so they don't get suprise crashes +- (int)busyRetryTimeout { + NSLog(@"%s:%d", __FUNCTION__, __LINE__); + NSLog(@"FMDB: busyRetryTimeout no longer works, please use maxBusyRetryTimeInterval"); + return -1; +} + +- (void)setBusyRetryTimeout:(int)i { + NSLog(@"%s:%d", __FUNCTION__, __LINE__); + NSLog(@"FMDB: setBusyRetryTimeout does nothing, please use setMaxBusyRetryTimeInterval:"); +} + +#pragma mark Result set functions + +- (BOOL)hasOpenResultSets { + return [_openResultSets count] > 0; +} + +- (void)closeOpenResultSets { + + //Copy the set so we don't get mutation errors + NSSet *openSetCopy = FMDBReturnAutoreleased([_openResultSets copy]); + for (NSValue *rsInWrappedInATastyValueMeal in openSetCopy) { + FMResultSet *rs = (FMResultSet *)[rsInWrappedInATastyValueMeal pointerValue]; + + [rs setParentDB:nil]; + [rs close]; + + [_openResultSets removeObject:rsInWrappedInATastyValueMeal]; + } +} + +- (void)resultSetDidClose:(FMResultSet *)resultSet { + NSValue *setValue = [NSValue valueWithNonretainedObject:resultSet]; + + [_openResultSets removeObject:setValue]; +} + +#pragma mark Cached statements + +- (void)clearCachedStatements { + + for (NSMutableSet *statements in [_cachedStatements objectEnumerator]) { + [statements makeObjectsPerformSelector:@selector(close)]; + } + + [_cachedStatements removeAllObjects]; +} + +- (FMStatement*)cachedStatementForQuery:(NSString*)query { + + NSMutableSet* statements = [_cachedStatements objectForKey:query]; + + return [[statements objectsPassingTest:^BOOL(FMStatement* statement, BOOL *stop) { + + *stop = ![statement inUse]; + return *stop; + + }] anyObject]; +} + + +- (void)setCachedStatement:(FMStatement*)statement forQuery:(NSString*)query { + + query = [query copy]; // in case we got handed in a mutable string... + [statement setQuery:query]; + + NSMutableSet* statements = [_cachedStatements objectForKey:query]; + if (!statements) { + statements = [NSMutableSet set]; + } + + [statements addObject:statement]; + + [_cachedStatements setObject:statements forKey:query]; + + FMDBRelease(query); +} + +#pragma mark Key routines + +- (BOOL)rekey:(NSString*)key { + NSData *keyData = [NSData dataWithBytes:(void *)[key UTF8String] length:(NSUInteger)strlen([key UTF8String])]; + + return [self rekeyWithData:keyData]; +} + +- (BOOL)rekeyWithData:(NSData *)keyData { +#ifdef SQLITE_HAS_CODEC + if (!keyData) { + return NO; + } + + int rc = sqlite3_rekey(_db, [keyData bytes], (int)[keyData length]); + + if (rc != SQLITE_OK) { + NSLog(@"error on rekey: %d", rc); + NSLog(@"%@", [self lastErrorMessage]); + } + + return (rc == SQLITE_OK); +#else + return NO; +#endif +} + +- (BOOL)setKey:(NSString*)key { + NSData *keyData = [NSData dataWithBytes:[key UTF8String] length:(NSUInteger)strlen([key UTF8String])]; + + return [self setKeyWithData:keyData]; +} + +- (BOOL)setKeyWithData:(NSData *)keyData { +#ifdef SQLITE_HAS_CODEC + if (!keyData) { + return NO; + } + + int rc = sqlite3_key(_db, [keyData bytes], (int)[keyData length]); + + return (rc == SQLITE_OK); +#else + return NO; +#endif +} + +#pragma mark Date routines + ++ (NSDateFormatter *)storeableDateFormat:(NSString *)format { + + NSDateFormatter *result = FMDBReturnAutoreleased([[NSDateFormatter alloc] init]); + result.dateFormat = format; + result.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; + result.locale = FMDBReturnAutoreleased([[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]); + return result; +} + + +- (BOOL)hasDateFormatter { + return _dateFormat != nil; +} + +- (void)setDateFormat:(NSDateFormatter *)format { + FMDBAutorelease(_dateFormat); + _dateFormat = FMDBReturnRetained(format); +} + +- (NSDate *)dateFromString:(NSString *)s { + return [_dateFormat dateFromString:s]; +} + +- (NSString *)stringFromDate:(NSDate *)date { + return [_dateFormat stringFromDate:date]; +} + +#pragma mark State of database + +- (BOOL)goodConnection { + + if (!_db) { + return NO; + } + + FMResultSet *rs = [self executeQuery:@"select name from sqlite_master where type='table'"]; + + if (rs) { + [rs close]; + return YES; + } + + return NO; +} + +- (void)warnInUse { + NSLog(@"The FMDatabase %@ is currently in use.", self); + +#ifndef NS_BLOCK_ASSERTIONS + if (_crashOnErrors) { + NSAssert(false, @"The FMDatabase %@ is currently in use.", self); + abort(); + } +#endif +} + +- (BOOL)databaseExists { + + if (!_db) { + + NSLog(@"The FMDatabase %@ is not open.", self); + + #ifndef NS_BLOCK_ASSERTIONS + if (_crashOnErrors) { + NSAssert(false, @"The FMDatabase %@ is not open.", self); + abort(); + } + #endif + + return NO; + } + + return YES; +} + +#pragma mark Error routines + +- (NSString*)lastErrorMessage { + return [NSString stringWithUTF8String:sqlite3_errmsg(_db)]; +} + +- (BOOL)hadError { + int lastErrCode = [self lastErrorCode]; + + return (lastErrCode > SQLITE_OK && lastErrCode < SQLITE_ROW); +} + +- (int)lastErrorCode { + return sqlite3_errcode(_db); +} + +- (NSError*)errorWithMessage:(NSString*)message { + NSDictionary* errorMessage = [NSDictionary dictionaryWithObject:message forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:@"FMDatabase" code:sqlite3_errcode(_db) userInfo:errorMessage]; +} + +- (NSError*)lastError { + return [self errorWithMessage:[self lastErrorMessage]]; +} + +#pragma mark Update information routines + +- (sqlite_int64)lastInsertRowId { + + if (_isExecutingStatement) { + [self warnInUse]; + return NO; + } + + _isExecutingStatement = YES; + + sqlite_int64 ret = sqlite3_last_insert_rowid(_db); + + _isExecutingStatement = NO; + + return ret; +} + +- (int)changes { + if (_isExecutingStatement) { + [self warnInUse]; + return 0; + } + + _isExecutingStatement = YES; + + int ret = sqlite3_changes(_db); + + _isExecutingStatement = NO; + + return ret; +} + +#pragma mark SQL manipulation + +- (void)bindObject:(id)obj toColumn:(int)idx inStatement:(sqlite3_stmt*)pStmt { + + if ((!obj) || ((NSNull *)obj == [NSNull null])) { + sqlite3_bind_null(pStmt, idx); + } + + // FIXME - someday check the return codes on these binds. + else if ([obj isKindOfClass:[NSData class]]) { + const void *bytes = [obj bytes]; + if (!bytes) { + // it's an empty NSData object, aka [NSData data]. + // Don't pass a NULL pointer, or sqlite will bind a SQL null instead of a blob. + bytes = ""; + } + sqlite3_bind_blob(pStmt, idx, bytes, (int)[obj length], SQLITE_STATIC); + } + else if ([obj isKindOfClass:[NSDate class]]) { + if (self.hasDateFormatter) + sqlite3_bind_text(pStmt, idx, [[self stringFromDate:obj] UTF8String], -1, SQLITE_STATIC); + else + sqlite3_bind_double(pStmt, idx, [obj timeIntervalSince1970]); + } + else if ([obj isKindOfClass:[NSNumber class]]) { + + if (strcmp([obj objCType], @encode(char)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj charValue]); + } + else if (strcmp([obj objCType], @encode(unsigned char)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj unsignedCharValue]); + } + else if (strcmp([obj objCType], @encode(short)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj shortValue]); + } + else if (strcmp([obj objCType], @encode(unsigned short)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj unsignedShortValue]); + } + else if (strcmp([obj objCType], @encode(int)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj intValue]); + } + else if (strcmp([obj objCType], @encode(unsigned int)) == 0) { + sqlite3_bind_int64(pStmt, idx, (long long)[obj unsignedIntValue]); + } + else if (strcmp([obj objCType], @encode(long)) == 0) { + sqlite3_bind_int64(pStmt, idx, [obj longValue]); + } + else if (strcmp([obj objCType], @encode(unsigned long)) == 0) { + sqlite3_bind_int64(pStmt, idx, (long long)[obj unsignedLongValue]); + } + else if (strcmp([obj objCType], @encode(long long)) == 0) { + sqlite3_bind_int64(pStmt, idx, [obj longLongValue]); + } + else if (strcmp([obj objCType], @encode(unsigned long long)) == 0) { + sqlite3_bind_int64(pStmt, idx, (long long)[obj unsignedLongLongValue]); + } + else if (strcmp([obj objCType], @encode(float)) == 0) { + sqlite3_bind_double(pStmt, idx, [obj floatValue]); + } + else if (strcmp([obj objCType], @encode(double)) == 0) { + sqlite3_bind_double(pStmt, idx, [obj doubleValue]); + } + else if (strcmp([obj objCType], @encode(BOOL)) == 0) { + sqlite3_bind_int(pStmt, idx, ([obj boolValue] ? 1 : 0)); + } + else { + sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC); + } + } + else { + sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC); + } +} + +- (void)extractSQL:(NSString *)sql argumentsList:(va_list)args intoString:(NSMutableString *)cleanedSQL arguments:(NSMutableArray *)arguments { + + NSUInteger length = [sql length]; + unichar last = '\0'; + for (NSUInteger i = 0; i < length; ++i) { + id arg = nil; + unichar current = [sql characterAtIndex:i]; + unichar add = current; + if (last == '%') { + switch (current) { + case '@': + arg = va_arg(args, id); + break; + case 'c': + // warning: second argument to 'va_arg' is of promotable type 'char'; this va_arg has undefined behavior because arguments will be promoted to 'int' + arg = [NSString stringWithFormat:@"%c", va_arg(args, int)]; + break; + case 's': + arg = [NSString stringWithUTF8String:va_arg(args, char*)]; + break; + case 'd': + case 'D': + case 'i': + arg = [NSNumber numberWithInt:va_arg(args, int)]; + break; + case 'u': + case 'U': + arg = [NSNumber numberWithUnsignedInt:va_arg(args, unsigned int)]; + break; + case 'h': + i++; + if (i < length && [sql characterAtIndex:i] == 'i') { + // warning: second argument to 'va_arg' is of promotable type 'short'; this va_arg has undefined behavior because arguments will be promoted to 'int' + arg = [NSNumber numberWithShort:(short)(va_arg(args, int))]; + } + else if (i < length && [sql characterAtIndex:i] == 'u') { + // warning: second argument to 'va_arg' is of promotable type 'unsigned short'; this va_arg has undefined behavior because arguments will be promoted to 'int' + arg = [NSNumber numberWithUnsignedShort:(unsigned short)(va_arg(args, uint))]; + } + else { + i--; + } + break; + case 'q': + i++; + if (i < length && [sql characterAtIndex:i] == 'i') { + arg = [NSNumber numberWithLongLong:va_arg(args, long long)]; + } + else if (i < length && [sql characterAtIndex:i] == 'u') { + arg = [NSNumber numberWithUnsignedLongLong:va_arg(args, unsigned long long)]; + } + else { + i--; + } + break; + case 'f': + arg = [NSNumber numberWithDouble:va_arg(args, double)]; + break; + case 'g': + // warning: second argument to 'va_arg' is of promotable type 'float'; this va_arg has undefined behavior because arguments will be promoted to 'double' + arg = [NSNumber numberWithFloat:(float)(va_arg(args, double))]; + break; + case 'l': + i++; + if (i < length) { + unichar next = [sql characterAtIndex:i]; + if (next == 'l') { + i++; + if (i < length && [sql characterAtIndex:i] == 'd') { + //%lld + arg = [NSNumber numberWithLongLong:va_arg(args, long long)]; + } + else if (i < length && [sql characterAtIndex:i] == 'u') { + //%llu + arg = [NSNumber numberWithUnsignedLongLong:va_arg(args, unsigned long long)]; + } + else { + i--; + } + } + else if (next == 'd') { + //%ld + arg = [NSNumber numberWithLong:va_arg(args, long)]; + } + else if (next == 'u') { + //%lu + arg = [NSNumber numberWithUnsignedLong:va_arg(args, unsigned long)]; + } + else { + i--; + } + } + else { + i--; + } + break; + default: + // something else that we can't interpret. just pass it on through like normal + break; + } + } + else if (current == '%') { + // percent sign; skip this character + add = '\0'; + } + + if (arg != nil) { + [cleanedSQL appendString:@"?"]; + [arguments addObject:arg]; + } + else if (add == (unichar)'@' && last == (unichar) '%') { + [cleanedSQL appendFormat:@"NULL"]; + } + else if (add != '\0') { + [cleanedSQL appendFormat:@"%C", add]; + } + last = current; + } +} + +#pragma mark Execute queries + +- (FMResultSet *)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary *)arguments { + return [self executeQuery:sql withArgumentsInArray:nil orDictionary:arguments orVAList:nil]; +} + +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args { + + if (![self databaseExists]) { + return 0x00; + } + + if (_isExecutingStatement) { + [self warnInUse]; + return 0x00; + } + + _isExecutingStatement = YES; + + int rc = 0x00; + sqlite3_stmt *pStmt = 0x00; + FMStatement *statement = 0x00; + FMResultSet *rs = 0x00; + + if (_traceExecution && sql) { + NSLog(@"%@ executeQuery: %@", self, sql); + } + + if (_shouldCacheStatements) { + statement = [self cachedStatementForQuery:sql]; + pStmt = statement ? [statement statement] : 0x00; + [statement reset]; + } + + if (!pStmt) { + + rc = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pStmt, 0); + + if (SQLITE_OK != rc) { + if (_logsErrors) { + NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + NSLog(@"DB Query: %@", sql); + NSLog(@"DB Path: %@", _databasePath); + } + + if (_crashOnErrors) { + NSAssert(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + abort(); + } + + sqlite3_finalize(pStmt); + _isExecutingStatement = NO; + return nil; + } + } + + id obj; + int idx = 0; + int queryCount = sqlite3_bind_parameter_count(pStmt); // pointed out by Dominic Yu (thanks!) + + // If dictionaryArgs is passed in, that means we are using sqlite's named parameter support + if (dictionaryArgs) { + + for (NSString *dictionaryKey in [dictionaryArgs allKeys]) { + + // Prefix the key with a colon. + NSString *parameterName = [[NSString alloc] initWithFormat:@":%@", dictionaryKey]; + + if (_traceExecution) { + NSLog(@"%@ = %@", parameterName, [dictionaryArgs objectForKey:dictionaryKey]); + } + + // Get the index for the parameter name. + int namedIdx = sqlite3_bind_parameter_index(pStmt, [parameterName UTF8String]); + + FMDBRelease(parameterName); + + if (namedIdx > 0) { + // Standard binding from here. + [self bindObject:[dictionaryArgs objectForKey:dictionaryKey] toColumn:namedIdx inStatement:pStmt]; + // increment the binding count, so our check below works out + idx++; + } + else { + NSLog(@"Could not find index for %@", dictionaryKey); + } + } + } + else { + + while (idx < queryCount) { + + if (arrayArgs && idx < (int)[arrayArgs count]) { + obj = [arrayArgs objectAtIndex:(NSUInteger)idx]; + } + else if (args) { + obj = va_arg(args, id); + } + else { + //We ran out of arguments + break; + } + + if (_traceExecution) { + if ([obj isKindOfClass:[NSData class]]) { + NSLog(@"data: %ld bytes", (unsigned long)[(NSData*)obj length]); + } + else { + NSLog(@"obj: %@", obj); + } + } + + idx++; + + [self bindObject:obj toColumn:idx inStatement:pStmt]; + } + } + + if (idx != queryCount) { + NSLog(@"Error: the bind count is not correct for the # of variables (executeQuery)"); + sqlite3_finalize(pStmt); + _isExecutingStatement = NO; + return nil; + } + + FMDBRetain(statement); // to balance the release below + + if (!statement) { + statement = [[FMStatement alloc] init]; + [statement setStatement:pStmt]; + + if (_shouldCacheStatements && sql) { + [self setCachedStatement:statement forQuery:sql]; + } + } + + // the statement gets closed in rs's dealloc or [rs close]; + rs = [FMResultSet resultSetWithStatement:statement usingParentDatabase:self]; + [rs setQuery:sql]; + + NSValue *openResultSet = [NSValue valueWithNonretainedObject:rs]; + [_openResultSets addObject:openResultSet]; + + [statement setUseCount:[statement useCount] + 1]; + + FMDBRelease(statement); + + _isExecutingStatement = NO; + + return rs; +} + +- (FMResultSet *)executeQuery:(NSString*)sql, ... { + va_list args; + va_start(args, sql); + + id result = [self executeQuery:sql withArgumentsInArray:nil orDictionary:nil orVAList:args]; + + va_end(args); + return result; +} + +- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ... { + va_list args; + va_start(args, format); + + NSMutableString *sql = [NSMutableString stringWithCapacity:[format length]]; + NSMutableArray *arguments = [NSMutableArray array]; + [self extractSQL:format argumentsList:args intoString:sql arguments:arguments]; + + va_end(args); + + return [self executeQuery:sql withArgumentsInArray:arguments]; +} + +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments { + return [self executeQuery:sql withArgumentsInArray:arguments orDictionary:nil orVAList:nil]; +} + +- (FMResultSet *)executeQuery:(NSString*)sql withVAList:(va_list)args { + return [self executeQuery:sql withArgumentsInArray:nil orDictionary:nil orVAList:args]; +} + +#pragma mark Execute updates + +- (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args { + + if (![self databaseExists]) { + return NO; + } + + if (_isExecutingStatement) { + [self warnInUse]; + return NO; + } + + _isExecutingStatement = YES; + + int rc = 0x00; + sqlite3_stmt *pStmt = 0x00; + FMStatement *cachedStmt = 0x00; + + if (_traceExecution && sql) { + NSLog(@"%@ executeUpdate: %@", self, sql); + } + + if (_shouldCacheStatements) { + cachedStmt = [self cachedStatementForQuery:sql]; + pStmt = cachedStmt ? [cachedStmt statement] : 0x00; + [cachedStmt reset]; + } + + if (!pStmt) { + rc = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pStmt, 0); + + if (SQLITE_OK != rc) { + if (_logsErrors) { + NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + NSLog(@"DB Query: %@", sql); + NSLog(@"DB Path: %@", _databasePath); + } + + if (_crashOnErrors) { + NSAssert(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + abort(); + } + + sqlite3_finalize(pStmt); + + if (outErr) { + *outErr = [self errorWithMessage:[NSString stringWithUTF8String:sqlite3_errmsg(_db)]]; + } + + _isExecutingStatement = NO; + return NO; + } + } + + id obj; + int idx = 0; + int queryCount = sqlite3_bind_parameter_count(pStmt); + + // If dictionaryArgs is passed in, that means we are using sqlite's named parameter support + if (dictionaryArgs) { + + for (NSString *dictionaryKey in [dictionaryArgs allKeys]) { + + // Prefix the key with a colon. + NSString *parameterName = [[NSString alloc] initWithFormat:@":%@", dictionaryKey]; + + if (_traceExecution) { + NSLog(@"%@ = %@", parameterName, [dictionaryArgs objectForKey:dictionaryKey]); + } + // Get the index for the parameter name. + int namedIdx = sqlite3_bind_parameter_index(pStmt, [parameterName UTF8String]); + + FMDBRelease(parameterName); + + if (namedIdx > 0) { + // Standard binding from here. + [self bindObject:[dictionaryArgs objectForKey:dictionaryKey] toColumn:namedIdx inStatement:pStmt]; + + // increment the binding count, so our check below works out + idx++; + } + else { + NSLog(@"Could not find index for %@", dictionaryKey); + } + } + } + else { + + while (idx < queryCount) { + + if (arrayArgs && idx < (int)[arrayArgs count]) { + obj = [arrayArgs objectAtIndex:(NSUInteger)idx]; + } + else if (args) { + obj = va_arg(args, id); + } + else { + //We ran out of arguments + break; + } + + if (_traceExecution) { + if ([obj isKindOfClass:[NSData class]]) { + NSLog(@"data: %ld bytes", (unsigned long)[(NSData*)obj length]); + } + else { + NSLog(@"obj: %@", obj); + } + } + + idx++; + + [self bindObject:obj toColumn:idx inStatement:pStmt]; + } + } + + + if (idx != queryCount) { + NSLog(@"Error: the bind count (%d) is not correct for the # of variables in the query (%d) (%@) (executeUpdate)", idx, queryCount, sql); + sqlite3_finalize(pStmt); + _isExecutingStatement = NO; + return NO; + } + + /* Call sqlite3_step() to run the virtual machine. Since the SQL being + ** executed is not a SELECT statement, we assume no data will be returned. + */ + + rc = sqlite3_step(pStmt); + + if (SQLITE_DONE == rc) { + // all is well, let's return. + } + else if (SQLITE_ERROR == rc) { + if (_logsErrors) { + NSLog(@"Error calling sqlite3_step (%d: %s) SQLITE_ERROR", rc, sqlite3_errmsg(_db)); + NSLog(@"DB Query: %@", sql); + } + } + else if (SQLITE_MISUSE == rc) { + // uh oh. + if (_logsErrors) { + NSLog(@"Error calling sqlite3_step (%d: %s) SQLITE_MISUSE", rc, sqlite3_errmsg(_db)); + NSLog(@"DB Query: %@", sql); + } + } + else { + // wtf? + if (_logsErrors) { + NSLog(@"Unknown error calling sqlite3_step (%d: %s) eu", rc, sqlite3_errmsg(_db)); + NSLog(@"DB Query: %@", sql); + } + } + + if (rc == SQLITE_ROW) { + NSAssert(NO, @"A executeUpdate is being called with a query string '%@'", sql); + } + + if (_shouldCacheStatements && !cachedStmt) { + cachedStmt = [[FMStatement alloc] init]; + + [cachedStmt setStatement:pStmt]; + + [self setCachedStatement:cachedStmt forQuery:sql]; + + FMDBRelease(cachedStmt); + } + + int closeErrorCode; + + if (cachedStmt) { + [cachedStmt setUseCount:[cachedStmt useCount] + 1]; + closeErrorCode = sqlite3_reset(pStmt); + } + else { + /* Finalize the virtual machine. This releases all memory and other + ** resources allocated by the sqlite3_prepare() call above. + */ + closeErrorCode = sqlite3_finalize(pStmt); + } + + if (closeErrorCode != SQLITE_OK) { + if (_logsErrors) { + NSLog(@"Unknown error finalizing or resetting statement (%d: %s)", closeErrorCode, sqlite3_errmsg(_db)); + NSLog(@"DB Query: %@", sql); + } + } + + _isExecutingStatement = NO; + return (rc == SQLITE_DONE || rc == SQLITE_OK); +} + + +- (BOOL)executeUpdate:(NSString*)sql, ... { + va_list args; + va_start(args, sql); + + BOOL result = [self executeUpdate:sql error:nil withArgumentsInArray:nil orDictionary:nil orVAList:args]; + + va_end(args); + return result; +} + +- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments { + return [self executeUpdate:sql error:nil withArgumentsInArray:arguments orDictionary:nil orVAList:nil]; +} + +- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments { + return [self executeUpdate:sql error:nil withArgumentsInArray:nil orDictionary:arguments orVAList:nil]; +} + +- (BOOL)executeUpdate:(NSString*)sql withVAList:(va_list)args { + return [self executeUpdate:sql error:nil withArgumentsInArray:nil orDictionary:nil orVAList:args]; +} + +- (BOOL)executeUpdateWithFormat:(NSString*)format, ... { + va_list args; + va_start(args, format); + + NSMutableString *sql = [NSMutableString stringWithCapacity:[format length]]; + NSMutableArray *arguments = [NSMutableArray array]; + + [self extractSQL:format argumentsList:args intoString:sql arguments:arguments]; + + va_end(args); + + return [self executeUpdate:sql withArgumentsInArray:arguments]; +} + + +int FMDBExecuteBulkSQLCallback(void *theBlockAsVoid, int columns, char **values, char **names); // shhh clang. +int FMDBExecuteBulkSQLCallback(void *theBlockAsVoid, int columns, char **values, char **names) { + + if (!theBlockAsVoid) { + return SQLITE_OK; + } + + int (^execCallbackBlock)(NSDictionary *resultsDictionary) = (__bridge int (^)(NSDictionary *__strong))(theBlockAsVoid); + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:(NSUInteger)columns]; + + for (NSInteger i = 0; i < columns; i++) { + NSString *key = [NSString stringWithUTF8String:names[i]]; + id value = values[i] ? [NSString stringWithUTF8String:values[i]] : [NSNull null]; + [dictionary setObject:value forKey:key]; + } + + return execCallbackBlock(dictionary); +} + +- (BOOL)executeStatements:(NSString *)sql { + return [self executeStatements:sql withResultBlock:nil]; +} + +- (BOOL)executeStatements:(NSString *)sql withResultBlock:(FMDBExecuteStatementsCallbackBlock)block { + + int rc; + char *errmsg = nil; + + rc = sqlite3_exec([self sqliteHandle], [sql UTF8String], block ? FMDBExecuteBulkSQLCallback : nil, (__bridge void *)(block), &errmsg); + + if (errmsg && [self logsErrors]) { + NSLog(@"Error inserting batch: %s", errmsg); + sqlite3_free(errmsg); + } + + return (rc == SQLITE_OK); +} + +- (BOOL)executeUpdate:(NSString*)sql withErrorAndBindings:(NSError**)outErr, ... { + + va_list args; + va_start(args, outErr); + + BOOL result = [self executeUpdate:sql error:outErr withArgumentsInArray:nil orDictionary:nil orVAList:args]; + + va_end(args); + return result; +} + + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" +- (BOOL)update:(NSString*)sql withErrorAndBindings:(NSError**)outErr, ... { + va_list args; + va_start(args, outErr); + + BOOL result = [self executeUpdate:sql error:outErr withArgumentsInArray:nil orDictionary:nil orVAList:args]; + + va_end(args); + return result; +} + +#pragma clang diagnostic pop + +#pragma mark Transactions + +- (BOOL)rollback { + BOOL b = [self executeUpdate:@"rollback transaction"]; + + if (b) { + _inTransaction = NO; + } + + return b; +} + +- (BOOL)commit { + BOOL b = [self executeUpdate:@"commit transaction"]; + + if (b) { + _inTransaction = NO; + } + + return b; +} + +- (BOOL)beginDeferredTransaction { + + BOOL b = [self executeUpdate:@"begin deferred transaction"]; + if (b) { + _inTransaction = YES; + } + + return b; +} + +- (BOOL)beginTransaction { + + BOOL b = [self executeUpdate:@"begin exclusive transaction"]; + if (b) { + _inTransaction = YES; + } + + return b; +} + +- (BOOL)inTransaction { + return _inTransaction; +} + +#if SQLITE_VERSION_NUMBER >= 3007000 + +static NSString *FMDBEscapeSavePointName(NSString *savepointName) { + return [savepointName stringByReplacingOccurrencesOfString:@"'" withString:@"''"]; +} + +- (BOOL)startSavePointWithName:(NSString*)name error:(NSError**)outErr { + + NSParameterAssert(name); + + NSString *sql = [NSString stringWithFormat:@"savepoint '%@';", FMDBEscapeSavePointName(name)]; + + if (![self executeUpdate:sql]) { + + if (outErr) { + *outErr = [self lastError]; + } + + return NO; + } + + return YES; +} + +- (BOOL)releaseSavePointWithName:(NSString*)name error:(NSError**)outErr { + + NSParameterAssert(name); + + NSString *sql = [NSString stringWithFormat:@"release savepoint '%@';", FMDBEscapeSavePointName(name)]; + BOOL worked = [self executeUpdate:sql]; + + if (!worked && outErr) { + *outErr = [self lastError]; + } + + return worked; +} + +- (BOOL)rollbackToSavePointWithName:(NSString*)name error:(NSError**)outErr { + + NSParameterAssert(name); + + NSString *sql = [NSString stringWithFormat:@"rollback transaction to savepoint '%@';", FMDBEscapeSavePointName(name)]; + BOOL worked = [self executeUpdate:sql]; + + if (!worked && outErr) { + *outErr = [self lastError]; + } + + return worked; +} + +- (NSError*)inSavePoint:(void (^)(BOOL *rollback))block { + static unsigned long savePointIdx = 0; + + NSString *name = [NSString stringWithFormat:@"dbSavePoint%ld", savePointIdx++]; + + BOOL shouldRollback = NO; + + NSError *err = 0x00; + + if (![self startSavePointWithName:name error:&err]) { + return err; + } + + block(&shouldRollback); + + if (shouldRollback) { + // We need to rollback and release this savepoint to remove it + [self rollbackToSavePointWithName:name error:&err]; + } + [self releaseSavePointWithName:name error:&err]; + + return err; +} + +#endif + +#pragma mark Cache statements + +- (BOOL)shouldCacheStatements { + return _shouldCacheStatements; +} + +- (void)setShouldCacheStatements:(BOOL)value { + + _shouldCacheStatements = value; + + if (_shouldCacheStatements && !_cachedStatements) { + [self setCachedStatements:[NSMutableDictionary dictionary]]; + } + + if (!_shouldCacheStatements) { + [self setCachedStatements:nil]; + } +} + +#pragma mark Callback function + +void FMDBBlockSQLiteCallBackFunction(sqlite3_context *context, int argc, sqlite3_value **argv); // -Wmissing-prototypes +void FMDBBlockSQLiteCallBackFunction(sqlite3_context *context, int argc, sqlite3_value **argv) { +#if ! __has_feature(objc_arc) + void (^block)(sqlite3_context *context, int argc, sqlite3_value **argv) = (id)sqlite3_user_data(context); +#else + void (^block)(sqlite3_context *context, int argc, sqlite3_value **argv) = (__bridge id)sqlite3_user_data(context); +#endif + block(context, argc, argv); +} + + +- (void)makeFunctionNamed:(NSString*)name maximumArguments:(int)count withBlock:(void (^)(sqlite3_context *context, int argc, sqlite3_value **argv))block { + + if (!_openFunctions) { + _openFunctions = [NSMutableSet new]; + } + + id b = FMDBReturnAutoreleased([block copy]); + + [_openFunctions addObject:b]; + + /* I tried adding custom functions to release the block when the connection is destroyed- but they seemed to never be called, so we use _openFunctions to store the values instead. */ +#if ! __has_feature(objc_arc) + sqlite3_create_function([self sqliteHandle], [name UTF8String], count, SQLITE_UTF8, (void*)b, &FMDBBlockSQLiteCallBackFunction, 0x00, 0x00); +#else + sqlite3_create_function([self sqliteHandle], [name UTF8String], count, SQLITE_UTF8, (__bridge void*)b, &FMDBBlockSQLiteCallBackFunction, 0x00, 0x00); +#endif +} + +@end + + + +@implementation FMStatement +@synthesize statement=_statement; +@synthesize query=_query; +@synthesize useCount=_useCount; +@synthesize inUse=_inUse; + +- (void)finalize { + [self close]; + [super finalize]; +} + +- (void)dealloc { + [self close]; + FMDBRelease(_query); +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + +- (void)close { + if (_statement) { + sqlite3_finalize(_statement); + _statement = 0x00; + } + + _inUse = NO; +} + +- (void)reset { + if (_statement) { + sqlite3_reset(_statement); + } + + _inUse = NO; +} + +- (NSString*)description { + return [NSString stringWithFormat:@"%@ %ld hit(s) for query %@", [super description], _useCount, _query]; +} + + +@end + diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseAdditions.h b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseAdditions.h new file mode 100644 index 0000000..85bb277 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseAdditions.h @@ -0,0 +1,281 @@ +// +// FMDatabaseAdditions.h +// fmdb +// +// Created by August Mueller on 10/30/05. +// Copyright 2005 Flying Meat Inc.. All rights reserved. +// + +#import +#import "FMDatabase.h" + + +/** Category of additions for `` class. + + ### See also + + - `` + */ + +@interface FMDatabase (FMDatabaseAdditions) + +///---------------------------------------- +/// @name Return results of SQL to variable +///---------------------------------------- + +/** Return `int` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `int` value. + + @note To use this method from Swift, you must include `FMDatabaseAdditionsVariadic.swift` in your project. + */ + +- (int)intForQuery:(NSString*)query, ...; + +/** Return `long` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `long` value. + + @note To use this method from Swift, you must include `FMDatabaseAdditionsVariadic.swift` in your project. + */ + +- (long)longForQuery:(NSString*)query, ...; + +/** Return `BOOL` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `BOOL` value. + + @note To use this method from Swift, you must include `FMDatabaseAdditionsVariadic.swift` in your project. + */ + +- (BOOL)boolForQuery:(NSString*)query, ...; + +/** Return `double` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `double` value. + + @note To use this method from Swift, you must include `FMDatabaseAdditionsVariadic.swift` in your project. + */ + +- (double)doubleForQuery:(NSString*)query, ...; + +/** Return `NSString` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `NSString` value. + + @note To use this method from Swift, you must include `FMDatabaseAdditionsVariadic.swift` in your project. + */ + +- (NSString*)stringForQuery:(NSString*)query, ...; + +/** Return `NSData` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `NSData` value. + + @note To use this method from Swift, you must include `FMDatabaseAdditionsVariadic.swift` in your project. + */ + +- (NSData*)dataForQuery:(NSString*)query, ...; + +/** Return `NSDate` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `NSDate` value. + + @note To use this method from Swift, you must include `FMDatabaseAdditionsVariadic.swift` in your project. + */ + +- (NSDate*)dateForQuery:(NSString*)query, ...; + + +// Notice that there's no dataNoCopyForQuery:. +// That would be a bad idea, because we close out the result set, and then what +// happens to the data that we just didn't copy? Who knows, not I. + + +///-------------------------------- +/// @name Schema related operations +///-------------------------------- + +/** Does table exist in database? + + @param tableName The name of the table being looked for. + + @return `YES` if table found; `NO` if not found. + */ + +- (BOOL)tableExists:(NSString*)tableName; + +/** The schema of the database. + + This will be the schema for the entire database. For each entity, each row of the result set will include the following fields: + + - `type` - The type of entity (e.g. table, index, view, or trigger) + - `name` - The name of the object + - `tbl_name` - The name of the table to which the object references + - `rootpage` - The page number of the root b-tree page for tables and indices + - `sql` - The SQL that created the entity + + @return `FMResultSet` of schema; `nil` on error. + + @see [SQLite File Format](http://www.sqlite.org/fileformat.html) + */ + +- (FMResultSet*)getSchema; + +/** The schema of the database. + + This will be the schema for a particular table as report by SQLite `PRAGMA`, for example: + + PRAGMA table_info('employees') + + This will report: + + - `cid` - The column ID number + - `name` - The name of the column + - `type` - The data type specified for the column + - `notnull` - whether the field is defined as NOT NULL (i.e. values required) + - `dflt_value` - The default value for the column + - `pk` - Whether the field is part of the primary key of the table + + @param tableName The name of the table for whom the schema will be returned. + + @return `FMResultSet` of schema; `nil` on error. + + @see [table_info](http://www.sqlite.org/pragma.html#pragma_table_info) + */ + +- (FMResultSet*)getTableSchema:(NSString*)tableName; + +/** Test to see if particular column exists for particular table in database + + @param columnName The name of the column. + + @param tableName The name of the table. + + @return `YES` if column exists in table in question; `NO` otherwise. + */ + +- (BOOL)columnExists:(NSString*)columnName inTableWithName:(NSString*)tableName; + +/** Test to see if particular column exists for particular table in database + + @param columnName The name of the column. + + @param tableName The name of the table. + + @return `YES` if column exists in table in question; `NO` otherwise. + + @see columnExists:inTableWithName: + + @warning Deprecated - use `` instead. + */ + +- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName __attribute__ ((deprecated)); + + +/** Validate SQL statement + + This validates SQL statement by performing `sqlite3_prepare_v2`, but not returning the results, but instead immediately calling `sqlite3_finalize`. + + @param sql The SQL statement being validated. + + @param error This is a pointer to a `NSError` object that will receive the autoreleased `NSError` object if there was any error. If this is `nil`, no `NSError` result will be returned. + + @return `YES` if validation succeeded without incident; `NO` otherwise. + + */ + +- (BOOL)validateSQL:(NSString*)sql error:(NSError**)error; + + +#if SQLITE_VERSION_NUMBER >= 3007017 + +///----------------------------------- +/// @name Application identifier tasks +///----------------------------------- + +/** Retrieve application ID + + @return The `uint32_t` numeric value of the application ID. + + @see setApplicationID: + */ + +- (uint32_t)applicationID; + +/** Set the application ID + + @param appID The `uint32_t` numeric value of the application ID. + + @see applicationID + */ + +- (void)setApplicationID:(uint32_t)appID; + +#if TARGET_OS_MAC && !TARGET_OS_IPHONE +/** Retrieve application ID string + + @return The `NSString` value of the application ID. + + @see setApplicationIDString: + */ + + +- (NSString*)applicationIDString; + +/** Set the application ID string + + @param string The `NSString` value of the application ID. + + @see applicationIDString + */ + +- (void)setApplicationIDString:(NSString*)string; +#endif + +#endif + +///----------------------------------- +/// @name user version identifier tasks +///----------------------------------- + +/** Retrieve user version + + @return The `uint32_t` numeric value of the user version. + + @see setUserVersion: + */ + +- (uint32_t)userVersion; + +/** Set the user-version + + @param version The `uint32_t` numeric value of the user version. + + @see userVersion + */ + +- (void)setUserVersion:(uint32_t)version; + +@end diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseAdditions.m b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseAdditions.m new file mode 100644 index 0000000..4ab35fa --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseAdditions.m @@ -0,0 +1,224 @@ +// +// FMDatabaseAdditions.m +// fmdb +// +// Created by August Mueller on 10/30/05. +// Copyright 2005 Flying Meat Inc.. All rights reserved. +// + +#import "FMDatabase.h" +#import "FMDatabaseAdditions.h" +#import "TargetConditionals.h" + +@interface FMDatabase (PrivateStuff) +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args; +@end + +@implementation FMDatabase (FMDatabaseAdditions) + +#define RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(type, sel) \ +va_list args; \ +va_start(args, query); \ +FMResultSet *resultSet = [self executeQuery:query withArgumentsInArray:0x00 orDictionary:0x00 orVAList:args]; \ +va_end(args); \ +if (![resultSet next]) { return (type)0; } \ +type ret = [resultSet sel:0]; \ +[resultSet close]; \ +[resultSet setParentDB:nil]; \ +return ret; + + +- (NSString*)stringForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSString *, stringForColumnIndex); +} + +- (int)intForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(int, intForColumnIndex); +} + +- (long)longForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(long, longForColumnIndex); +} + +- (BOOL)boolForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(BOOL, boolForColumnIndex); +} + +- (double)doubleForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(double, doubleForColumnIndex); +} + +- (NSData*)dataForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSData *, dataForColumnIndex); +} + +- (NSDate*)dateForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSDate *, dateForColumnIndex); +} + + +- (BOOL)tableExists:(NSString*)tableName { + + tableName = [tableName lowercaseString]; + + FMResultSet *rs = [self executeQuery:@"select [sql] from sqlite_master where [type] = 'table' and lower(name) = ?", tableName]; + + //if at least one next exists, table exists + BOOL returnBool = [rs next]; + + //close and free object + [rs close]; + + return returnBool; +} + +/* + get table with list of tables: result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING] + check if table exist in database (patch from OZLB) +*/ +- (FMResultSet*)getSchema { + + //result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING] + FMResultSet *rs = [self executeQuery:@"SELECT type, name, tbl_name, rootpage, sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type != 'meta' AND name NOT LIKE 'sqlite_%' ORDER BY tbl_name, type DESC, name"]; + + return rs; +} + +/* + get table schema: result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER] +*/ +- (FMResultSet*)getTableSchema:(NSString*)tableName { + + //result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER] + FMResultSet *rs = [self executeQuery:[NSString stringWithFormat: @"pragma table_info('%@')", tableName]]; + + return rs; +} + +- (BOOL)columnExists:(NSString*)columnName inTableWithName:(NSString*)tableName { + + BOOL returnBool = NO; + + tableName = [tableName lowercaseString]; + columnName = [columnName lowercaseString]; + + FMResultSet *rs = [self getTableSchema:tableName]; + + //check if column is present in table schema + while ([rs next]) { + if ([[[rs stringForColumn:@"name"] lowercaseString] isEqualToString:columnName]) { + returnBool = YES; + break; + } + } + + //If this is not done FMDatabase instance stays out of pool + [rs close]; + + return returnBool; +} + + +#if SQLITE_VERSION_NUMBER >= 3007017 + +- (uint32_t)applicationID { + + uint32_t r = 0; + + FMResultSet *rs = [self executeQuery:@"pragma application_id"]; + + if ([rs next]) { + r = (uint32_t)[rs longLongIntForColumnIndex:0]; + } + + [rs close]; + + return r; +} + +- (void)setApplicationID:(uint32_t)appID { + NSString *query = [NSString stringWithFormat:@"pragma application_id=%d", appID]; + FMResultSet *rs = [self executeQuery:query]; + [rs next]; + [rs close]; +} + + +#if TARGET_OS_MAC && !TARGET_OS_IPHONE +- (NSString*)applicationIDString { + NSString *s = NSFileTypeForHFSTypeCode([self applicationID]); + + assert([s length] == 6); + + s = [s substringWithRange:NSMakeRange(1, 4)]; + + + return s; + +} + +- (void)setApplicationIDString:(NSString*)s { + + if ([s length] != 4) { + NSLog(@"setApplicationIDString: string passed is not exactly 4 chars long. (was %ld)", [s length]); + } + + [self setApplicationID:NSHFSTypeCodeFromFileType([NSString stringWithFormat:@"'%@'", s])]; +} + + +#endif + +#endif + +- (uint32_t)userVersion { + uint32_t r = 0; + + FMResultSet *rs = [self executeQuery:@"pragma user_version"]; + + if ([rs next]) { + r = (uint32_t)[rs longLongIntForColumnIndex:0]; + } + + [rs close]; + return r; +} + +- (void)setUserVersion:(uint32_t)version { + NSString *query = [NSString stringWithFormat:@"pragma user_version = %d", version]; + FMResultSet *rs = [self executeQuery:query]; + [rs next]; + [rs close]; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" + +- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName __attribute__ ((deprecated)) { + return [self columnExists:columnName inTableWithName:tableName]; +} + +#pragma clang diagnostic pop + + +- (BOOL)validateSQL:(NSString*)sql error:(NSError**)error { + sqlite3_stmt *pStmt = NULL; + BOOL validationSucceeded = YES; + + int rc = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pStmt, 0); + if (rc != SQLITE_OK) { + validationSucceeded = NO; + if (error) { + *error = [NSError errorWithDomain:NSCocoaErrorDomain + code:[self lastErrorCode] + userInfo:[NSDictionary dictionaryWithObject:[self lastErrorMessage] + forKey:NSLocalizedDescriptionKey]]; + } + } + + sqlite3_finalize(pStmt); + + return validationSucceeded; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabasePool.h b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabasePool.h new file mode 100644 index 0000000..692b8ae --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabasePool.h @@ -0,0 +1,204 @@ +// +// FMDatabasePool.h +// fmdb +// +// Created by August Mueller on 6/22/11. +// Copyright 2011 Flying Meat Inc. All rights reserved. +// + +#import +#import "sqlite3.h" + +@class FMDatabase; + +/** Pool of `` objects. + + ### See also + + - `` + - `` + + @warning Before using `FMDatabasePool`, please consider using `` instead. + + If you really really really know what you're doing and `FMDatabasePool` is what + you really really need (ie, you're using a read only database), OK you can use + it. But just be careful not to deadlock! + + For an example on deadlocking, search for: + `ONLY_USE_THE_POOL_IF_YOU_ARE_DOING_READS_OTHERWISE_YOULL_DEADLOCK_USE_FMDATABASEQUEUE_INSTEAD` + in the main.m file. + */ + +@interface FMDatabasePool : NSObject { + NSString *_path; + + dispatch_queue_t _lockQueue; + + NSMutableArray *_databaseInPool; + NSMutableArray *_databaseOutPool; + + __unsafe_unretained id _delegate; + + NSUInteger _maximumNumberOfDatabasesToCreate; + int _openFlags; +} + +/** Database path */ + +@property (atomic, retain) NSString *path; + +/** Delegate object */ + +@property (atomic, assign) id delegate; + +/** Maximum number of databases to create */ + +@property (atomic, assign) NSUInteger maximumNumberOfDatabasesToCreate; + +/** Open flags */ + +@property (atomic, readonly) int openFlags; + + +///--------------------- +/// @name Initialization +///--------------------- + +/** Create pool using path. + + @param aPath The file path of the database. + + @return The `FMDatabasePool` object. `nil` on error. + */ + ++ (instancetype)databasePoolWithPath:(NSString*)aPath; + +/** Create pool using path and specified flags + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database + + @return The `FMDatabasePool` object. `nil` on error. + */ + ++ (instancetype)databasePoolWithPath:(NSString*)aPath flags:(int)openFlags; + +/** Create pool using path. + + @param aPath The file path of the database. + + @return The `FMDatabasePool` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString*)aPath; + +/** Create pool using path and specified flags. + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database + + @return The `FMDatabasePool` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags; + +///------------------------------------------------ +/// @name Keeping track of checked in/out databases +///------------------------------------------------ + +/** Number of checked-in databases in pool + + @returns Number of databases + */ + +- (NSUInteger)countOfCheckedInDatabases; + +/** Number of checked-out databases in pool + + @returns Number of databases + */ + +- (NSUInteger)countOfCheckedOutDatabases; + +/** Total number of databases in pool + + @returns Number of databases + */ + +- (NSUInteger)countOfOpenDatabases; + +/** Release all databases in pool */ + +- (void)releaseAllDatabases; + +///------------------------------------------ +/// @name Perform database operations in pool +///------------------------------------------ + +/** Synchronously perform database operations in pool. + + @param block The code to be run on the `FMDatabasePool` pool. + */ + +- (void)inDatabase:(void (^)(FMDatabase *db))block; + +/** Synchronously perform database operations in pool using transaction. + + @param block The code to be run on the `FMDatabasePool` pool. + */ + +- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block; + +/** Synchronously perform database operations in pool using deferred transaction. + + @param block The code to be run on the `FMDatabasePool` pool. + */ + +- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block; + +#if SQLITE_VERSION_NUMBER >= 3007000 + +/** Synchronously perform database operations in pool using save point. + + @param block The code to be run on the `FMDatabasePool` pool. + + @return `NSError` object if error; `nil` if successful. + + @warning You can not nest these, since calling it will pull another database out of the pool and you'll get a deadlock. If you need to nest, use `<[FMDatabase startSavePointWithName:error:]>` instead. +*/ + +- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block; +#endif + +@end + + +/** FMDatabasePool delegate category + + This is a category that defines the protocol for the FMDatabasePool delegate + */ + +@interface NSObject (FMDatabasePoolDelegate) + +/** Asks the delegate whether database should be added to the pool. + + @param pool The `FMDatabasePool` object. + @param database The `FMDatabase` object. + + @return `YES` if it should add database to pool; `NO` if not. + + */ + +- (BOOL)databasePool:(FMDatabasePool*)pool shouldAddDatabaseToPool:(FMDatabase*)database; + +/** Tells the delegate that database was added to the pool. + + @param pool The `FMDatabasePool` object. + @param database The `FMDatabase` object. + + */ + +- (void)databasePool:(FMDatabasePool*)pool didAddDatabase:(FMDatabase*)database; + +@end + diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabasePool.m b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabasePool.m new file mode 100644 index 0000000..010e292 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabasePool.m @@ -0,0 +1,273 @@ +// +// FMDatabasePool.m +// fmdb +// +// Created by August Mueller on 6/22/11. +// Copyright 2011 Flying Meat Inc. All rights reserved. +// + +#import "FMDatabasePool.h" +#import "FMDatabase.h" + +@interface FMDatabasePool() + +- (void)pushDatabaseBackInPool:(FMDatabase*)db; +- (FMDatabase*)db; + +@end + + +@implementation FMDatabasePool +@synthesize path=_path; +@synthesize delegate=_delegate; +@synthesize maximumNumberOfDatabasesToCreate=_maximumNumberOfDatabasesToCreate; +@synthesize openFlags=_openFlags; + + ++ (instancetype)databasePoolWithPath:(NSString*)aPath { + return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath]); +} + ++ (instancetype)databasePoolWithPath:(NSString*)aPath flags:(int)openFlags { + return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath flags:openFlags]); +} + +- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags { + + self = [super init]; + + if (self != nil) { + _path = [aPath copy]; + _lockQueue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL); + _databaseInPool = FMDBReturnRetained([NSMutableArray array]); + _databaseOutPool = FMDBReturnRetained([NSMutableArray array]); + _openFlags = openFlags; + } + + return self; +} + +- (instancetype)initWithPath:(NSString*)aPath +{ + // default flags for sqlite3_open + return [self initWithPath:aPath flags:SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE]; +} + +- (instancetype)init { + return [self initWithPath:nil]; +} + + +- (void)dealloc { + + _delegate = 0x00; + FMDBRelease(_path); + FMDBRelease(_databaseInPool); + FMDBRelease(_databaseOutPool); + + if (_lockQueue) { + FMDBDispatchQueueRelease(_lockQueue); + _lockQueue = 0x00; + } +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + + +- (void)executeLocked:(void (^)(void))aBlock { + dispatch_sync(_lockQueue, aBlock); +} + +- (void)pushDatabaseBackInPool:(FMDatabase*)db { + + if (!db) { // db can be null if we set an upper bound on the # of databases to create. + return; + } + + [self executeLocked:^() { + + if ([self->_databaseInPool containsObject:db]) { + [[NSException exceptionWithName:@"Database already in pool" reason:@"The FMDatabase being put back into the pool is already present in the pool" userInfo:nil] raise]; + } + + [self->_databaseInPool addObject:db]; + [self->_databaseOutPool removeObject:db]; + + }]; +} + +- (FMDatabase*)db { + + __block FMDatabase *db; + + + [self executeLocked:^() { + db = [self->_databaseInPool lastObject]; + + BOOL shouldNotifyDelegate = NO; + + if (db) { + [self->_databaseOutPool addObject:db]; + [self->_databaseInPool removeLastObject]; + } + else { + + if (self->_maximumNumberOfDatabasesToCreate) { + NSUInteger currentCount = [self->_databaseOutPool count] + [self->_databaseInPool count]; + + if (currentCount >= self->_maximumNumberOfDatabasesToCreate) { + NSLog(@"Maximum number of databases (%ld) has already been reached!", (long)currentCount); + return; + } + } + + db = [FMDatabase databaseWithPath:self->_path]; + shouldNotifyDelegate = YES; + } + + //This ensures that the db is opened before returning +#if SQLITE_VERSION_NUMBER >= 3005000 + BOOL success = [db openWithFlags:self->_openFlags]; +#else + BOOL success = [db open]; +#endif + if (success) { + if ([self->_delegate respondsToSelector:@selector(databasePool:shouldAddDatabaseToPool:)] && ![self->_delegate databasePool:self shouldAddDatabaseToPool:db]) { + [db close]; + db = 0x00; + } + else { + //It should not get added in the pool twice if lastObject was found + if (![self->_databaseOutPool containsObject:db]) { + [self->_databaseOutPool addObject:db]; + + if (shouldNotifyDelegate && [self->_delegate respondsToSelector:@selector(databasePool:didAddDatabase:)]) { + [self->_delegate databasePool:self didAddDatabase:db]; + } + } + } + } + else { + NSLog(@"Could not open up the database at path %@", self->_path); + db = 0x00; + } + }]; + + return db; +} + +- (NSUInteger)countOfCheckedInDatabases { + + __block NSUInteger count; + + [self executeLocked:^() { + count = [self->_databaseInPool count]; + }]; + + return count; +} + +- (NSUInteger)countOfCheckedOutDatabases { + + __block NSUInteger count; + + [self executeLocked:^() { + count = [self->_databaseOutPool count]; + }]; + + return count; +} + +- (NSUInteger)countOfOpenDatabases { + __block NSUInteger count; + + [self executeLocked:^() { + count = [self->_databaseOutPool count] + [self->_databaseInPool count]; + }]; + + return count; +} + +- (void)releaseAllDatabases { + [self executeLocked:^() { + [self->_databaseOutPool removeAllObjects]; + [self->_databaseInPool removeAllObjects]; + }]; +} + +- (void)inDatabase:(void (^)(FMDatabase *db))block { + + FMDatabase *db = [self db]; + + block(db); + + [self pushDatabaseBackInPool:db]; +} + +- (void)beginTransaction:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block { + + BOOL shouldRollback = NO; + + FMDatabase *db = [self db]; + + if (useDeferred) { + [db beginDeferredTransaction]; + } + else { + [db beginTransaction]; + } + + + block(db, &shouldRollback); + + if (shouldRollback) { + [db rollback]; + } + else { + [db commit]; + } + + [self pushDatabaseBackInPool:db]; +} + +- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block { + [self beginTransaction:YES withBlock:block]; +} + +- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block { + [self beginTransaction:NO withBlock:block]; +} +#if SQLITE_VERSION_NUMBER >= 3007000 +- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block { + + static unsigned long savePointIdx = 0; + + NSString *name = [NSString stringWithFormat:@"savePoint%ld", savePointIdx++]; + + BOOL shouldRollback = NO; + + FMDatabase *db = [self db]; + + NSError *err = 0x00; + + if (![db startSavePointWithName:name error:&err]) { + [self pushDatabaseBackInPool:db]; + return err; + } + + block(db, &shouldRollback); + + if (shouldRollback) { + // We need to rollback and release this savepoint to remove it + [db rollbackToSavePointWithName:name error:&err]; + } + [db releaseSavePointWithName:name error:&err]; + + [self pushDatabaseBackInPool:db]; + + return err; +} +#endif + +@end diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseQueue.h b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseQueue.h new file mode 100644 index 0000000..34c0750 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseQueue.h @@ -0,0 +1,174 @@ +// +// FMDatabaseQueue.h +// fmdb +// +// Created by August Mueller on 6/22/11. +// Copyright 2011 Flying Meat Inc. All rights reserved. +// + +#import +#import "sqlite3.h" + +@class FMDatabase; + +/** To perform queries and updates on multiple threads, you'll want to use `FMDatabaseQueue`. + + Using a single instance of `` from multiple threads at once is a bad idea. It has always been OK to make a `` object *per thread*. Just don't share a single instance across threads, and definitely not across multiple threads at the same time. + + Instead, use `FMDatabaseQueue`. Here's how to use it: + + First, make your queue. + + FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; + + Then use it like so: + + [queue inDatabase:^(FMDatabase *db) { + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]]; + + FMResultSet *rs = [db executeQuery:@"select * from foo"]; + while ([rs next]) { + //… + } + }]; + + An easy way to wrap things up in a transaction can be done like this: + + [queue inTransaction:^(FMDatabase *db, BOOL *rollback) { + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]]; + + if (whoopsSomethingWrongHappened) { + *rollback = YES; + return; + } + // etc… + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]]; + }]; + + `FMDatabaseQueue` will run the blocks on a serialized queue (hence the name of the class). So if you call `FMDatabaseQueue`'s methods from multiple threads at the same time, they will be executed in the order they are received. This way queries and updates won't step on each other's toes, and every one is happy. + + ### See also + + - `` + + @warning Do not instantiate a single `` object and use it across multiple threads. Use `FMDatabaseQueue` instead. + + @warning The calls to `FMDatabaseQueue`'s methods are blocking. So even though you are passing along blocks, they will **not** be run on another thread. + + */ + +@interface FMDatabaseQueue : NSObject { + NSString *_path; + dispatch_queue_t _queue; + FMDatabase *_db; + int _openFlags; +} + +/** Path of database */ + +@property (atomic, retain) NSString *path; + +/** Open flags */ + +@property (atomic, readonly) int openFlags; + +///---------------------------------------------------- +/// @name Initialization, opening, and closing of queue +///---------------------------------------------------- + +/** Create queue using path. + + @param aPath The file path of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + ++ (instancetype)databaseQueueWithPath:(NSString*)aPath; + +/** Create queue using path and specified flags. + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database + + @return The `FMDatabaseQueue` object. `nil` on error. + */ ++ (instancetype)databaseQueueWithPath:(NSString*)aPath flags:(int)openFlags; + +/** Create queue using path. + + @param aPath The file path of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString*)aPath; + +/** Create queue using path and specified flags. + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags; + +/** Returns the Class of 'FMDatabase' subclass, that will be used to instantiate database object. + + Subclasses can override this method to return specified Class of 'FMDatabase' subclass. + + @return The Class of 'FMDatabase' subclass, that will be used to instantiate database object. + */ + ++ (Class)databaseClass; + +/** Close database used by queue. */ + +- (void)close; + +///----------------------------------------------- +/// @name Dispatching database operations to queue +///----------------------------------------------- + +/** Synchronously perform database operations on queue. + + @param block The code to be run on the queue of `FMDatabaseQueue` + */ + +- (void)inDatabase:(void (^)(FMDatabase *db))block; + +/** Synchronously perform database operations on queue, using transactions. + + @param block The code to be run on the queue of `FMDatabaseQueue` + */ + +- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block; + +/** Synchronously perform database operations on queue, using deferred transactions. + + @param block The code to be run on the queue of `FMDatabaseQueue` + */ + +- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block; + +///----------------------------------------------- +/// @name Dispatching database operations to queue +///----------------------------------------------- + +/** Synchronously perform database operations using save point. + + @param block The code to be run on the queue of `FMDatabaseQueue` + */ + +#if SQLITE_VERSION_NUMBER >= 3007000 +// NOTE: you can not nest these, since calling it will pull another database out of the pool and you'll get a deadlock. +// If you need to nest, use FMDatabase's startSavePointWithName:error: instead. +- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block; +#endif + +@end + diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseQueue.m b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseQueue.m new file mode 100644 index 0000000..ccf31fb --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMDatabaseQueue.m @@ -0,0 +1,232 @@ +// +// FMDatabaseQueue.m +// fmdb +// +// Created by August Mueller on 6/22/11. +// Copyright 2011 Flying Meat Inc. All rights reserved. +// + +#import "FMDatabaseQueue.h" +#import "FMDatabase.h" + +/* + + Note: we call [self retain]; before using dispatch_sync, just incase + FMDatabaseQueue is released on another thread and we're in the middle of doing + something in dispatch_sync + + */ + +/* + * A key used to associate the FMDatabaseQueue object with the dispatch_queue_t it uses. + * This in turn is used for deadlock detection by seeing if inDatabase: is called on + * the queue's dispatch queue, which should not happen and causes a deadlock. + */ +static const void * const kDispatchQueueSpecificKey = &kDispatchQueueSpecificKey; + +@implementation FMDatabaseQueue + +@synthesize path = _path; +@synthesize openFlags = _openFlags; + ++ (instancetype)databaseQueueWithPath:(NSString*)aPath { + + FMDatabaseQueue *q = [[self alloc] initWithPath:aPath]; + + FMDBAutorelease(q); + + return q; +} + ++ (instancetype)databaseQueueWithPath:(NSString*)aPath flags:(int)openFlags { + + FMDatabaseQueue *q = [[self alloc] initWithPath:aPath flags:openFlags]; + + FMDBAutorelease(q); + + return q; +} + ++ (Class)databaseClass { + return [FMDatabase class]; +} + +- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags { + + self = [super init]; + + if (self != nil) { + + _db = [[[self class] databaseClass] databaseWithPath:aPath]; + FMDBRetain(_db); + +#if SQLITE_VERSION_NUMBER >= 3005000 + BOOL success = [_db openWithFlags:openFlags]; +#else + BOOL success = [_db open]; +#endif + if (!success) { + NSLog(@"Could not create database queue for path %@", aPath); + FMDBRelease(self); + return 0x00; + } + + _path = FMDBReturnRetained(aPath); + + _queue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL); + dispatch_queue_set_specific(_queue, kDispatchQueueSpecificKey, (__bridge void *)self, NULL); + _openFlags = openFlags; + } + + return self; +} + +- (instancetype)initWithPath:(NSString*)aPath { + + // default flags for sqlite3_open + return [self initWithPath:aPath flags:SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE]; +} + +- (instancetype)init { + return [self initWithPath:nil]; +} + + +- (void)dealloc { + + FMDBRelease(_db); + FMDBRelease(_path); + + if (_queue) { + FMDBDispatchQueueRelease(_queue); + _queue = 0x00; + } +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + +- (void)close { + FMDBRetain(self); + dispatch_sync(_queue, ^() { + [self->_db close]; + FMDBRelease(_db); + self->_db = 0x00; + }); + FMDBRelease(self); +} + +- (FMDatabase*)database { + if (!_db) { + _db = FMDBReturnRetained([FMDatabase databaseWithPath:_path]); + +#if SQLITE_VERSION_NUMBER >= 3005000 + BOOL success = [_db openWithFlags:_openFlags]; +#else + BOOL success = [_db open]; +#endif + if (!success) { + NSLog(@"FMDatabaseQueue could not reopen database for path %@", _path); + FMDBRelease(_db); + _db = 0x00; + return 0x00; + } + } + + return _db; +} + +- (void)inDatabase:(void (^)(FMDatabase *db))block { + /* Get the currently executing queue (which should probably be nil, but in theory could be another DB queue + * and then check it against self to make sure we're not about to deadlock. */ + FMDatabaseQueue *currentSyncQueue = (__bridge id)dispatch_get_specific(kDispatchQueueSpecificKey); + assert(currentSyncQueue != self && "inDatabase: was called reentrantly on the same queue, which would lead to a deadlock"); + + FMDBRetain(self); + + dispatch_sync(_queue, ^() { + + FMDatabase *db = [self database]; + block(db); + + if ([db hasOpenResultSets]) { + NSLog(@"Warning: there is at least one open result set around after performing [FMDatabaseQueue inDatabase:]"); + +#if defined(DEBUG) && DEBUG + NSSet *openSetCopy = FMDBReturnAutoreleased([[db valueForKey:@"_openResultSets"] copy]); + for (NSValue *rsInWrappedInATastyValueMeal in openSetCopy) { + FMResultSet *rs = (FMResultSet *)[rsInWrappedInATastyValueMeal pointerValue]; + NSLog(@"query: '%@'", [rs query]); + } +#endif + } + }); + + FMDBRelease(self); +} + + +- (void)beginTransaction:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block { + FMDBRetain(self); + dispatch_sync(_queue, ^() { + + BOOL shouldRollback = NO; + + if (useDeferred) { + [[self database] beginDeferredTransaction]; + } + else { + [[self database] beginTransaction]; + } + + block([self database], &shouldRollback); + + if (shouldRollback) { + [[self database] rollback]; + } + else { + [[self database] commit]; + } + }); + + FMDBRelease(self); +} + +- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block { + [self beginTransaction:YES withBlock:block]; +} + +- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block { + [self beginTransaction:NO withBlock:block]; +} + +#if SQLITE_VERSION_NUMBER >= 3007000 +- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block { + + static unsigned long savePointIdx = 0; + __block NSError *err = 0x00; + FMDBRetain(self); + dispatch_sync(_queue, ^() { + + NSString *name = [NSString stringWithFormat:@"savePoint%ld", savePointIdx++]; + + BOOL shouldRollback = NO; + + if ([[self database] startSavePointWithName:name error:&err]) { + + block([self database], &shouldRollback); + + if (shouldRollback) { + // We need to rollback and release this savepoint to remove it + [[self database] rollbackToSavePointWithName:name error:&err]; + } + [[self database] releaseSavePointWithName:name error:&err]; + + } + }); + FMDBRelease(self); + return err; +} +#endif + +@end diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.h b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.h new file mode 100644 index 0000000..65250f0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.h @@ -0,0 +1,469 @@ +#import +#import "sqlite3.h" + +#ifndef __has_feature // Optional. +#define __has_feature(x) 0 // Compatibility with non-clang compilers. +#endif + +#ifndef NS_RETURNS_NOT_RETAINED +#if __has_feature(attribute_ns_returns_not_retained) +#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) +#else +#define NS_RETURNS_NOT_RETAINED +#endif +#endif + +@class FMDatabase; +@class FMStatement; + +/** Represents the results of executing a query on an ``. + + ### See also + + - `` + */ + +@interface FMResultSet : NSObject { + FMDatabase *_parentDB; + FMStatement *_statement; + + NSString *_query; + NSMutableDictionary *_columnNameToIndexMap; +} + +///----------------- +/// @name Properties +///----------------- + +/** Executed query */ + +@property (atomic, retain) NSString *query; + +/** `NSMutableDictionary` mapping column names to numeric index */ + +@property (readonly) NSMutableDictionary *columnNameToIndexMap; + +/** `FMStatement` used by result set. */ + +@property (atomic, retain) FMStatement *statement; + +///------------------------------------ +/// @name Creating and closing database +///------------------------------------ + +/** Create result set from `` + + @param statement A `` to be performed + + @param aDB A `` to be used + + @return A `FMResultSet` on success; `nil` on failure + */ + ++ (instancetype)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB; + +/** Close result set */ + +- (void)close; + +- (void)setParentDB:(FMDatabase *)newDb; + +///--------------------------------------- +/// @name Iterating through the result set +///--------------------------------------- + +/** Retrieve next row for result set. + + You must always invoke `next` or `nextWithError` before attempting to access the values returned in a query, even if you're only expecting one. + + @return `YES` if row successfully retrieved; `NO` if end of result set reached + + @see hasAnotherRow + */ + +- (BOOL)next; + +/** Retrieve next row for result set. + + You must always invoke `next` or `nextWithError` before attempting to access the values returned in a query, even if you're only expecting one. + + @param outErr A 'NSError' object to receive any error object (if any). + + @return 'YES' if row successfully retrieved; 'NO' if end of result set reached + + @see hasAnotherRow + */ + +- (BOOL)nextWithError:(NSError **)outErr; + +/** Did the last call to `` succeed in retrieving another row? + + @return `YES` if the last call to `` succeeded in retrieving another record; `NO` if not. + + @see next + + @warning The `hasAnotherRow` method must follow a call to ``. If the previous database interaction was something other than a call to `next`, then this method may return `NO`, whether there is another row of data or not. + */ + +- (BOOL)hasAnotherRow; + +///--------------------------------------------- +/// @name Retrieving information from result set +///--------------------------------------------- + +/** How many columns in result set + + @return Integer value of the number of columns. + */ + +- (int)columnCount; + +/** Column index for column name + + @param columnName `NSString` value of the name of the column. + + @return Zero-based index for column. + */ + +- (int)columnIndexForName:(NSString*)columnName; + +/** Column name for column index + + @param columnIdx Zero-based index for column. + + @return columnName `NSString` value of the name of the column. + */ + +- (NSString*)columnNameForIndex:(int)columnIdx; + +/** Result set integer value for column. + + @param columnName `NSString` value of the name of the column. + + @return `int` value of the result set's column. + */ + +- (int)intForColumn:(NSString*)columnName; + +/** Result set integer value for column. + + @param columnIdx Zero-based index for column. + + @return `int` value of the result set's column. + */ + +- (int)intForColumnIndex:(int)columnIdx; + +/** Result set `long` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `long` value of the result set's column. + */ + +- (long)longForColumn:(NSString*)columnName; + +/** Result set long value for column. + + @param columnIdx Zero-based index for column. + + @return `long` value of the result set's column. + */ + +- (long)longForColumnIndex:(int)columnIdx; + +/** Result set `long long int` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `long long int` value of the result set's column. + */ + +- (long long int)longLongIntForColumn:(NSString*)columnName; + +/** Result set `long long int` value for column. + + @param columnIdx Zero-based index for column. + + @return `long long int` value of the result set's column. + */ + +- (long long int)longLongIntForColumnIndex:(int)columnIdx; + +/** Result set `unsigned long long int` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `unsigned long long int` value of the result set's column. + */ + +- (unsigned long long int)unsignedLongLongIntForColumn:(NSString*)columnName; + +/** Result set `unsigned long long int` value for column. + + @param columnIdx Zero-based index for column. + + @return `unsigned long long int` value of the result set's column. + */ + +- (unsigned long long int)unsignedLongLongIntForColumnIndex:(int)columnIdx; + +/** Result set `BOOL` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `BOOL` value of the result set's column. + */ + +- (BOOL)boolForColumn:(NSString*)columnName; + +/** Result set `BOOL` value for column. + + @param columnIdx Zero-based index for column. + + @return `BOOL` value of the result set's column. + */ + +- (BOOL)boolForColumnIndex:(int)columnIdx; + +/** Result set `double` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `double` value of the result set's column. + + */ + +- (double)doubleForColumn:(NSString*)columnName; + +/** Result set `double` value for column. + + @param columnIdx Zero-based index for column. + + @return `double` value of the result set's column. + + */ + +- (double)doubleForColumnIndex:(int)columnIdx; + +/** Result set `NSString` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `NSString` value of the result set's column. + + */ + +- (NSString*)stringForColumn:(NSString*)columnName; + +/** Result set `NSString` value for column. + + @param columnIdx Zero-based index for column. + + @return `NSString` value of the result set's column. + */ + +- (NSString*)stringForColumnIndex:(int)columnIdx; + +/** Result set `NSDate` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `NSDate` value of the result set's column. + */ + +- (NSDate*)dateForColumn:(NSString*)columnName; + +/** Result set `NSDate` value for column. + + @param columnIdx Zero-based index for column. + + @return `NSDate` value of the result set's column. + + */ + +- (NSDate*)dateForColumnIndex:(int)columnIdx; + +/** Result set `NSData` value for column. + + This is useful when storing binary data in table (such as image or the like). + + @param columnName `NSString` value of the name of the column. + + @return `NSData` value of the result set's column. + + */ + +- (NSData*)dataForColumn:(NSString*)columnName; + +/** Result set `NSData` value for column. + + @param columnIdx Zero-based index for column. + + @return `NSData` value of the result set's column. + */ + +- (NSData*)dataForColumnIndex:(int)columnIdx; + +/** Result set `(const unsigned char *)` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `(const unsigned char *)` value of the result set's column. + */ + +- (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName; + +/** Result set `(const unsigned char *)` value for column. + + @param columnIdx Zero-based index for column. + + @return `(const unsigned char *)` value of the result set's column. + */ + +- (const unsigned char *)UTF8StringForColumnIndex:(int)columnIdx; + +/** Result set object for column. + + @param columnName `NSString` value of the name of the column. + + @return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object. + + @see objectForKeyedSubscript: + */ + +- (id)objectForColumnName:(NSString*)columnName; + +/** Result set object for column. + + @param columnIdx Zero-based index for column. + + @return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object. + + @see objectAtIndexedSubscript: + */ + +- (id)objectForColumnIndex:(int)columnIdx; + +/** Result set object for column. + + This method allows the use of the "boxed" syntax supported in Modern Objective-C. For example, by defining this method, the following syntax is now supported: + + id result = rs[@"employee_name"]; + + This simplified syntax is equivalent to calling: + + id result = [rs objectForKeyedSubscript:@"employee_name"]; + + which is, it turns out, equivalent to calling: + + id result = [rs objectForColumnName:@"employee_name"]; + + @param columnName `NSString` value of the name of the column. + + @return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object. + */ + +- (id)objectForKeyedSubscript:(NSString *)columnName; + +/** Result set object for column. + + This method allows the use of the "boxed" syntax supported in Modern Objective-C. For example, by defining this method, the following syntax is now supported: + + id result = rs[0]; + + This simplified syntax is equivalent to calling: + + id result = [rs objectForKeyedSubscript:0]; + + which is, it turns out, equivalent to calling: + + id result = [rs objectForColumnName:0]; + + @param columnIdx Zero-based index for column. + + @return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object. + */ + +- (id)objectAtIndexedSubscript:(int)columnIdx; + +/** Result set `NSData` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `NSData` value of the result set's column. + + @warning If you are going to use this data after you iterate over the next row, or after you close the +result set, make sure to make a copy of the data first (or just use ``/``) +If you don't, you're going to be in a world of hurt when you try and use the data. + + */ + +- (NSData*)dataNoCopyForColumn:(NSString*)columnName NS_RETURNS_NOT_RETAINED; + +/** Result set `NSData` value for column. + + @param columnIdx Zero-based index for column. + + @return `NSData` value of the result set's column. + + @warning If you are going to use this data after you iterate over the next row, or after you close the + result set, make sure to make a copy of the data first (or just use ``/``) + If you don't, you're going to be in a world of hurt when you try and use the data. + + */ + +- (NSData*)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED; + +/** Is the column `NULL`? + + @param columnIdx Zero-based index for column. + + @return `YES` if column is `NULL`; `NO` if not `NULL`. + */ + +- (BOOL)columnIndexIsNull:(int)columnIdx; + +/** Is the column `NULL`? + + @param columnName `NSString` value of the name of the column. + + @return `YES` if column is `NULL`; `NO` if not `NULL`. + */ + +- (BOOL)columnIsNull:(NSString*)columnName; + + +/** Returns a dictionary of the row results mapped to case sensitive keys of the column names. + + @returns `NSDictionary` of the row results. + + @warning The keys to the dictionary are case sensitive of the column names. + */ + +- (NSDictionary*)resultDictionary; + +/** Returns a dictionary of the row results + + @see resultDictionary + + @warning **Deprecated**: Please use `` instead. Also, beware that `` is case sensitive! + */ + +- (NSDictionary*)resultDict __attribute__ ((deprecated)); + +///----------------------------- +/// @name Key value coding magic +///----------------------------- + +/** Performs `setValue` to yield support for key value observing. + + @param object The object for which the values will be set. This is the key-value-coding compliant object that you might, for example, observe. + + */ + +- (void)kvcMagic:(id)object; + + +@end + diff --git a/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.m b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.m new file mode 100644 index 0000000..ca7e166 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/FMDB/src/fmdb/FMResultSet.m @@ -0,0 +1,416 @@ +#import "FMResultSet.h" +#import "FMDatabase.h" +#import "unistd.h" + +@interface FMDatabase () +- (void)resultSetDidClose:(FMResultSet *)resultSet; +@end + + +@implementation FMResultSet +@synthesize query=_query; +@synthesize statement=_statement; + ++ (instancetype)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB { + + FMResultSet *rs = [[FMResultSet alloc] init]; + + [rs setStatement:statement]; + [rs setParentDB:aDB]; + + NSParameterAssert(![statement inUse]); + [statement setInUse:YES]; // weak reference + + return FMDBReturnAutoreleased(rs); +} + +- (void)finalize { + [self close]; + [super finalize]; +} + +- (void)dealloc { + [self close]; + + FMDBRelease(_query); + _query = nil; + + FMDBRelease(_columnNameToIndexMap); + _columnNameToIndexMap = nil; + +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + +- (void)close { + [_statement reset]; + FMDBRelease(_statement); + _statement = nil; + + // we don't need this anymore... (i think) + //[_parentDB setInUse:NO]; + [_parentDB resultSetDidClose:self]; + _parentDB = nil; +} + +- (int)columnCount { + return sqlite3_column_count([_statement statement]); +} + +- (NSMutableDictionary *)columnNameToIndexMap { + if (!_columnNameToIndexMap) { + int columnCount = sqlite3_column_count([_statement statement]); + _columnNameToIndexMap = [[NSMutableDictionary alloc] initWithCapacity:(NSUInteger)columnCount]; + int columnIdx = 0; + for (columnIdx = 0; columnIdx < columnCount; columnIdx++) { + [_columnNameToIndexMap setObject:[NSNumber numberWithInt:columnIdx] + forKey:[[NSString stringWithUTF8String:sqlite3_column_name([_statement statement], columnIdx)] lowercaseString]]; + } + } + return _columnNameToIndexMap; +} + +- (void)kvcMagic:(id)object { + + int columnCount = sqlite3_column_count([_statement statement]); + + int columnIdx = 0; + for (columnIdx = 0; columnIdx < columnCount; columnIdx++) { + + const char *c = (const char *)sqlite3_column_text([_statement statement], columnIdx); + + // check for a null row + if (c) { + NSString *s = [NSString stringWithUTF8String:c]; + + [object setValue:s forKey:[NSString stringWithUTF8String:sqlite3_column_name([_statement statement], columnIdx)]]; + } + } +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" + +- (NSDictionary*)resultDict { + + NSUInteger num_cols = (NSUInteger)sqlite3_data_count([_statement statement]); + + if (num_cols > 0) { + NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:num_cols]; + + NSEnumerator *columnNames = [[self columnNameToIndexMap] keyEnumerator]; + NSString *columnName = nil; + while ((columnName = [columnNames nextObject])) { + id objectValue = [self objectForColumnName:columnName]; + [dict setObject:objectValue forKey:columnName]; + } + + return FMDBReturnAutoreleased([dict copy]); + } + else { + NSLog(@"Warning: There seem to be no columns in this set."); + } + + return nil; +} + +#pragma clang diagnostic pop + +- (NSDictionary*)resultDictionary { + + NSUInteger num_cols = (NSUInteger)sqlite3_data_count([_statement statement]); + + if (num_cols > 0) { + NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:num_cols]; + + int columnCount = sqlite3_column_count([_statement statement]); + + int columnIdx = 0; + for (columnIdx = 0; columnIdx < columnCount; columnIdx++) { + + NSString *columnName = [NSString stringWithUTF8String:sqlite3_column_name([_statement statement], columnIdx)]; + id objectValue = [self objectForColumnIndex:columnIdx]; + [dict setObject:objectValue forKey:columnName]; + } + + return dict; + } + else { + NSLog(@"Warning: There seem to be no columns in this set."); + } + + return nil; +} + + + + +- (BOOL)next { + return [self nextWithError:nil]; +} + +- (BOOL)nextWithError:(NSError **)outErr { + + int rc = sqlite3_step([_statement statement]); + + if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) { + NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [_parentDB databasePath]); + NSLog(@"Database busy"); + if (outErr) { + *outErr = [_parentDB lastError]; + } + } + else if (SQLITE_DONE == rc || SQLITE_ROW == rc) { + // all is well, let's return. + } + else if (SQLITE_ERROR == rc) { + NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([_parentDB sqliteHandle])); + if (outErr) { + *outErr = [_parentDB lastError]; + } + } + else if (SQLITE_MISUSE == rc) { + // uh oh. + NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([_parentDB sqliteHandle])); + if (outErr) { + if (_parentDB) { + *outErr = [_parentDB lastError]; + } + else { + // If 'next' or 'nextWithError' is called after the result set is closed, + // we need to return the appropriate error. + NSDictionary* errorMessage = [NSDictionary dictionaryWithObject:@"parentDB does not exist" forKey:NSLocalizedDescriptionKey]; + *outErr = [NSError errorWithDomain:@"FMDatabase" code:SQLITE_MISUSE userInfo:errorMessage]; + } + + } + } + else { + // wtf? + NSLog(@"Unknown error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([_parentDB sqliteHandle])); + if (outErr) { + *outErr = [_parentDB lastError]; + } + } + + + if (rc != SQLITE_ROW) { + [self close]; + } + + return (rc == SQLITE_ROW); +} + +- (BOOL)hasAnotherRow { + return sqlite3_errcode([_parentDB sqliteHandle]) == SQLITE_ROW; +} + +- (int)columnIndexForName:(NSString*)columnName { + columnName = [columnName lowercaseString]; + + NSNumber *n = [[self columnNameToIndexMap] objectForKey:columnName]; + + if (n) { + return [n intValue]; + } + + NSLog(@"Warning: I could not find the column named '%@'.", columnName); + + return -1; +} + + + +- (int)intForColumn:(NSString*)columnName { + return [self intForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (int)intForColumnIndex:(int)columnIdx { + return sqlite3_column_int([_statement statement], columnIdx); +} + +- (long)longForColumn:(NSString*)columnName { + return [self longForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (long)longForColumnIndex:(int)columnIdx { + return (long)sqlite3_column_int64([_statement statement], columnIdx); +} + +- (long long int)longLongIntForColumn:(NSString*)columnName { + return [self longLongIntForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (long long int)longLongIntForColumnIndex:(int)columnIdx { + return sqlite3_column_int64([_statement statement], columnIdx); +} + +- (unsigned long long int)unsignedLongLongIntForColumn:(NSString*)columnName { + return [self unsignedLongLongIntForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (unsigned long long int)unsignedLongLongIntForColumnIndex:(int)columnIdx { + return (unsigned long long int)[self longLongIntForColumnIndex:columnIdx]; +} + +- (BOOL)boolForColumn:(NSString*)columnName { + return [self boolForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (BOOL)boolForColumnIndex:(int)columnIdx { + return ([self intForColumnIndex:columnIdx] != 0); +} + +- (double)doubleForColumn:(NSString*)columnName { + return [self doubleForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (double)doubleForColumnIndex:(int)columnIdx { + return sqlite3_column_double([_statement statement], columnIdx); +} + +- (NSString*)stringForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + const char *c = (const char *)sqlite3_column_text([_statement statement], columnIdx); + + if (!c) { + // null row. + return nil; + } + + return [NSString stringWithUTF8String:c]; +} + +- (NSString*)stringForColumn:(NSString*)columnName { + return [self stringForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSDate*)dateForColumn:(NSString*)columnName { + return [self dateForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSDate*)dateForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + return [_parentDB hasDateFormatter] ? [_parentDB dateFromString:[self stringForColumnIndex:columnIdx]] : [NSDate dateWithTimeIntervalSince1970:[self doubleForColumnIndex:columnIdx]]; +} + + +- (NSData*)dataForColumn:(NSString*)columnName { + return [self dataForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSData*)dataForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + const char *dataBuffer = sqlite3_column_blob([_statement statement], columnIdx); + int dataSize = sqlite3_column_bytes([_statement statement], columnIdx); + + if (dataBuffer == NULL) { + return nil; + } + + return [NSData dataWithBytes:(const void *)dataBuffer length:(NSUInteger)dataSize]; +} + + +- (NSData*)dataNoCopyForColumn:(NSString*)columnName { + return [self dataNoCopyForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSData*)dataNoCopyForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + const char *dataBuffer = sqlite3_column_blob([_statement statement], columnIdx); + int dataSize = sqlite3_column_bytes([_statement statement], columnIdx); + + NSData *data = [NSData dataWithBytesNoCopy:(void *)dataBuffer length:(NSUInteger)dataSize freeWhenDone:NO]; + + return data; +} + + +- (BOOL)columnIndexIsNull:(int)columnIdx { + return sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL; +} + +- (BOOL)columnIsNull:(NSString*)columnName { + return [self columnIndexIsNull:[self columnIndexForName:columnName]]; +} + +- (const unsigned char *)UTF8StringForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) { + return nil; + } + + return sqlite3_column_text([_statement statement], columnIdx); +} + +- (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName { + return [self UTF8StringForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (id)objectForColumnIndex:(int)columnIdx { + int columnType = sqlite3_column_type([_statement statement], columnIdx); + + id returnValue = nil; + + if (columnType == SQLITE_INTEGER) { + returnValue = [NSNumber numberWithLongLong:[self longLongIntForColumnIndex:columnIdx]]; + } + else if (columnType == SQLITE_FLOAT) { + returnValue = [NSNumber numberWithDouble:[self doubleForColumnIndex:columnIdx]]; + } + else if (columnType == SQLITE_BLOB) { + returnValue = [self dataForColumnIndex:columnIdx]; + } + else { + //default to a string for everything else + returnValue = [self stringForColumnIndex:columnIdx]; + } + + if (returnValue == nil) { + returnValue = [NSNull null]; + } + + return returnValue; +} + +- (id)objectForColumnName:(NSString*)columnName { + return [self objectForColumnIndex:[self columnIndexForName:columnName]]; +} + +// returns autoreleased NSString containing the name of the column in the result set +- (NSString*)columnNameForIndex:(int)columnIdx { + return [NSString stringWithUTF8String: sqlite3_column_name([_statement statement], columnIdx)]; +} + +- (void)setParentDB:(FMDatabase *)newDb { + _parentDB = newDb; +} + +- (id)objectAtIndexedSubscript:(int)columnIdx { + return [self objectForColumnIndex:columnIdx]; +} + +- (id)objectForKeyedSubscript:(NSString *)columnName { + return [self objectForColumnName:columnName]; +} + + +@end diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h new file mode 120000 index 0000000..ac762c8 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperation.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h new file mode 120000 index 0000000..9dcc623 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPRequestOperationManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPRequestOperationManager.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h new file mode 120000 index 0000000..56feb9f --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFHTTPSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFHTTPSessionManager.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h new file mode 120000 index 0000000..67519d9 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworkActivityIndicatorManager.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h new file mode 120000 index 0000000..68fc774 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworkReachabilityManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworkReachabilityManager.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworking.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworking.h new file mode 120000 index 0000000..a5a38da --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFNetworking.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h new file mode 120000 index 0000000..fd1322d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFSecurityPolicy.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFSecurityPolicy.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h new file mode 120000 index 0000000..d9b35fb --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLConnectionOperation.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLConnectionOperation.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h new file mode 120000 index 0000000..ca8209b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLRequestSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLRequestSerialization.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h new file mode 120000 index 0000000..e36a765 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLResponseSerialization.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLResponseSerialization.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h new file mode 120000 index 0000000..835101d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/AFURLSessionManager.h @@ -0,0 +1 @@ +../../../AFNetworking/AFNetworking/AFURLSessionManager.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h new file mode 120000 index 0000000..c534ebf --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIActivityIndicatorView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h new file mode 120000 index 0000000..f992813 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIAlertView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIAlertView+AFNetworking.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h new file mode 120000 index 0000000..8f2e221 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIButton+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIButton+AFNetworking.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h new file mode 120000 index 0000000..a95d673 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIImageView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIImageView+AFNetworking.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h new file mode 120000 index 0000000..95017cc --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIKit+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIKit+AFNetworking.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h new file mode 120000 index 0000000..730b167 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIProgressView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIProgressView+AFNetworking.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h new file mode 120000 index 0000000..8efd826 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIRefreshControl+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIRefreshControl+AFNetworking.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h new file mode 120000 index 0000000..c8df6ef --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/AFNetworking/UIWebView+AFNetworking.h @@ -0,0 +1 @@ +../../../AFNetworking/UIKit+AFNetworking/UIWebView+AFNetworking.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDB.h b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDB.h new file mode 120000 index 0000000..bcd6e0a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDB.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDB.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabase.h b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabase.h new file mode 120000 index 0000000..e69b333 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabase.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabase.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabaseAdditions.h b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabaseAdditions.h new file mode 120000 index 0000000..b48a6a3 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabaseAdditions.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabaseAdditions.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabasePool.h b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabasePool.h new file mode 120000 index 0000000..1d78001 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabasePool.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabasePool.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabaseQueue.h b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabaseQueue.h new file mode 120000 index 0000000..9adde87 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMDatabaseQueue.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabaseQueue.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMResultSet.h b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMResultSet.h new file mode 120000 index 0000000..fd761d8 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/FMDB/FMResultSet.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMResultSet.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefresh.h b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefresh.h new file mode 120000 index 0000000..f6ae748 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefresh.h @@ -0,0 +1 @@ +../../../MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefresh.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshBaseView.h b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshBaseView.h new file mode 120000 index 0000000..25f5bbe --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshBaseView.h @@ -0,0 +1 @@ +../../../MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshConst.h b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshConst.h new file mode 120000 index 0000000..933687e --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshConst.h @@ -0,0 +1 @@ +../../../MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshFooterView.h b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshFooterView.h new file mode 120000 index 0000000..dd3351d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshFooterView.h @@ -0,0 +1 @@ +../../../MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshHeaderView.h b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshHeaderView.h new file mode 120000 index 0000000..2895442 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/MJRefreshHeaderView.h @@ -0,0 +1 @@ +../../../MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIScrollView+MJExtension.h b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIScrollView+MJExtension.h new file mode 120000 index 0000000..be6e18a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIScrollView+MJExtension.h @@ -0,0 +1 @@ +../../../MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIScrollView+MJRefresh.h b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIScrollView+MJRefresh.h new file mode 120000 index 0000000..968b9e9 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIScrollView+MJRefresh.h @@ -0,0 +1 @@ +../../../MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIView+MJExtension.h b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIView+MJExtension.h new file mode 120000 index 0000000..75464ee --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/MJRefresh/UIView+MJExtension.h @@ -0,0 +1 @@ +../../../MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTKeyPathCoding.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTKeyPathCoding.h new file mode 120000 index 0000000..5a7863b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTKeyPathCoding.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/extobjc/EXTKeyPathCoding.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTRuntimeExtensions.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTRuntimeExtensions.h new file mode 120000 index 0000000..e61abdf --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTRuntimeExtensions.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/extobjc/EXTRuntimeExtensions.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTScope.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTScope.h new file mode 120000 index 0000000..4f0b7cf --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/EXTScope.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/extobjc/EXTScope.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLJSONAdapter.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLJSONAdapter.h new file mode 120000 index 0000000..8ff5c15 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLJSONAdapter.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/MTLJSONAdapter.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLManagedObjectAdapter.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLManagedObjectAdapter.h new file mode 120000 index 0000000..d30d351 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLManagedObjectAdapter.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/MTLManagedObjectAdapter.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLModel+NSCoding.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLModel+NSCoding.h new file mode 120000 index 0000000..549748e --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLModel+NSCoding.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/MTLModel+NSCoding.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLModel.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLModel.h new file mode 120000 index 0000000..c1dd5c0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLModel.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/MTLModel.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLReflection.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLReflection.h new file mode 120000 index 0000000..e0fa0b2 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLReflection.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/MTLReflection.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLValueTransformer.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLValueTransformer.h new file mode 120000 index 0000000..c999e46 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/MTLValueTransformer.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/MTLValueTransformer.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/Mantle.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/Mantle.h new file mode 120000 index 0000000..b3a3b59 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/Mantle.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/Mantle.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSArray+MTLManipulationAdditions.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSArray+MTLManipulationAdditions.h new file mode 120000 index 0000000..72a74e5 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSArray+MTLManipulationAdditions.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/NSArray+MTLManipulationAdditions.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSDictionary+MTLManipulationAdditions.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSDictionary+MTLManipulationAdditions.h new file mode 120000 index 0000000..d27d0f6 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSDictionary+MTLManipulationAdditions.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/NSDictionary+MTLManipulationAdditions.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSError+MTLModelException.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSError+MTLModelException.h new file mode 120000 index 0000000..71a67b0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSError+MTLModelException.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/NSError+MTLModelException.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSObject+MTLComparisonAdditions.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSObject+MTLComparisonAdditions.h new file mode 120000 index 0000000..a2c2ca1 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSObject+MTLComparisonAdditions.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/NSObject+MTLComparisonAdditions.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSValueTransformer+MTLInversionAdditions.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSValueTransformer+MTLInversionAdditions.h new file mode 120000 index 0000000..86e393a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSValueTransformer+MTLInversionAdditions.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h new file mode 120000 index 0000000..c308137 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/metamacros.h b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/metamacros.h new file mode 120000 index 0000000..9f63856 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/Mantle/metamacros.h @@ -0,0 +1 @@ +../../../Mantle/Mantle/extobjc/metamacros.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/NSData+ImageContentType.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/NSData+ImageContentType.h new file mode 120000 index 0000000..8457498 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/NSData+ImageContentType.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/NSData+ImageContentType.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDImageCache.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDImageCache.h new file mode 120000 index 0000000..0040b06 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDImageCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDImageCache.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageCompat.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageCompat.h new file mode 120000 index 0000000..6ca2478 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageCompat.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageCompat.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDecoder.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDecoder.h new file mode 120000 index 0000000..a2f3a68 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDecoder.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageDecoder.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDownloader.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDownloader.h new file mode 120000 index 0000000..303b03b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDownloader.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageDownloader.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDownloaderOperation.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDownloaderOperation.h new file mode 120000 index 0000000..99441c4 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageDownloaderOperation.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageManager.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageManager.h new file mode 120000 index 0000000..1b81848 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageManager.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageManager.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageOperation.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageOperation.h new file mode 120000 index 0000000..20e5b89 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImageOperation.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImageOperation.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImagePrefetcher.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImagePrefetcher.h new file mode 120000 index 0000000..50585c6 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/SDWebImagePrefetcher.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDWebImagePrefetcher.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIButton+WebCache.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIButton+WebCache.h new file mode 120000 index 0000000..19d2d8e --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIButton+WebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIButton+WebCache.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImage+GIF.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImage+GIF.h new file mode 120000 index 0000000..14d5aad --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImage+GIF.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIImage+GIF.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImage+MultiFormat.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImage+MultiFormat.h new file mode 120000 index 0000000..1fb9650 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImage+MultiFormat.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIImage+MultiFormat.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImageView+HighlightedWebCache.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImageView+HighlightedWebCache.h new file mode 120000 index 0000000..fd4dea4 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImageView+HighlightedWebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImageView+WebCache.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImageView+WebCache.h new file mode 120000 index 0000000..0c53a47 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIImageView+WebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIImageView+WebCache.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIView+WebCacheOperation.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIView+WebCacheOperation.h new file mode 120000 index 0000000..f9890c4 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SDWebImage/UIView+WebCacheOperation.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIView+WebCacheOperation.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SVProgressHUD/SVIndefiniteAnimatedView.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SVProgressHUD/SVIndefiniteAnimatedView.h new file mode 120000 index 0000000..55a38a2 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SVProgressHUD/SVIndefiniteAnimatedView.h @@ -0,0 +1 @@ +../../../SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SVProgressHUD/SVProgressHUD.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SVProgressHUD/SVProgressHUD.h new file mode 120000 index 0000000..608a8aa --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SVProgressHUD/SVProgressHUD.h @@ -0,0 +1 @@ +../../../SVProgressHUD/SVProgressHUD/SVProgressHUD.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVModalWebViewController.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVModalWebViewController.h new file mode 120000 index 0000000..5178191 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVModalWebViewController.h @@ -0,0 +1 @@ +../../../SVWebViewController/SVWebViewController/SVModalWebViewController.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewController.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewController.h new file mode 120000 index 0000000..5f44ce2 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewController.h @@ -0,0 +1 @@ +../../../SVWebViewController/SVWebViewController/SVWebViewController.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivity.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivity.h new file mode 120000 index 0000000..0224985 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivity.h @@ -0,0 +1 @@ +../../../SVWebViewController/SVWebViewController/UIActivities/SVWebViewControllerActivity.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivityChrome.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivityChrome.h new file mode 120000 index 0000000..50166ae --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivityChrome.h @@ -0,0 +1 @@ +../../../SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivitySafari.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivitySafari.h new file mode 120000 index 0000000..a01e248 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SVWebViewController/SVWebViewControllerActivitySafari.h @@ -0,0 +1 @@ +../../../SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/NSMutableArray+SWUtilityButtons.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/NSMutableArray+SWUtilityButtons.h new file mode 120000 index 0000000..c64bfc9 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/NSMutableArray+SWUtilityButtons.h @@ -0,0 +1 @@ +../../../SWTableViewCell/SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWCellScrollView.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWCellScrollView.h new file mode 120000 index 0000000..c6e86c6 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWCellScrollView.h @@ -0,0 +1 @@ +../../../SWTableViewCell/SWTableViewCell/PodFiles/SWCellScrollView.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWLongPressGestureRecognizer.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWLongPressGestureRecognizer.h new file mode 120000 index 0000000..1f3a0ad --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWLongPressGestureRecognizer.h @@ -0,0 +1 @@ +../../../SWTableViewCell/SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWTableViewCell.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWTableViewCell.h new file mode 120000 index 0000000..d3256e4 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWTableViewCell.h @@ -0,0 +1 @@ +../../../SWTableViewCell/SWTableViewCell/PodFiles/SWTableViewCell.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWUtilityButtonTapGestureRecognizer.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWUtilityButtonTapGestureRecognizer.h new file mode 120000 index 0000000..53a975d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWUtilityButtonTapGestureRecognizer.h @@ -0,0 +1 @@ +../../../SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWUtilityButtonView.h b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWUtilityButtonView.h new file mode 120000 index 0000000..66c02f1 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Headers/Public/SWTableViewCell/SWUtilityButtonView.h @@ -0,0 +1 @@ +../../../SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonView.h \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/LICENSE b/iOSStudy/iOSStudy/Pods/MJRefresh/LICENSE new file mode 100644 index 0000000..7f7ecfd --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013-2014 MJRefresh (https://github.com/CoderMJLee/MJRefresh) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefresh.bundle/arrow@2x.png b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefresh.bundle/arrow@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..a016473bd39b7699fd0fb008cb523fa0319b846d GIT binary patch literal 3044 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 mAO806FPVMYIp>E6A%qY@XlxH{!6VlI0000 [self.tableView headerBeginRefreshing]; + 2> [self.tableView footerBeginRefreshing]; + + 6.结束刷新 + 1> [self.tableView headerEndRefreshing]; + 2> [self.tableView footerEndRefreshing]; +*/ \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.h b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.h new file mode 100755 index 0000000..b52a482 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.h @@ -0,0 +1,78 @@ +// +// MJRefreshBaseView.h +// MJRefresh +// +// Created by mj on 13-3-4. +// Copyright (c) 2013年 itcast. All rights reserved. + +#import + +@class MJRefreshBaseView; + +#pragma mark - 控件的刷新状态 +typedef enum { + MJRefreshStatePulling = 1, // 松开就可以进行刷新的状态 + MJRefreshStateNormal = 2, // 普通状态 + MJRefreshStateRefreshing = 3, // 正在刷新中的状态 + MJRefreshStateWillRefreshing = 4 +} MJRefreshState; + +#pragma mark - 控件的类型 +typedef enum { + MJRefreshViewTypeHeader = -1, // 头部控件 + MJRefreshViewTypeFooter = 1 // 尾部控件 +} MJRefreshViewType; + +/** + 类的声明 + */ +@interface MJRefreshBaseView : UIView +#pragma mark - 父控件 +@property (nonatomic, weak, readonly) UIScrollView *scrollView; +@property (nonatomic, assign, readonly) UIEdgeInsets scrollViewOriginalInset; + +#pragma mark - 内部的控件 +@property (nonatomic, weak, readonly) UILabel *statusLabel; +@property (nonatomic, weak, readonly) UIImageView *arrowImage; +@property (nonatomic, weak, readonly) UIActivityIndicatorView *activityView; + +#pragma mark - 回调 +/** + * 开始进入刷新状态的监听器 + */ +@property (weak, nonatomic) id beginRefreshingTaget; +/** + * 开始进入刷新状态的监听方法 + */ +@property (assign, nonatomic) SEL beginRefreshingAction; +/** + * 开始进入刷新状态就会调用 + */ +@property (nonatomic, copy) void (^beginRefreshingCallback)(); + +#pragma mark - 刷新相关 +/** + * 是否正在刷新 + */ +@property (nonatomic, readonly, getter=isRefreshing) BOOL refreshing; +/** + * 开始刷新 + */ +- (void)beginRefreshing; +/** + * 结束刷新 + */ +- (void)endRefreshing; + +#pragma mark - 交给子类去实现 和 调用 +@property (assign, nonatomic) MJRefreshState state; +/** 处于刷新结束的状态 */ +@property (readonly, getter=isEndingRefresh) BOOL endingRefresh; + +/** + * 文字 + */ +@property (copy, nonatomic) NSString *pullToRefreshText; +@property (copy, nonatomic) NSString *releaseToRefreshText; +@property (copy, nonatomic) NSString *refreshingText; +@end \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.m b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.m new file mode 100755 index 0000000..50aedfa --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.m @@ -0,0 +1,291 @@ +// +// MJRefreshBaseView.m +// MJRefresh +// +// Created by mj on 13-3-4. +// Copyright (c) 2013年 itcast. All rights reserved. +// + +#import "MJRefreshBaseView.h" +#import "MJRefreshConst.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" +#import + +@interface MJRefreshBaseView() +{ + __weak UILabel *_statusLabel; + __weak UIImageView *_arrowImage; + __weak UIActivityIndicatorView *_activityView; + BOOL _endingRefresh; +} +@end + +@implementation MJRefreshBaseView +#pragma mark - 控件初始化 +/** + * 状态标签 + */ +- (UILabel *)statusLabel +{ + if (!_statusLabel) { + UILabel *statusLabel = [[UILabel alloc] init]; + statusLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; + statusLabel.font = [UIFont boldSystemFontOfSize:13]; + statusLabel.textColor = MJRefreshLabelTextColor; + statusLabel.backgroundColor = [UIColor clearColor]; + statusLabel.textAlignment = NSTextAlignmentCenter; + [self addSubview:_statusLabel = statusLabel]; + } + return _statusLabel; +} + +/** + * 箭头图片 + */ +- (UIImageView *)arrowImage +{ + if (!_arrowImage) { + UIImageView *arrowImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:MJRefreshSrcName(@"arrow.png")]]; + arrowImage.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; + [self addSubview:_arrowImage = arrowImage]; + } + return _arrowImage; +} + +/** + * 状态标签 + */ +- (UIActivityIndicatorView *)activityView +{ + if (!_activityView) { + UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; + activityView.bounds = self.arrowImage.bounds; + activityView.autoresizingMask = self.arrowImage.autoresizingMask; + [self addSubview:_activityView = activityView]; + } + return _activityView; +} + +#pragma mark - 初始化方法 +- (instancetype)initWithFrame:(CGRect)frame { + frame.size.height = MJRefreshViewHeight; + if (self = [super initWithFrame:frame]) { + // 1.自己的属性 + self.autoresizingMask = UIViewAutoresizingFlexibleWidth; + self.backgroundColor = [UIColor clearColor]; + + // 2.设置默认状态 + self.state = MJRefreshStateNormal; + } + return self; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + // 1.箭头 + CGFloat arrowX = self.mj_width * 0.5 - 100; + self.arrowImage.center = CGPointMake(arrowX, self.mj_height * 0.5); + + // 2.指示器 + self.activityView.center = self.arrowImage.center; +} + +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + // 旧的父控件 + [self.superview removeObserver:self forKeyPath:MJRefreshContentOffset context:nil]; + + if (newSuperview) { // 新的父控件 + [newSuperview addObserver:self forKeyPath:MJRefreshContentOffset options:NSKeyValueObservingOptionNew context:nil]; + + // 设置宽度 + self.mj_width = newSuperview.mj_width; + // 设置位置 + self.mj_x = 0; + + // 记录UIScrollView + _scrollView = (UIScrollView *)newSuperview; + // 设置永远支持垂直弹簧效果 + _scrollView.alwaysBounceVertical = YES; + // 记录UIScrollView最开始的contentInset + _scrollViewOriginalInset = _scrollView.contentInset; + } +} + +#pragma mark - 显示到屏幕上 +- (void)drawRect:(CGRect)rect +{ + if (self.state == MJRefreshStateWillRefreshing) { + self.state = MJRefreshStateRefreshing; + } +} + +#pragma mark - 刷新相关 +#pragma mark 是否正在刷新 +- (BOOL)isRefreshing +{ + return MJRefreshStateRefreshing == self.state; +} + +#pragma mark 开始刷新 +- (void)beginRefreshing +{ + if (self.state == MJRefreshStateRefreshing) { + // 回调 + if ([self.beginRefreshingTaget respondsToSelector:self.beginRefreshingAction]) { + msgSend(msgTarget(self.beginRefreshingTaget), self.beginRefreshingAction, self); + } + + if (self.beginRefreshingCallback) { + self.beginRefreshingCallback(); + } + } else { + if (self.window) { + self.state = MJRefreshStateRefreshing; + } else { + //#warning 不能调用set方法 + _state = MJRefreshStateWillRefreshing; + +//#warning 为了保证在viewWillAppear等方法中也能刷新 + [self setNeedsDisplay]; + } + } +} + +#pragma mark 结束刷新 +- (void)endRefreshing +{ + double delayInSeconds = 0.3; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + self.state = MJRefreshStateNormal; + }); +} + +#pragma mark - 设置状态 +- (void)setPullToRefreshText:(NSString *)pullToRefreshText +{ + _pullToRefreshText = [pullToRefreshText copy]; + [self settingLabelText]; +} +- (void)setReleaseToRefreshText:(NSString *)releaseToRefreshText +{ + _releaseToRefreshText = [releaseToRefreshText copy]; + [self settingLabelText]; +} +- (void)setRefreshingText:(NSString *)refreshingText +{ + _refreshingText = [refreshingText copy]; + [self settingLabelText]; +} +- (void)settingLabelText +{ + switch (self.state) { + case MJRefreshStateNormal: + // 设置文字 + self.statusLabel.text = self.pullToRefreshText; + break; + case MJRefreshStatePulling: + // 设置文字 + self.statusLabel.text = self.releaseToRefreshText; + break; + case MJRefreshStateRefreshing: + // 设置文字 + self.statusLabel.text = self.refreshingText; + break; + default: + break; + } +} + +- (void)setState:(MJRefreshState)state +{ + // 0.存储当前的contentInset + if (self.state != MJRefreshStateRefreshing) { + _scrollViewOriginalInset = self.scrollView.contentInset; + } + + // 1.一样的就直接返回(暂时不返回) + if (self.state == state) return; + + // 2.旧状态 + MJRefreshState oldState = self.state; + + // 3.存储状态 + _state = state; + + // 4.根据状态执行不同的操作 + switch (state) { + case MJRefreshStateNormal: // 普通状态 + { + if (oldState == MJRefreshStateRefreshing) { + // 正在结束刷新 + _endingRefresh = YES; + + [UIView animateWithDuration:MJRefreshSlowAnimationDuration * 0.6 animations:^{ + self.activityView.alpha = 0.0; + } completion:^(BOOL finished) { + // 停止转圈圈 + [self.activityView stopAnimating]; + + // 恢复alpha + self.activityView.alpha = 1.0; + }]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(MJRefreshSlowAnimationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 等头部回去 + // 显示箭头 + self.arrowImage.hidden = NO; + + // 停止转圈圈 + [self.activityView stopAnimating]; + + // 设置文字 + [self settingLabelText]; + + // 结束刷新完毕 + _endingRefresh = NO; + }); + // 直接返回 + return; + } else { + // 显示箭头 + self.arrowImage.hidden = NO; + + // 停止转圈圈 + [self.activityView stopAnimating]; + } + break; + } + + case MJRefreshStatePulling: + break; + + case MJRefreshStateRefreshing: + { + // 开始转圈圈 + [self.activityView startAnimating]; + // 隐藏箭头 + self.arrowImage.hidden = YES; + + // 回调 + if ([self.beginRefreshingTaget respondsToSelector:self.beginRefreshingAction]) { + msgSend(msgTarget(self.beginRefreshingTaget), self.beginRefreshingAction, self); + } + + if (self.beginRefreshingCallback) { + self.beginRefreshingCallback(); + } + break; + } + default: + break; + } + + // 5.设置文字 + [self settingLabelText]; +} +@end \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.h b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.h new file mode 100755 index 0000000..ae71f2a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.h @@ -0,0 +1,41 @@ +// +// MJRefreshConst.h +// MJRefresh +// +// Created by mj on 14-1-3. +// Copyright (c) 2014年 itcast. All rights reserved. +// +#import + +#ifdef DEBUG +#define MJLog(...) NSLog(__VA_ARGS__) +#else +#define MJLog(...) +#endif + +// objc_msgSend +#define msgSend(...) ((void (*)(void *, SEL, UIView *))objc_msgSend)(__VA_ARGS__) +#define msgTarget(target) (__bridge void *)(target) + +#define MJColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0] +// 文字颜色 +#define MJRefreshLabelTextColor MJColor(150, 150, 150) + +// 图片路径 +#define MJRefreshSrcName(file) [@"MJRefresh.bundle" stringByAppendingPathComponent:file] + +UIKIT_EXTERN const CGFloat MJRefreshViewHeight; +UIKIT_EXTERN const CGFloat MJRefreshFastAnimationDuration; +UIKIT_EXTERN const CGFloat MJRefreshSlowAnimationDuration; + +UIKIT_EXTERN NSString *const MJRefreshFooterPullToRefresh; +UIKIT_EXTERN NSString *const MJRefreshFooterReleaseToRefresh; +UIKIT_EXTERN NSString *const MJRefreshFooterRefreshing; + +UIKIT_EXTERN NSString *const MJRefreshHeaderPullToRefresh; +UIKIT_EXTERN NSString *const MJRefreshHeaderReleaseToRefresh; +UIKIT_EXTERN NSString *const MJRefreshHeaderRefreshing; +UIKIT_EXTERN NSString *const MJRefreshHeaderTimeKey; + +UIKIT_EXTERN NSString *const MJRefreshContentOffset; +extern NSString *const MJRefreshContentSize; \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.m b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.m new file mode 100755 index 0000000..8280e44 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.m @@ -0,0 +1,25 @@ +// +// MJRefreshConst.m +// MJRefresh +// +// Created by mj on 14-1-3. +// Copyright (c) 2014年 itcast. All rights reserved. +// + +#import + +const CGFloat MJRefreshViewHeight = 64.0; +const CGFloat MJRefreshFastAnimationDuration = 0.25; +const CGFloat MJRefreshSlowAnimationDuration = 0.4; + +NSString *const MJRefreshFooterPullToRefresh = @"上拉可以加载更多数据"; +NSString *const MJRefreshFooterReleaseToRefresh = @"松开立即加载更多数据"; +NSString *const MJRefreshFooterRefreshing = @"正在帮你加载数据..."; + +NSString *const MJRefreshHeaderPullToRefresh = @"下拉可以刷新"; +NSString *const MJRefreshHeaderReleaseToRefresh = @"松开立即刷新"; +NSString *const MJRefreshHeaderRefreshing = @"正在帮你刷新..."; +NSString *const MJRefreshHeaderTimeKey = @"MJRefreshHeaderView"; + +NSString *const MJRefreshContentOffset = @"contentOffset"; +NSString *const MJRefreshContentSize = @"contentSize"; \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.h b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.h new file mode 100755 index 0000000..0d0b94d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.h @@ -0,0 +1,13 @@ +// +// MJRefreshTableFooterView.h +// MJRefresh +// +// Created by mj on 13-2-26. +// Copyright (c) 2013年 itcast. All rights reserved. +// 上拉加载更多 + +#import "MJRefreshBaseView.h" + +@interface MJRefreshFooterView : MJRefreshBaseView ++ (instancetype)footer; +@end \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.m b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.m new file mode 100755 index 0000000..4f22bb2 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.m @@ -0,0 +1,226 @@ +// +// MJRefreshFooterView.m +// MJRefresh +// +// Created by mj on 13-2-26. +// Copyright (c) 2013年 itcast. All rights reserved. +// 上拉加载更多 + +#import "MJRefreshFooterView.h" +#import "MJRefreshConst.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" + +@interface MJRefreshFooterView() +@property (assign, nonatomic) NSInteger lastRefreshCount; +@end + +@implementation MJRefreshFooterView + ++ (instancetype)footer +{ + return [[MJRefreshFooterView alloc] init]; +} + +- (id)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + self.pullToRefreshText = MJRefreshFooterPullToRefresh; + self.releaseToRefreshText = MJRefreshFooterReleaseToRefresh; + self.refreshingText = MJRefreshFooterRefreshing; + } + return self; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + self.statusLabel.frame = self.bounds; +} + +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + // 旧的父控件 + [self.superview removeObserver:self forKeyPath:MJRefreshContentSize context:nil]; + + if (newSuperview) { // 新的父控件 + // 监听 + [newSuperview addObserver:self forKeyPath:MJRefreshContentSize options:NSKeyValueObservingOptionNew context:nil]; + + // 重新调整frame + [self adjustFrameWithContentSize]; + } +} + +#pragma mark 重写调整frame +- (void)adjustFrameWithContentSize +{ + // 内容的高度 + CGFloat contentHeight = self.scrollView.mj_contentSizeHeight; + // 表格的高度 + CGFloat scrollHeight = self.scrollView.mj_height - self.scrollViewOriginalInset.top - self.scrollViewOriginalInset.bottom; + // 设置位置和尺寸 + self.mj_y = MAX(contentHeight, scrollHeight); +} + +#pragma mark 监听UIScrollView的属性 +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + // 不能跟用户交互,直接返回 + if (!self.userInteractionEnabled || self.alpha <= 0.01 || self.hidden) return; + + if ([MJRefreshContentSize isEqualToString:keyPath]) { + // 调整frame + [self adjustFrameWithContentSize]; + } else if ([MJRefreshContentOffset isEqualToString:keyPath]) { +//#warning 这个返回一定要放这个位置 + // 如果正在刷新,直接返回 + if (self.state == MJRefreshStateRefreshing || self.endingRefresh) return; + + // 调整状态 + [self adjustStateWithContentOffset]; + } +} + +/** + * 调整状态 + */ +- (void)adjustStateWithContentOffset +{ + // 当前的contentOffset + CGFloat currentOffsetY = self.scrollView.mj_contentOffsetY; + // 尾部控件刚好出现的offsetY + CGFloat happenOffsetY = [self happenOffsetY]; + + // 如果是向下滚动到看不见尾部控件,直接返回 + if (currentOffsetY <= happenOffsetY) return; + + if (self.scrollView.isDragging) { + // 普通 和 即将刷新 的临界点 + CGFloat normal2pullingOffsetY = happenOffsetY + self.mj_height; + + if (self.state == MJRefreshStateNormal && currentOffsetY > normal2pullingOffsetY) { + // 转为即将刷新状态 + self.state = MJRefreshStatePulling; + } else if (self.state == MJRefreshStatePulling && currentOffsetY <= normal2pullingOffsetY) { + // 转为普通状态 + self.state = MJRefreshStateNormal; + } + } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 + // 开始刷新 + self.state = MJRefreshStateRefreshing; + } +} + +#pragma mark - 状态相关 +#pragma mark 设置状态 +- (void)setState:(MJRefreshState)state +{ + // 1.一样的就直接返回 + if (self.state == state) return; + + // 2.保存旧状态 + MJRefreshState oldState = self.state; + + // 3.调用父类方法 + [super setState:state]; + + // 4.根据状态来设置属性 + switch (state) + { + case MJRefreshStateNormal: + { + // 刷新完毕 + if (MJRefreshStateRefreshing == oldState) { + self.arrowImage.transform = CGAffineTransformMakeRotation(M_PI); + [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ + self.scrollView.mj_contentInsetBottom = self.scrollViewOriginalInset.bottom; + }]; + } else { + // 执行动画 + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + self.arrowImage.transform = CGAffineTransformMakeRotation(M_PI); + }]; + } + + CGFloat deltaH = [self heightForContentBreakView]; + NSInteger currentCount = [self totalDataCountInScrollView]; + // 刚刷新完毕 + if (MJRefreshStateRefreshing == oldState && deltaH > 0 && currentCount != self.lastRefreshCount) { + self.scrollView.mj_contentOffsetY = self.scrollView.mj_contentOffsetY; + } + break; + } + + case MJRefreshStatePulling: + { + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + self.arrowImage.transform = CGAffineTransformIdentity; + }]; + break; + } + + case MJRefreshStateRefreshing: + { + // 记录刷新前的数量 + self.lastRefreshCount = [self totalDataCountInScrollView]; + + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + CGFloat bottom = self.mj_height + self.scrollViewOriginalInset.bottom; + CGFloat deltaH = [self heightForContentBreakView]; + if (deltaH < 0) { // 如果内容高度小于view的高度 + bottom -= deltaH; + } + self.scrollView.mj_contentInsetBottom = bottom; + }]; + break; + } + + default: + break; + } +} + +- (NSInteger)totalDataCountInScrollView +{ + NSInteger totalCount = 0; + if ([self.scrollView isKindOfClass:[UITableView class]]) { + UITableView *tableView = (UITableView *)self.scrollView; + + for (NSInteger section = 0; section 0) { + return deltaH - self.scrollViewOriginalInset.top; + } else { + return - self.scrollViewOriginalInset.top; + } +} +@end \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.h b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.h new file mode 100755 index 0000000..3c7ff9f --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.h @@ -0,0 +1,16 @@ +// +// MJRefreshHeaderView.h +// MJRefresh +// +// Created by mj on 13-2-26. +// Copyright (c) 2013年 itcast. All rights reserved. +// 下拉刷新 + +#import "MJRefreshBaseView.h" + +@interface MJRefreshHeaderView : MJRefreshBaseView + +@property (nonatomic, copy) NSString *dateKey; ++ (instancetype)header; + +@end \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.m b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.m new file mode 100755 index 0000000..7e0b524 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.m @@ -0,0 +1,245 @@ +// +// MJRefreshHeaderView.m +// MJRefresh +// +// Created by mj on 13-2-26. +// Copyright (c) 2013年 itcast. All rights reserved. +// 下拉刷新 + +#import "MJRefreshConst.h" +#import "MJRefreshHeaderView.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" + +@interface MJRefreshHeaderView() +// 最后的更新时间 +@property (nonatomic, strong) NSDate *lastUpdateTime; +@property (nonatomic, weak) UILabel *lastUpdateTimeLabel; +@end + +@implementation MJRefreshHeaderView +#pragma mark - 控件初始化 +/** + * 时间标签 + */ +- (UILabel *)lastUpdateTimeLabel +{ + if (!_lastUpdateTimeLabel) { + // 1.创建控件 + UILabel *lastUpdateTimeLabel = [[UILabel alloc] init]; + lastUpdateTimeLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; + lastUpdateTimeLabel.font = [UIFont boldSystemFontOfSize:12]; + lastUpdateTimeLabel.textColor = MJRefreshLabelTextColor; + lastUpdateTimeLabel.backgroundColor = [UIColor clearColor]; + lastUpdateTimeLabel.textAlignment = NSTextAlignmentCenter; + [self addSubview:_lastUpdateTimeLabel = lastUpdateTimeLabel]; + + // 2.加载时间 + if(self.dateKey){ + self.lastUpdateTime = [[NSUserDefaults standardUserDefaults] objectForKey:self.dateKey]; + } else { + self.lastUpdateTime = [[NSUserDefaults standardUserDefaults] objectForKey:MJRefreshHeaderTimeKey]; + } + } + return _lastUpdateTimeLabel; +} + ++ (instancetype)header +{ + return [[MJRefreshHeaderView alloc] init]; +} + +- (id)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + self.pullToRefreshText = MJRefreshHeaderPullToRefresh; + self.releaseToRefreshText = MJRefreshHeaderReleaseToRefresh; + self.refreshingText = MJRefreshHeaderRefreshing; + } + return self; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + CGFloat statusX = 0; + CGFloat statusY = 0; + CGFloat statusHeight = self.mj_height * 0.5; + CGFloat statusWidth = self.mj_width; + // 1.状态标签 + self.statusLabel.frame = CGRectMake(statusX, statusY, statusWidth, statusHeight); + + // 2.时间标签 + CGFloat lastUpdateY = statusHeight; + CGFloat lastUpdateX = 0; + CGFloat lastUpdateHeight = statusHeight; + CGFloat lastUpdateWidth = statusWidth; + self.lastUpdateTimeLabel.frame = CGRectMake(lastUpdateX, lastUpdateY, lastUpdateWidth, lastUpdateHeight); +} + +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + // 设置自己的位置和尺寸 + self.mj_y = - self.mj_height; +} + +#pragma mark - 状态相关 +#pragma mark 设置最后的更新时间 +- (void)setLastUpdateTime:(NSDate *)lastUpdateTime +{ + _lastUpdateTime = lastUpdateTime; + + // 1.归档 + if(self.dateKey){ + [[NSUserDefaults standardUserDefaults] setObject:lastUpdateTime forKey:self.dateKey]; + } else{ + [[NSUserDefaults standardUserDefaults] setObject:lastUpdateTime forKey:MJRefreshHeaderTimeKey]; + } + [[NSUserDefaults standardUserDefaults] synchronize]; + + // 2.更新时间 + [self updateTimeLabel]; +} + +#pragma mark 更新时间字符串 +- (void)updateTimeLabel +{ + if (!self.lastUpdateTime) return; + + // 1.获得年月日 + NSCalendar *calendar = [NSCalendar currentCalendar]; + NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour |NSCalendarUnitMinute; + NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:_lastUpdateTime]; + NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]]; + + // 2.格式化日期 + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + if ([cmp1 day] == [cmp2 day]) { // 今天 + formatter.dateFormat = @"今天 HH:mm"; + } else if ([cmp1 year] == [cmp2 year]) { // 今年 + formatter.dateFormat = @"MM-dd HH:mm"; + } else { + formatter.dateFormat = @"yyyy-MM-dd HH:mm"; + } + NSString *time = [formatter stringFromDate:self.lastUpdateTime]; + + // 3.显示日期 + self.lastUpdateTimeLabel.text = [NSString stringWithFormat:@"最后更新:%@", time]; +} + +#pragma mark - 监听UIScrollView的contentOffset属性 +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + // 不能跟用户交互就直接返回 + if (!self.userInteractionEnabled || self.alpha <= 0.01 || self.hidden) return; + + // 如果正在刷新,直接返回 + if (self.state == MJRefreshStateRefreshing || self.endingRefresh) return; + + if ([MJRefreshContentOffset isEqualToString:keyPath]) { + [self adjustStateWithContentOffset]; + } +} + +/** + * 调整状态 + */ +- (void)adjustStateWithContentOffset +{ + // 当前的contentOffset + CGFloat currentOffsetY = self.scrollView.mj_contentOffsetY; + // 头部控件刚好出现的offsetY + CGFloat happenOffsetY = - self.scrollViewOriginalInset.top; + + // 如果是向上滚动到看不见头部控件,直接返回 + if (currentOffsetY >= happenOffsetY) return; + + if (self.scrollView.isDragging) { + // 普通 和 即将刷新 的临界点 + CGFloat normal2pullingOffsetY = happenOffsetY - self.mj_height; + + if (self.state == MJRefreshStateNormal && currentOffsetY < normal2pullingOffsetY) { + // 转为即将刷新状态 + self.state = MJRefreshStatePulling; + } else if (self.state == MJRefreshStatePulling && currentOffsetY >= normal2pullingOffsetY) { + // 转为普通状态 + self.state = MJRefreshStateNormal; + } + } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 + // 开始刷新 + self.state = MJRefreshStateRefreshing; + } +} + +#pragma mark 设置状态 +- (void)setState:(MJRefreshState)state +{ + // 1.一样的就直接返回 + if (self.state == state) return; + + // 2.保存旧状态 + MJRefreshState oldState = self.state; + + // 3.调用父类方法 + [super setState:state]; + + // 4.根据状态执行不同的操作 + switch (state) { + case MJRefreshStateNormal: // 下拉可以刷新 + { + // 刷新完毕 + if (MJRefreshStateRefreshing == oldState) { + self.arrowImage.transform = CGAffineTransformIdentity; + // 保存刷新时间 + self.lastUpdateTime = [NSDate date]; + + [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ +//#warning 这句代码修复了,top值不断累加的bug + if (self.scrollViewOriginalInset.top == 0) { + self.scrollView.mj_contentInsetTop = 0; + } else if (self.scrollViewOriginalInset.top == self.scrollView.mj_contentInsetTop) { + self.scrollView.mj_contentInsetTop -= self.mj_height; + } else { + self.scrollView.mj_contentInsetTop = self.scrollViewOriginalInset.top; + } + }]; + } else { + // 执行动画 + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + self.arrowImage.transform = CGAffineTransformIdentity; + }]; + } + break; + } + + case MJRefreshStatePulling: // 松开可立即刷新 + { + // 执行动画 + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + self.arrowImage.transform = CGAffineTransformMakeRotation(M_PI); + }]; + break; + } + + case MJRefreshStateRefreshing: // 正在刷新中 + { + // 执行动画 + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + // 1.增加滚动区域 + CGFloat top = self.scrollViewOriginalInset.top + self.mj_height; + self.scrollView.mj_contentInsetTop = top; + + // 2.设置滚动位置 + self.scrollView.mj_contentOffsetY = - top; + }]; + break; + } + + default: + break; + } +} +@end \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.h b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.h new file mode 100644 index 0000000..96f5283 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.h @@ -0,0 +1,22 @@ +// +// UIScrollView+Extension.h +// MJRefreshExample +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 itcast. All rights reserved. +// + +#import + +@interface UIScrollView (MJExtension) +@property (assign, nonatomic) CGFloat mj_contentInsetTop; +@property (assign, nonatomic) CGFloat mj_contentInsetBottom; +@property (assign, nonatomic) CGFloat mj_contentInsetLeft; +@property (assign, nonatomic) CGFloat mj_contentInsetRight; + +@property (assign, nonatomic) CGFloat mj_contentOffsetX; +@property (assign, nonatomic) CGFloat mj_contentOffsetY; + +@property (assign, nonatomic) CGFloat mj_contentSizeWidth; +@property (assign, nonatomic) CGFloat mj_contentSizeHeight; +@end diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.m b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.m new file mode 100644 index 0000000..0a5fe07 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.m @@ -0,0 +1,107 @@ +// +// UIScrollView+Extension.m +// MJRefreshExample +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 itcast. All rights reserved. +// + +#import "UIScrollView+MJExtension.h" + +@implementation UIScrollView (MJExtension) +- (void)setMj_contentInsetTop:(CGFloat)mj_contentInsetTop +{ + UIEdgeInsets inset = self.contentInset; + inset.top = mj_contentInsetTop; + self.contentInset = inset; +} + +- (CGFloat)mj_contentInsetTop +{ + return self.contentInset.top; +} + +- (void)setMj_contentInsetBottom:(CGFloat)mj_contentInsetBottom +{ + UIEdgeInsets inset = self.contentInset; + inset.bottom = mj_contentInsetBottom; + self.contentInset = inset; +} + +- (CGFloat)mj_contentInsetBottom +{ + return self.contentInset.bottom; +} + +- (void)setMj_contentInsetLeft:(CGFloat)mj_contentInsetLeft +{ + UIEdgeInsets inset = self.contentInset; + inset.left = mj_contentInsetLeft; + self.contentInset = inset; +} + +- (CGFloat)mj_contentInsetLeft +{ + return self.contentInset.left; +} + +- (void)setMj_contentInsetRight:(CGFloat)mj_contentInsetRight +{ + UIEdgeInsets inset = self.contentInset; + inset.right = mj_contentInsetRight; + self.contentInset = inset; +} + +- (CGFloat)mj_contentInsetRight +{ + return self.contentInset.right; +} + +- (void)setMj_contentOffsetX:(CGFloat)mj_contentOffsetX +{ + CGPoint offset = self.contentOffset; + offset.x = mj_contentOffsetX; + self.contentOffset = offset; +} + +- (CGFloat)mj_contentOffsetX +{ + return self.contentOffset.x; +} + +- (void)setMj_contentOffsetY:(CGFloat)mj_contentOffsetY +{ + CGPoint offset = self.contentOffset; + offset.y = mj_contentOffsetY; + self.contentOffset = offset; +} + +- (CGFloat)mj_contentOffsetY +{ + return self.contentOffset.y; +} + +- (void)setMj_contentSizeWidth:(CGFloat)mj_contentSizeWidth +{ + CGSize size = self.contentSize; + size.width = mj_contentSizeWidth; + self.contentSize = size; +} + +- (CGFloat)mj_contentSizeWidth +{ + return self.contentSize.width; +} + +- (void)setMj_contentSizeHeight:(CGFloat)mj_contentSizeHeight +{ + CGSize size = self.contentSize; + size.height = mj_contentSizeHeight; + self.contentSize = size; +} + +- (CGFloat)mj_contentSizeHeight +{ + return self.contentSize.height; +} +@end diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.h b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.h new file mode 100644 index 0000000..e5ae65b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.h @@ -0,0 +1,124 @@ +// +// UIScrollView+MJRefresh.h +// MJRefreshExample +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 itcast. All rights reserved. +// + +#import + +@interface UIScrollView (MJRefresh) +#pragma mark - 下拉刷新 +/** + * 添加一个下拉刷新头部控件 + * + * @param callback 回调 + */ +- (void)addHeaderWithCallback:(void (^)())callback; + +/** + * 添加一个下拉刷新头部控件 + * + * @param callback 回调 + * @param dateKey 刷新时间保存的key值 + */ +- (void)addHeaderWithCallback:(void (^)())callback dateKey:(NSString*)dateKey; + +/** + * 添加一个下拉刷新头部控件 + * + * @param target 目标 + * @param action 回调方法 + */ +- (void)addHeaderWithTarget:(id)target action:(SEL)action; + +/** + * 添加一个下拉刷新头部控件 + * + * @param target 目标 + * @param action 回调方法 + * @param dateKey 刷新时间保存的key值 + */ +- (void)addHeaderWithTarget:(id)target action:(SEL)action dateKey:(NSString*)dateKey; + +/** + * 移除下拉刷新头部控件 + */ +- (void)removeHeader; + +/** + * 主动让下拉刷新头部控件进入刷新状态 + */ +- (void)headerBeginRefreshing; + +/** + * 让下拉刷新头部控件停止刷新状态 + */ +- (void)headerEndRefreshing; + +/** + * 下拉刷新头部控件的可见性 + */ +@property (nonatomic, assign, getter = isHeaderHidden) BOOL headerHidden; + +/** + * 是否正在下拉刷新 + */ +@property (nonatomic, assign, readonly, getter = isHeaderRefreshing) BOOL headerRefreshing; + +#pragma mark - 上拉刷新 +/** + * 添加一个上拉刷新尾部控件 + * + * @param callback 回调 + */ +- (void)addFooterWithCallback:(void (^)())callback; + +/** + * 添加一个上拉刷新尾部控件 + * + * @param target 目标 + * @param action 回调方法 + */ +- (void)addFooterWithTarget:(id)target action:(SEL)action; + +/** + * 移除上拉刷新尾部控件 + */ +- (void)removeFooter; + +/** + * 主动让上拉刷新尾部控件进入刷新状态 + */ +- (void)footerBeginRefreshing; + +/** + * 让上拉刷新尾部控件停止刷新状态 + */ +- (void)footerEndRefreshing; + +/** + * 上拉刷新头部控件的可见性 + */ +@property (nonatomic, assign, getter = isFooterHidden) BOOL footerHidden; + +/** + * 是否正在上拉刷新 + */ +@property (nonatomic, assign, readonly, getter = isFooterRefreshing) BOOL footerRefreshing; + +/** + * 设置尾部控件的文字 + */ +@property (copy, nonatomic) NSString *footerPullToRefreshText; // 默认:@"上拉可以加载更多数据" +@property (copy, nonatomic) NSString *footerReleaseToRefreshText; // 默认:@"松开立即加载更多数据" +@property (copy, nonatomic) NSString *footerRefreshingText; // 默认:@"MJ哥正在帮你加载数据..." + +/** + * 设置头部控件的文字 + */ +@property (copy, nonatomic) NSString *headerPullToRefreshText; // 默认:@"下拉可以刷新" +@property (copy, nonatomic) NSString *headerReleaseToRefreshText; // 默认:@"松开立即刷新" +@property (copy, nonatomic) NSString *headerRefreshingText; // 默认:@"MJ哥正在帮你刷新..." +@end diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.m b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.m new file mode 100644 index 0000000..74a72b8 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.m @@ -0,0 +1,292 @@ +// +// UIScrollView+MJRefresh.m +// MJRefreshExample +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 itcast. All rights reserved. +// + +#import "UIScrollView+MJRefresh.h" +#import "MJRefreshHeaderView.h" +#import "MJRefreshFooterView.h" +#import + +@interface UIScrollView() +@property (weak, nonatomic) MJRefreshHeaderView *header; +@property (weak, nonatomic) MJRefreshFooterView *footer; +@end + + +@implementation UIScrollView (MJRefresh) + +#pragma mark - 运行时相关 +static char MJRefreshHeaderViewKey; +static char MJRefreshFooterViewKey; + +- (void)setHeader:(MJRefreshHeaderView *)header { + [self willChangeValueForKey:@"MJRefreshHeaderViewKey"]; + objc_setAssociatedObject(self, &MJRefreshHeaderViewKey, + header, + OBJC_ASSOCIATION_ASSIGN); + [self didChangeValueForKey:@"MJRefreshHeaderViewKey"]; +} + +- (MJRefreshHeaderView *)header { + return objc_getAssociatedObject(self, &MJRefreshHeaderViewKey); +} + +- (void)setFooter:(MJRefreshFooterView *)footer { + [self willChangeValueForKey:@"MJRefreshFooterViewKey"]; + objc_setAssociatedObject(self, &MJRefreshFooterViewKey, + footer, + OBJC_ASSOCIATION_ASSIGN); + [self didChangeValueForKey:@"MJRefreshFooterViewKey"]; +} + +- (MJRefreshFooterView *)footer { + return objc_getAssociatedObject(self, &MJRefreshFooterViewKey); +} + +#pragma mark - 下拉刷新 +/** + * 添加一个下拉刷新头部控件 + * + * @param callback 回调 + */ +- (void)addHeaderWithCallback:(void (^)())callback +{ + [self addHeaderWithCallback:callback dateKey:nil]; +} + +- (void)addHeaderWithCallback:(void (^)())callback dateKey:(NSString*)dateKey +{ + // 1.创建新的header + if (!self.header) { + MJRefreshHeaderView *header = [MJRefreshHeaderView header]; + [self addSubview:header]; + self.header = header; + } + + // 2.设置block回调 + self.header.beginRefreshingCallback = callback; + + // 3.设置存储刷新时间的key + self.header.dateKey = dateKey; +} + +/** + * 添加一个下拉刷新头部控件 + * + * @param target 目标 + * @param action 回调方法 + */ +- (void)addHeaderWithTarget:(id)target action:(SEL)action +{ + [self addHeaderWithTarget:target action:action dateKey:nil]; +} + +- (void)addHeaderWithTarget:(id)target action:(SEL)action dateKey:(NSString*)dateKey +{ + // 1.创建新的header + if (!self.header) { + MJRefreshHeaderView *header = [MJRefreshHeaderView header]; + [self addSubview:header]; + self.header = header; + } + + // 2.设置目标和回调方法 + self.header.beginRefreshingTaget = target; + self.header.beginRefreshingAction = action; + + // 3.设置存储刷新时间的key + self.header.dateKey = dateKey; +} + +/** + * 移除下拉刷新头部控件 + */ +- (void)removeHeader +{ + [self.header removeFromSuperview]; + self.header = nil; +} + +/** + * 主动让下拉刷新头部控件进入刷新状态 + */ +- (void)headerBeginRefreshing +{ + [self.header beginRefreshing]; +} + +/** + * 让下拉刷新头部控件停止刷新状态 + */ +- (void)headerEndRefreshing +{ + [self.header endRefreshing]; +} + +/** + * 下拉刷新头部控件的可见性 + */ +- (void)setHeaderHidden:(BOOL)hidden +{ + self.header.hidden = hidden; +} + +- (BOOL)isHeaderHidden +{ + return self.header.isHidden; +} + +- (BOOL)isHeaderRefreshing +{ + return self.header.isRefreshing; +} + +#pragma mark - 上拉刷新 +/** + * 添加一个上拉刷新尾部控件 + * + * @param callback 回调 + */ +- (void)addFooterWithCallback:(void (^)())callback +{ + // 1.创建新的footer + if (!self.footer) { + MJRefreshFooterView *footer = [MJRefreshFooterView footer]; + [self addSubview:footer]; + self.footer = footer; + } + + // 2.设置block回调 + self.footer.beginRefreshingCallback = callback; +} + +/** + * 添加一个上拉刷新尾部控件 + * + * @param target 目标 + * @param action 回调方法 + */ +- (void)addFooterWithTarget:(id)target action:(SEL)action +{ + // 1.创建新的footer + if (!self.footer) { + MJRefreshFooterView *footer = [MJRefreshFooterView footer]; + [self addSubview:footer]; + self.footer = footer; + } + + // 2.设置目标和回调方法 + self.footer.beginRefreshingTaget = target; + self.footer.beginRefreshingAction = action; +} + +/** + * 移除上拉刷新尾部控件 + */ +- (void)removeFooter +{ + [self.footer removeFromSuperview]; + self.footer = nil; +} + +/** + * 主动让上拉刷新尾部控件进入刷新状态 + */ +- (void)footerBeginRefreshing +{ + [self.footer beginRefreshing]; +} + +/** + * 让上拉刷新尾部控件停止刷新状态 + */ +- (void)footerEndRefreshing +{ + [self.footer endRefreshing]; +} + +/** + * 下拉刷新头部控件的可见性 + */ +- (void)setFooterHidden:(BOOL)hidden +{ + self.footer.hidden = hidden; +} + +- (BOOL)isFooterHidden +{ + return self.footer.isHidden; +} + +- (BOOL)isFooterRefreshing +{ + return self.footer.isRefreshing; +} + +/** + * 文字 + */ +- (void)setFooterPullToRefreshText:(NSString *)footerPullToRefreshText +{ + self.footer.pullToRefreshText = footerPullToRefreshText; +} + +- (NSString *)footerPullToRefreshText +{ + return self.footer.pullToRefreshText; +} + +- (void)setFooterReleaseToRefreshText:(NSString *)footerReleaseToRefreshText +{ + self.footer.releaseToRefreshText = footerReleaseToRefreshText; +} + +- (NSString *)footerReleaseToRefreshText +{ + return self.footer.releaseToRefreshText; +} + +- (void)setFooterRefreshingText:(NSString *)footerRefreshingText +{ + self.footer.refreshingText = footerRefreshingText; +} + +- (NSString *)footerRefreshingText +{ + return self.footer.refreshingText; +} + +- (void)setHeaderPullToRefreshText:(NSString *)headerPullToRefreshText +{ + self.header.pullToRefreshText = headerPullToRefreshText; +} + +- (NSString *)headerPullToRefreshText +{ + return self.header.pullToRefreshText; +} + +- (void)setHeaderReleaseToRefreshText:(NSString *)headerReleaseToRefreshText +{ + self.header.releaseToRefreshText = headerReleaseToRefreshText; +} + +- (NSString *)headerReleaseToRefreshText +{ + return self.header.releaseToRefreshText; +} + +- (void)setHeaderRefreshingText:(NSString *)headerRefreshingText +{ + self.header.refreshingText = headerRefreshingText; +} + +- (NSString *)headerRefreshingText +{ + return self.header.refreshingText; +} +@end diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.h b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.h new file mode 100644 index 0000000..8033456 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.h @@ -0,0 +1,18 @@ +// +// UIView+Extension.h +// MJRefreshExample +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 itcast. All rights reserved. +// + +#import + +@interface UIView (MJExtension) +@property (assign, nonatomic) CGFloat mj_x; +@property (assign, nonatomic) CGFloat mj_y; +@property (assign, nonatomic) CGFloat mj_width; +@property (assign, nonatomic) CGFloat mj_height; +@property (assign, nonatomic) CGSize mj_size; +@property (assign, nonatomic) CGPoint mj_origin; +@end diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.m b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.m new file mode 100644 index 0000000..a4f8194 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.m @@ -0,0 +1,83 @@ +// +// UIView+Extension.m +// MJRefreshExample +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 itcast. All rights reserved. +// + +#import "UIView+MJExtension.h" + +@implementation UIView (MJExtension) +- (void)setMj_x:(CGFloat)mj_x +{ + CGRect frame = self.frame; + frame.origin.x = mj_x; + self.frame = frame; +} + +- (CGFloat)mj_x +{ + return self.frame.origin.x; +} + +- (void)setMj_y:(CGFloat)mj_y +{ + CGRect frame = self.frame; + frame.origin.y = mj_y; + self.frame = frame; +} + +- (CGFloat)mj_y +{ + return self.frame.origin.y; +} + +- (void)setMj_width:(CGFloat)mj_width +{ + CGRect frame = self.frame; + frame.size.width = mj_width; + self.frame = frame; +} + +- (CGFloat)mj_width +{ + return self.frame.size.width; +} + +- (void)setMj_height:(CGFloat)mj_height +{ + CGRect frame = self.frame; + frame.size.height = mj_height; + self.frame = frame; +} + +- (CGFloat)mj_height +{ + return self.frame.size.height; +} + +- (void)setMj_size:(CGSize)mj_size +{ + CGRect frame = self.frame; + frame.size = mj_size; + self.frame = frame; +} + +- (CGSize)mj_size +{ + return self.frame.size; +} + +- (void)setMj_origin:(CGPoint)mj_origin +{ + CGRect frame = self.frame; + frame.origin = mj_origin; + self.frame = frame; +} + +- (CGPoint)mj_origin +{ + return self.frame.origin; +} +@end diff --git a/iOSStudy/iOSStudy/Pods/MJRefresh/README.md b/iOSStudy/iOSStudy/Pods/MJRefresh/README.md new file mode 100644 index 0000000..a2e50fa --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/MJRefresh/README.md @@ -0,0 +1,43 @@ +## MJRefresh +The easiest way to use pull-to-refresh + +![(52326ce26803fabc46000000_18)](http://code4app.qiniudn.com/photo/52326ce26803fabc46000000_18.gif) + +### 添加头部控件 +```objc +[self.tableView addHeaderWithTarget:self action:@selector(headerRereshing)]; +``` +或者 +```objc +[self.tableView addHeaderWithCallback:^{ }]; +``` + +### 添加尾部控件 +```objc +[self.tableView addFooterWithTarget:self action:@selector(footerRereshing)]; +``` +或者 +```objc +[self.tableView addFooterWithCallback:^{ }]; +``` + +### 自动进入刷新状态 +```objc +[self.tableView headerBeginRefreshing]; +[self.tableView footerBeginRefreshing]; +``` + +### 结束刷新 +```objc +[self.tableView headerEndRefreshing]; +[self.tableView footerEndRefreshing]; +``` + +### 可以在MJRefreshConst.h和MJRefreshConst.m文件中自定义显示的文字内容和文字颜色 + +### 本框架兼容的系统>=iOS6.0,iPhone\iPad横竖屏 + +## 期待 +* 如果在使用过程中遇到BUG,希望你能Issues我,谢谢 +* 如果在使用过程中发现功能不够用,希望你能Issues我,我非常想为这个框架增加更多好用的功能,谢谢 +* 如果你想为MJRefresh输出代码,请拼命Pull Requests我 \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Manifest.lock b/iOSStudy/iOSStudy/Pods/Manifest.lock new file mode 100644 index 0000000..ee61b81 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Manifest.lock @@ -0,0 +1,59 @@ +PODS: + - AFNetworking (2.5.1): + - AFNetworking/NSURLConnection (= 2.5.1) + - AFNetworking/NSURLSession (= 2.5.1) + - AFNetworking/Reachability (= 2.5.1) + - AFNetworking/Security (= 2.5.1) + - AFNetworking/Serialization (= 2.5.1) + - AFNetworking/UIKit (= 2.5.1) + - AFNetworking/NSURLConnection (2.5.1): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/NSURLSession (2.5.1): + - AFNetworking/Reachability + - AFNetworking/Security + - AFNetworking/Serialization + - AFNetworking/Reachability (2.5.1) + - AFNetworking/Security (2.5.1) + - AFNetworking/Serialization (2.5.1) + - AFNetworking/UIKit (2.5.1): + - AFNetworking/NSURLConnection + - AFNetworking/NSURLSession + - FMDB (2.5): + - FMDB/standard (= 2.5) + - FMDB/common (2.5) + - FMDB/standard (2.5): + - FMDB/common + - Mantle (1.5.4): + - Mantle/extobjc (= 1.5.4) + - Mantle/extobjc (1.5.4) + - MJRefresh (0.0.1) + - SDWebImage (3.7.1): + - SDWebImage/Core (= 3.7.1) + - SDWebImage/Core (3.7.1) + - SVProgressHUD (1.1.2) + - SVWebViewController (1.0) + - SWTableViewCell (0.3.7) + +DEPENDENCIES: + - AFNetworking (~> 2.0) + - FMDB + - Mantle + - MJRefresh + - SDWebImage + - SVProgressHUD + - SVWebViewController + - SWTableViewCell (~> 0.3.7) + +SPEC CHECKSUMS: + AFNetworking: 8bee59492a6ff15d69130efa4d0dc67e0094a52a + FMDB: 0efa188cf0dd1ce82c27a478cd5f5fa245308677 + Mantle: d5fbaf30fbc58031223af13812c060e15934a1fe + MJRefresh: 02638d90855109026754562b7507e5c5eabfcc65 + SDWebImage: 116e88633b5b416ea0ca4b334a4ac59cf72dd38d + SVProgressHUD: da7a49e789af645d9279ffbca62318945a832438 + SVWebViewController: fbf917baa92744c54cfb89a52a4c056e409973a4 + SWTableViewCell: 25de71898e3fcd11cf75707ef90245acf990ec03 + +COCOAPODS: 0.35.0 diff --git a/iOSStudy/iOSStudy/Pods/Mantle/LICENSE.md b/iOSStudy/iOSStudy/Pods/Mantle/LICENSE.md new file mode 100644 index 0000000..0c46720 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/LICENSE.md @@ -0,0 +1,21 @@ +**Copyright (c) 2012 - 2014, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +**This project uses portions of code from the Proton framework.** +**Proton is copyright (c) 2012, Bitswift, Inc.** +**All rights reserved.** + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Neither the name of the Bitswift, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLJSONAdapter.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLJSONAdapter.h new file mode 100644 index 0000000..368c5ab --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLJSONAdapter.h @@ -0,0 +1,172 @@ +// +// MTLJSONAdapter.h +// Mantle +// +// Created by Justin Spahr-Summers on 2013-02-12. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import + +@class MTLModel; + +// A MTLModel object that supports being parsed from and serialized to JSON. +@protocol MTLJSONSerializing +@required + +// Specifies how to map property keys to different key paths in JSON. +// +// Subclasses overriding this method should combine their values with those of +// `super`. +// +// Any property keys not present in the dictionary are assumed to match the JSON +// key that should be used. Any keys associated with NSNull will not participate +// in JSON serialization. +// +// Returns a dictionary mapping property keys to JSON key paths (as strings) or +// NSNull values. ++ (NSDictionary *)JSONKeyPathsByPropertyKey; + +@optional + +// Specifies how to convert a JSON value to the given property key. If +// reversible, the transformer will also be used to convert the property value +// back to JSON. +// +// If the receiver implements a `+JSONTransformer` method, MTLJSONAdapter +// will use the result of that method instead. +// +// Returns a value transformer, or nil if no transformation should be performed. ++ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key; + +// Overridden to parse the receiver as a different class, based on information +// in the provided dictionary. +// +// This is mostly useful for class clusters, where the abstract base class would +// be passed into -[MTLJSONAdapter initWithJSONDictionary:modelClass:], but +// a subclass should be instantiated instead. +// +// JSONDictionary - The JSON dictionary that will be parsed. +// +// Returns the class that should be parsed (which may be the receiver), or nil +// to abort parsing (e.g., if the data is invalid). ++ (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary; + +@end + +// The domain for errors originating from MTLJSONAdapter. +extern NSString * const MTLJSONAdapterErrorDomain; + +// +classForParsingJSONDictionary: returned nil for the given dictionary. +extern const NSInteger MTLJSONAdapterErrorNoClassFound; + +// The provided JSONDictionary is not valid. +extern const NSInteger MTLJSONAdapterErrorInvalidJSONDictionary; + +// The model's implementation of +JSONKeyPathsByPropertyKey included a key which +// does not actually exist in +propertyKeys. +extern const NSInteger MTLJSONAdapterErrorInvalidJSONMapping; + +// Converts a MTLModel object to and from a JSON dictionary. +@interface MTLJSONAdapter : NSObject + +// The model object that the receiver was initialized with, or that the receiver +// parsed from a JSON dictionary. +@property (nonatomic, strong, readonly) MTLModel *model; + +// Attempts to parse a JSON dictionary into a model object. +// +// modelClass - The MTLModel subclass to attempt to parse from the JSON. +// This class must conform to . This +// argument must not be nil. +// JSONDictionary - A dictionary representing JSON data. This should match the +// format returned by NSJSONSerialization. If this argument is +// nil, the method returns nil. +// error - If not NULL, this may be set to an error that occurs during +// parsing or initializing an instance of `modelClass`. +// +// Returns an instance of `modelClass` upon success, or nil if a parsing error +// occurred. ++ (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary error:(NSError **)error; + +// Attempts to parse an array of JSON dictionary objects into a model objects +// of a specific class. +// +// modelClass - The MTLModel subclass to attempt to parse from the JSON. This +// class must conform to . This argument must +// not be nil. +// JSONArray - A array of dictionaries representing JSON data. This should +// match the format returned by NSJSONSerialization. If this +// argument is nil, the method returns nil. +// error - If not NULL, this may be set to an error that occurs during +// parsing or initializing an any of the instances of +// `modelClass`. +// +// Returns an array of `modelClass` instances upon success, or nil if a parsing +// error occurred. ++ (NSArray *)modelsOfClass:(Class)modelClass fromJSONArray:(NSArray *)JSONArray error:(NSError **)error; + +// Converts a model into a JSON representation. +// +// model - The model to use for JSON serialization. This argument must not be +// nil. +// +// Returns a JSON dictionary, or nil if a serialization error occurred. ++ (NSDictionary *)JSONDictionaryFromModel:(MTLModel *)model; + +// Converts a array of models into a JSON representation. +// +// models - The array of models to use for JSON serialization. This argument +// must not be nil. +// +// Returns a JSON array, or nil if a serialization error occurred for any +// model. ++ (NSArray *)JSONArrayFromModels:(NSArray *)models; + +// Initializes the receiver by attempting to parse a JSON dictionary into +// a model object. +// +// JSONDictionary - A dictionary representing JSON data. This should match the +// format returned by NSJSONSerialization. If this argument is +// nil, the method returns nil and an error with code +// MTLJSONAdapterErrorInvalidJSONDictionary. +// modelClass - The MTLModel subclass to attempt to parse from the JSON. +// This class must conform to . This +// argument must not be nil. +// error - If not NULL, this may be set to an error that occurs during +// parsing or initializing an instance of `modelClass`. +// +// Returns an initialized adapter upon success, or nil if a parsing error +// occurred. +- (id)initWithJSONDictionary:(NSDictionary *)JSONDictionary modelClass:(Class)modelClass error:(NSError **)error; + +// Initializes the receiver with an existing model. +// +// model - The model to use for JSON serialization. This argument must not be +// nil. +- (id)initWithModel:(MTLModel *)model; + +// Serializes the receiver's `model` into JSON. +// +// Returns a JSON dictionary, or nil if a serialization error occurred. +- (NSDictionary *)JSONDictionary; + +// Looks up the JSON key path in the model's +propertyKeys. +// +// Subclasses may override this method to customize the adapter's seralizing +// behavior. You should not call this method directly. +// +// key - The property key to retrieve the corresponding JSON key path for. This +// argument must not be nil. +// +// Returns a key path to use, or nil to omit the property from JSON. +- (NSString *)JSONKeyPathForPropertyKey:(NSString *)key; + +@end + +@interface MTLJSONAdapter (Deprecated) + ++ (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary __attribute__((deprecated("Replaced by +modelOfClass:fromJSONDictionary:error:"))); +- (id)initWithJSONDictionary:(NSDictionary *)JSONDictionary modelClass:(Class)modelClass __attribute__((deprecated("Replaced by -initWithJSONDictionary:modelClass:error:"))); + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLJSONAdapter.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLJSONAdapter.m new file mode 100644 index 0000000..9872921 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLJSONAdapter.m @@ -0,0 +1,325 @@ +// +// MTLJSONAdapter.m +// Mantle +// +// Created by Justin Spahr-Summers on 2013-02-12. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import "MTLJSONAdapter.h" +#import "MTLModel.h" +#import "MTLReflection.h" + +NSString * const MTLJSONAdapterErrorDomain = @"MTLJSONAdapterErrorDomain"; +const NSInteger MTLJSONAdapterErrorNoClassFound = 2; +const NSInteger MTLJSONAdapterErrorInvalidJSONDictionary = 3; +const NSInteger MTLJSONAdapterErrorInvalidJSONMapping = 4; + +// An exception was thrown and caught. +const NSInteger MTLJSONAdapterErrorExceptionThrown = 1; + +// Associated with the NSException that was caught. +static NSString * const MTLJSONAdapterThrownExceptionErrorKey = @"MTLJSONAdapterThrownException"; + +@interface MTLJSONAdapter () + +// The MTLModel subclass being parsed, or the class of `model` if parsing has +// completed. +@property (nonatomic, strong, readonly) Class modelClass; + +// A cached copy of the return value of +JSONKeyPathsByPropertyKey. +@property (nonatomic, copy, readonly) NSDictionary *JSONKeyPathsByPropertyKey; + +// Looks up the NSValueTransformer that should be used for the given key. +// +// key - The property key to transform from or to. This argument must not be nil. +// +// Returns a transformer to use, or nil to not transform the property. +- (NSValueTransformer *)JSONTransformerForKey:(NSString *)key; + +@end + +@implementation MTLJSONAdapter + +#pragma mark Convenience methods + ++ (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary error:(NSError **)error { + MTLJSONAdapter *adapter = [[self alloc] initWithJSONDictionary:JSONDictionary modelClass:modelClass error:error]; + return adapter.model; +} + ++ (NSArray *)modelsOfClass:(Class)modelClass fromJSONArray:(NSArray *)JSONArray error:(NSError **)error { + if (JSONArray == nil || ![JSONArray isKindOfClass:NSArray.class]) { + if (error != NULL) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Missing JSON array", @""), + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedString(@"%@ could not be created because an invalid JSON array was provided: %@", @""), NSStringFromClass(modelClass), JSONArray.class], + }; + *error = [NSError errorWithDomain:MTLJSONAdapterErrorDomain code:MTLJSONAdapterErrorInvalidJSONDictionary userInfo:userInfo]; + } + return nil; + } + + NSMutableArray *models = [NSMutableArray arrayWithCapacity:JSONArray.count]; + for (NSDictionary *JSONDictionary in JSONArray){ + MTLModel *model = [self modelOfClass:modelClass fromJSONDictionary:JSONDictionary error:error]; + + if (model == nil) return nil; + + [models addObject:model]; + } + + return models; +} + ++ (NSDictionary *)JSONDictionaryFromModel:(MTLModel *)model { + MTLJSONAdapter *adapter = [[self alloc] initWithModel:model]; + return adapter.JSONDictionary; +} + ++ (NSArray *)JSONArrayFromModels:(NSArray *)models { + NSParameterAssert(models != nil); + NSParameterAssert([models isKindOfClass:NSArray.class]); + + NSMutableArray *JSONArray = [NSMutableArray arrayWithCapacity:models.count]; + for (MTLModel *model in models) { + NSDictionary *JSONDictionary = [self JSONDictionaryFromModel:model]; + if (JSONDictionary == nil) return nil; + + [JSONArray addObject:JSONDictionary]; + } + + return JSONArray; +} + +#pragma mark Lifecycle + +- (id)init { + NSAssert(NO, @"%@ must be initialized with a JSON dictionary or model object", self.class); + return nil; +} + +- (id)initWithJSONDictionary:(NSDictionary *)JSONDictionary modelClass:(Class)modelClass error:(NSError **)error { + NSParameterAssert(modelClass != nil); + NSParameterAssert([modelClass isSubclassOfClass:MTLModel.class]); + NSParameterAssert([modelClass conformsToProtocol:@protocol(MTLJSONSerializing)]); + + if (JSONDictionary == nil || ![JSONDictionary isKindOfClass:NSDictionary.class]) { + if (error != NULL) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Missing JSON dictionary", @""), + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedString(@"%@ could not be created because an invalid JSON dictionary was provided: %@", @""), NSStringFromClass(modelClass), JSONDictionary.class], + }; + *error = [NSError errorWithDomain:MTLJSONAdapterErrorDomain code:MTLJSONAdapterErrorInvalidJSONDictionary userInfo:userInfo]; + } + return nil; + } + + if ([modelClass respondsToSelector:@selector(classForParsingJSONDictionary:)]) { + modelClass = [modelClass classForParsingJSONDictionary:JSONDictionary]; + if (modelClass == nil) { + if (error != NULL) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not parse JSON", @""), + NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"No model class could be found to parse the JSON dictionary.", @"") + }; + + *error = [NSError errorWithDomain:MTLJSONAdapterErrorDomain code:MTLJSONAdapterErrorNoClassFound userInfo:userInfo]; + } + + return nil; + } + + NSAssert([modelClass isSubclassOfClass:MTLModel.class], @"Class %@ returned from +classForParsingJSONDictionary: is not a subclass of MTLModel", modelClass); + NSAssert([modelClass conformsToProtocol:@protocol(MTLJSONSerializing)], @"Class %@ returned from +classForParsingJSONDictionary: does not conform to ", modelClass); + } + + self = [super init]; + if (self == nil) return nil; + + _modelClass = modelClass; + _JSONKeyPathsByPropertyKey = [[modelClass JSONKeyPathsByPropertyKey] copy]; + + NSMutableDictionary *dictionaryValue = [[NSMutableDictionary alloc] initWithCapacity:JSONDictionary.count]; + + NSSet *propertyKeys = [self.modelClass propertyKeys]; + + for (NSString *mappedPropertyKey in self.JSONKeyPathsByPropertyKey) { + if (![propertyKeys containsObject:mappedPropertyKey]) { + NSAssert(NO, @"%@ is not a property of %@.", mappedPropertyKey, modelClass); + return nil; + } + + id value = self.JSONKeyPathsByPropertyKey[mappedPropertyKey]; + + if (![value isKindOfClass:NSString.class] && value != NSNull.null) { + NSAssert(NO, @"%@ must either map to a JSON key path or NSNull, got: %@.",mappedPropertyKey, value); + return nil; + } + } + + for (NSString *propertyKey in propertyKeys) { + NSString *JSONKeyPath = [self JSONKeyPathForPropertyKey:propertyKey]; + if (JSONKeyPath == nil) continue; + + id value; + @try { + value = [JSONDictionary valueForKeyPath:JSONKeyPath]; + } @catch (NSException *ex) { + if (error != NULL) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid JSON dictionary", nil), + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedString(@"%1$@ could not be parsed because an invalid JSON dictionary was provided for key path \"%2$@\"", nil), modelClass, JSONKeyPath], + MTLJSONAdapterThrownExceptionErrorKey: ex + }; + + *error = [NSError errorWithDomain:MTLJSONAdapterErrorDomain code:MTLJSONAdapterErrorInvalidJSONDictionary userInfo:userInfo]; + } + + return nil; + } + + if (value == nil) continue; + + @try { + NSValueTransformer *transformer = [self JSONTransformerForKey:propertyKey]; + if (transformer != nil) { + // Map NSNull -> nil for the transformer, and then back for the + // dictionary we're going to insert into. + if ([value isEqual:NSNull.null]) value = nil; + value = [transformer transformedValue:value] ?: NSNull.null; + } + + dictionaryValue[propertyKey] = value; + } @catch (NSException *ex) { + NSLog(@"*** Caught exception %@ parsing JSON key path \"%@\" from: %@", ex, JSONKeyPath, JSONDictionary); + + // Fail fast in Debug builds. + #if DEBUG + @throw ex; + #else + if (error != NULL) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: ex.description, + NSLocalizedFailureReasonErrorKey: ex.reason, + MTLJSONAdapterThrownExceptionErrorKey: ex + }; + + *error = [NSError errorWithDomain:MTLJSONAdapterErrorDomain code:MTLJSONAdapterErrorExceptionThrown userInfo:userInfo]; + } + + return nil; + #endif + } + } + + _model = [self.modelClass modelWithDictionary:dictionaryValue error:error]; + if (_model == nil) return nil; + + return self; +} + +- (id)initWithModel:(MTLModel *)model { + NSParameterAssert(model != nil); + + self = [super init]; + if (self == nil) return nil; + + _model = model; + _modelClass = model.class; + _JSONKeyPathsByPropertyKey = [[model.class JSONKeyPathsByPropertyKey] copy]; + + return self; +} + +#pragma mark Serialization + +- (NSDictionary *)JSONDictionary { + NSDictionary *dictionaryValue = self.model.dictionaryValue; + NSMutableDictionary *JSONDictionary = [[NSMutableDictionary alloc] initWithCapacity:dictionaryValue.count]; + + [dictionaryValue enumerateKeysAndObjectsUsingBlock:^(NSString *propertyKey, id value, BOOL *stop) { + NSString *JSONKeyPath = [self JSONKeyPathForPropertyKey:propertyKey]; + if (JSONKeyPath == nil) return; + + NSValueTransformer *transformer = [self JSONTransformerForKey:propertyKey]; + if ([transformer.class allowsReverseTransformation]) { + // Map NSNull -> nil for the transformer, and then back for the + // dictionaryValue we're going to insert into. + if ([value isEqual:NSNull.null]) value = nil; + value = [transformer reverseTransformedValue:value] ?: NSNull.null; + } + + NSArray *keyPathComponents = [JSONKeyPath componentsSeparatedByString:@"."]; + + // Set up dictionaries at each step of the key path. + id obj = JSONDictionary; + for (NSString *component in keyPathComponents) { + if ([obj valueForKey:component] == nil) { + // Insert an empty mutable dictionary at this spot so that we + // can set the whole key path afterward. + [obj setValue:[NSMutableDictionary dictionary] forKey:component]; + } + + obj = [obj valueForKey:component]; + } + + [JSONDictionary setValue:value forKeyPath:JSONKeyPath]; + }]; + + return JSONDictionary; +} + +- (NSValueTransformer *)JSONTransformerForKey:(NSString *)key { + NSParameterAssert(key != nil); + + SEL selector = MTLSelectorWithKeyPattern(key, "JSONTransformer"); + if ([self.modelClass respondsToSelector:selector]) { + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self.modelClass methodSignatureForSelector:selector]]; + invocation.target = self.modelClass; + invocation.selector = selector; + [invocation invoke]; + + __unsafe_unretained id result = nil; + [invocation getReturnValue:&result]; + return result; + } + + if ([self.modelClass respondsToSelector:@selector(JSONTransformerForKey:)]) { + return [self.modelClass JSONTransformerForKey:key]; + } + + return nil; +} + +- (NSString *)JSONKeyPathForPropertyKey:(NSString *)key { + NSParameterAssert(key != nil); + + id JSONKeyPath = self.JSONKeyPathsByPropertyKey[key]; + if ([JSONKeyPath isEqual:NSNull.null]) return nil; + + if (JSONKeyPath == nil) { + return key; + } else { + return JSONKeyPath; + } +} + +@end + +@implementation MTLJSONAdapter (Deprecated) + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" + ++ (id)modelOfClass:(Class)modelClass fromJSONDictionary:(NSDictionary *)JSONDictionary { + return [self modelOfClass:modelClass fromJSONDictionary:JSONDictionary error:NULL]; +} + +- (id)initWithJSONDictionary:(NSDictionary *)JSONDictionary modelClass:(Class)modelClass { + return [self initWithJSONDictionary:JSONDictionary modelClass:modelClass error:NULL]; +} + +#pragma clang diagnostic pop + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLManagedObjectAdapter.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLManagedObjectAdapter.h new file mode 100644 index 0000000..11b2bcf --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLManagedObjectAdapter.h @@ -0,0 +1,215 @@ +// +// MTLManagedObjectAdapter.h +// Mantle +// +// Created by Justin Spahr-Summers on 2013-03-29. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import + +@class MTLModel; + +// A MTLModel object that supports being serialized to and from Core Data as an +// NSManagedObject. +@protocol MTLManagedObjectSerializing +@required + +// The name of the Core Data entity that the receiver serializes to and +// deserializes from. +// +// This method must not return nil. ++ (NSString *)managedObjectEntityName; + +// Specifies how to map property keys to different keys on the receiver's +// +managedObjectEntity. +// +// Entity attributes will be mapped to and from the receiver's properties using +// +entityAttributeTransformerForKey:. Entity relationships will be mapped to +// and from MTLModel objects using +relationshipModelClassesByPropertyKey. +// Fetched properties are not supported. +// +// Subclasses overriding this method should combine their values with those of +// `super`. +// +// Any property keys not present in the dictionary are assumed to match the +// entity key that should be used. Any keys associated with NSNull will not +// participate in managed object serialization. +// +// Returns a dictionary mapping property keys to entity keys (as strings) or +// NSNull values. ++ (NSDictionary *)managedObjectKeysByPropertyKey; + +@optional + +// Specifies a set of property keys used by the adapter to check for an already +// existing managed object when converting the MTLModel to its related +// NSManagedObject. +// +// The adapter will first map any keys provided by this method to the correct +// keys in managedObjectKeysByPropertyKey. +// +// The adapter will then perform a fetch request in the provided context for a +// managed object that matches the MTLModel's managedObjectEntityName and has +// equal values set for the property keys on the MTLModel. +// +// The managed object returned by the fetch request will then be set with all +// values from the MTLModel that the managed object is being converted from. +// +// If a property value of our MTLModel is yet another MTLModel which needs to be +// converted to a managed object, the class for that MTLModel can also implement +// this method to perform its own uniqing. +// +// For example: +// 1. An MTLModel subclass has id_number = 10. +// 2. An NSManagedObject accessible to the adapter's context has idnumber = 10. +// 3. managedObjectKeysByPropertyKey returns @{@"id_number" : @"idnumber"} +// 4. propertyKeysForManagedObjectUniquing returns +// [NSSet setWithObject:@"id_number"]; +// 5. Then our fetch request may return this managed object (or another managed +// object with idnumber = 10). +// +// NOTE: If multiple managed objects follow the same uniquing criteria only one +// of them will be set with our MTLModel's values. ++ (NSSet *)propertyKeysForManagedObjectUniquing; + +// Specifies how to convert the given property key to a managed object +// attribute. If reversible, the transformer will also be used to convert the +// managed object attribute back to the property. +// +// If the receiver implements a `+EntityAttributeTransformer` method, +// MTLManagedObjectAdapter will use the result of that method instead. +// +// Returns a value transformer, or nil if no transformation should be performed. ++ (NSValueTransformer *)entityAttributeTransformerForKey:(NSString *)key; + +// Specifies the MTLModel subclasses that should be deserialized to the +// receiver's property keys when a property key corresponds to an entity +// relationship. +// +// In other words, the dictionary returned by this method is used to decode +// managed object relationships into MTLModels (or NSArrays or NSSets thereof) +// set on the receiver. +// +// If a property key is omitted from the returned dictionary, but present in +// +managedObjectKeysByPropertyKey, and the receiver's +managedObjectEntity has +// a relationship at the corresponding key, an exception will be thrown during +// deserialization. +// +// Subclasses overriding this method should combine their values with those of +// `super`. +// +// Returns a dictionary mapping property keys to the Class objects that should +// be used. ++ (NSDictionary *)relationshipModelClassesByPropertyKey; + +// Overridden to deserialize a different class instead of the receiver, based on +// information in the provided object. +// +// This is mostly useful for class clusters, where the abstract base class would +// be passed into +[MTLManagedObjectAdapter +// modelOfClass:fromManagedObject:error:], but a subclass should be instantiated +// instead. +// +// managedObject - The object that will be deserialized. +// +// Returns the class that should be instantiated (which may be the receiver), or +// nil to abort parsing (e.g., if the data is invalid). ++ (Class)classForDeserializingManagedObject:(NSManagedObject *)managedObject; + +// Overriden when merging the value of the given key on the receiver with the +// value of the same key from the given `NSManagedObject` requires custom +// handling. +// +// By default, this method is not implemented, and precedence will be given to +// the value of the receiving model implicitly. +// +// When implemented, this method is called when an existing `NSManagedObject` +// is found for the receiving model, before updating the `NSManagedObject`'s +// properties. +// +// When implementing, you should use `+managedObjectKeysByPropertyKey` to map +// the given `key` to the appropriate `NSManagedObject` property. +- (void)mergeValueForKey:(NSString *)key fromManagedObject:(NSManagedObject *)managedObject; + +// Overriden when merging values on the receiver with the given +// `NSManagedObject` requires custom handling. +// +// By default, this method is not implemented, and precedence will be given to +// the values of the receiving model implicitly. +// +// When implemented, this method is called when an existing `NSManagedObject` +// is found for the receiving model, before updating the `NSManagedObject`'s +// properties. +// +// When implementing, you should use `+managedObjectKeysByPropertyKey` to map +// the given `key` to the appropriate `NSManagedObject` property. +// +// If you have also implemented `mergeValueForKey:fromManagedObject:` you have +// to make sure to call `mergeValueForKey:fromManagedObject:` from this method +// when appropriate. +- (void)mergeValuesForKeysFromManagedObject:(NSManagedObject *)managedObject; + +@end + +// The domain for errors originating from MTLManagedObjectAdapter. +extern NSString * const MTLManagedObjectAdapterErrorDomain; + +// +classForDeserializingManagedObject: returned nil for the given object. +extern const NSInteger MTLManagedObjectAdapterErrorNoClassFound; + +// An NSManagedObject failed to initialize. +extern const NSInteger MTLManagedObjectAdapterErrorInitializationFailed; + +// The managed object key specified by +managedObjectKeysByPropertyKey does not +// exist in the NSEntityDescription. +extern const NSInteger MTLManagedObjectAdapterErrorInvalidManagedObjectKey; + +// The managed object property specified has a type that isn't supported by +// MTLManagedObjectAdapter. +extern const NSInteger MTLManagedObjectAdapterErrorUnsupportedManagedObjectPropertyType; + +// The fetch request to find an existing managed object based on +// `+propertyKeysForManagedObjectUniquing` failed. +extern const NSInteger MTLManagedObjectAdapterErrorUniqueFetchRequestFailed; + +// A MTLModel property cannot be serialized to or deserialized from an +// NSManagedObject relationship. +// +// For a to-one relationship, this means that the property does not contain +// a MTLModel, or the MTLModel does not conform to . +// +// For a to-many relationship, this means that the property does not contain an +// NSArray or NSSet of MTLModel instances. +extern const NSInteger MTLManagedObjectAdapterErrorUnsupportedRelationshipClass; + +// The model's implementation of +managedObjectKeysByPropertyKey included a key +// which does not actually exist in +propertyKeys. +extern const NSInteger MTLManagedObjectAdapterErrorInvalidManagedObjectMapping; + +// Converts a MTLModel object to and from an NSManagedObject. +@interface MTLManagedObjectAdapter : NSObject + +// Attempts to deserialize an NSManagedObject into a MTLModel object. +// +// modelClass - The MTLModel subclass to return. This class must conform to +// . This argument must not be nil. +// managedObject - The managed object to deserialize. If this argument is nil, +// the method returns nil. +// error - If not NULL, this may be set to an error that occurs during +// deserialization or initializing an instance of `modelClass`. +// +// Returns an instance of `modelClass` upon success, or nil if an error +// occurred. ++ (id)modelOfClass:(Class)modelClass fromManagedObject:(NSManagedObject *)managedObject error:(NSError **)error; + +// Serializes a MTLModel into an NSManagedObject. +// +// model - The model object to serialize. This argument must not be nil. +// context - The context into which to insert the created managed object. This +// argument must not be nil. +// error - If not NULL, this may be set to an error that occurs during +// serialization or insertion. ++ (id)managedObjectFromModel:(MTLModel *)model insertingIntoContext:(NSManagedObjectContext *)context error:(NSError **)error; + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLManagedObjectAdapter.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLManagedObjectAdapter.m new file mode 100644 index 0000000..84235c1 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLManagedObjectAdapter.m @@ -0,0 +1,645 @@ +// +// MTLManagedObjectAdapter.m +// Mantle +// +// Created by Justin Spahr-Summers on 2013-03-29. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import "MTLManagedObjectAdapter.h" +#import "EXTScope.h" +#import "MTLModel.h" +#import "MTLReflection.h" +#import "NSArray+MTLManipulationAdditions.h" + +NSString * const MTLManagedObjectAdapterErrorDomain = @"MTLManagedObjectAdapterErrorDomain"; +const NSInteger MTLManagedObjectAdapterErrorNoClassFound = 2; +const NSInteger MTLManagedObjectAdapterErrorInitializationFailed = 3; +const NSInteger MTLManagedObjectAdapterErrorInvalidManagedObjectKey = 4; +const NSInteger MTLManagedObjectAdapterErrorUnsupportedManagedObjectPropertyType = 5; +const NSInteger MTLManagedObjectAdapterErrorUnsupportedRelationshipClass = 6; +const NSInteger MTLManagedObjectAdapterErrorUniqueFetchRequestFailed = 7; +const NSInteger MTLManagedObjectAdapterErrorInvalidManagedObjectMapping = 8; + +// Performs the given block in the context's queue, if it has one. +static id performInContext(NSManagedObjectContext *context, id (^block)(void)) { + if (context.concurrencyType == NSConfinementConcurrencyType) { + return block(); + } + + __block id result = nil; + [context performBlockAndWait:^{ + result = block(); + }]; + + return result; +} + +@interface MTLManagedObjectAdapter () + +// The MTLModel subclass being serialized or deserialized. +@property (nonatomic, strong, readonly) Class modelClass; + +// A cached copy of the return value of +managedObjectKeysByPropertyKey. +@property (nonatomic, copy, readonly) NSDictionary *managedObjectKeysByPropertyKey; + +// A cached copy of the return value of +relationshipModelClassesByPropertyKey. +@property (nonatomic, copy, readonly) NSDictionary *relationshipModelClassesByPropertyKey; + +// Initializes the receiver to serialize or deserialize a MTLModel of the given +// class. +- (id)initWithModelClass:(Class)modelClass; + +// Invoked from +modelOfClass:fromManagedObject:processedObjects:error: after +// the receiver's properties have been initialized. +- (id)modelFromManagedObject:(NSManagedObject *)managedObject processedObjects:(CFMutableDictionaryRef)processedObjects error:(NSError **)error; + +// Performs the actual work of deserialization. This method is also invoked when +// processing relationships, to create a new adapter (if needed) to handle them. +// +// `processedObjects` is a dictionary mapping NSManagedObjects to the MTLModels +// that have been created so far. It should remain alive for the full process +// of deserializing the top-level managed object. ++ (id)modelOfClass:(Class)modelClass fromManagedObject:(NSManagedObject *)managedObject processedObjects:(CFMutableDictionaryRef)processedObjects error:(NSError **)error; + +// Invoked from +// +managedObjectFromModel:insertingIntoContext:processedObjects:error: after +// the receiver's properties have been initialized. +- (id)managedObjectFromModel:(MTLModel *)model insertingIntoContext:(NSManagedObjectContext *)context processedObjects:(CFMutableDictionaryRef)processedObjects error:(NSError **)error; + +// Performs the actual work of serialization. This method is also invoked when +// processing relationships, to create a new adapter (if needed) to handle them. +// +// `processedObjects` is a dictionary mapping MTLModels to the NSManagedObjects +// that have been created so far. It should remain alive for the full process +// of serializing the top-level MTLModel. ++ (id)managedObjectFromModel:(MTLModel *)model insertingIntoContext:(NSManagedObjectContext *)context processedObjects:(CFMutableDictionaryRef)processedObjects error:(NSError **)error; + +// Looks up the NSValueTransformer that should be used for any attribute that +// corresponds the given property key. +// +// key - The property key to transform from or to. This argument must not be nil. +// +// Returns a transformer to use, or nil to not transform the property. +- (NSValueTransformer *)entityAttributeTransformerForKey:(NSString *)key; + +// Looks up the managed object key that corresponds to the given key. +// +// key - The property key to retrieve the corresponding managed object key for. +// This argument must not be nil. +// +// Returns a key to use, or nil to omit the property from managed object +// serialization. +- (NSString *)managedObjectKeyForKey:(NSString *)key; + +// Looks at propertyKeysForManagedObjectUniquing and forms an NSPredicate +// using the uniquing keys and the provided model. +- (NSPredicate *)uniquingPredicateForModel:(MTLModel *)model; + +@end + +@implementation MTLManagedObjectAdapter + +#pragma mark Lifecycle + +- (id)init { + NSAssert(NO, @"%@ should not be initialized using -init", self.class); + return nil; +} + +- (id)initWithModelClass:(Class)modelClass { + NSParameterAssert(modelClass != nil); + + self = [super init]; + if (self == nil) return nil; + + _modelClass = modelClass; + _managedObjectKeysByPropertyKey = [[modelClass managedObjectKeysByPropertyKey] copy]; + + if ([modelClass respondsToSelector:@selector(relationshipModelClassesByPropertyKey)]) { + _relationshipModelClassesByPropertyKey = [[modelClass relationshipModelClassesByPropertyKey] copy]; + } + + return self; +} + +#pragma mark Serialization + +- (id)modelFromManagedObject:(NSManagedObject *)managedObject processedObjects:(CFMutableDictionaryRef)processedObjects error:(NSError **)error { + NSParameterAssert(managedObject != nil); + NSParameterAssert(processedObjects != nil); + + NSEntityDescription *entity = managedObject.entity; + NSAssert(entity != nil, @"%@ returned a nil +entity", managedObject); + + NSManagedObjectContext *context = managedObject.managedObjectContext; + + NSDictionary *managedObjectProperties = entity.propertiesByName; + MTLModel *model = [[self.modelClass alloc] init]; + + // Pre-emptively consider this object processed, so that we don't get into + // any cycles when processing its relationships. + CFDictionaryAddValue(processedObjects, (__bridge void *)managedObject, (__bridge void *)model); + + BOOL (^setValueForKey)(NSString *, id) = ^(NSString *key, id value) { + // Mark this as being autoreleased, because validateValue may return + // a new object to be stored in this variable (and we don't want ARC to + // double-free or leak the old or new values). + __autoreleasing id replaceableValue = value; + if (![model validateValue:&replaceableValue forKey:key error:error]) return NO; + + [model setValue:replaceableValue forKey:key]; + return YES; + }; + + for (NSString *propertyKey in [self.modelClass propertyKeys]) { + NSString *managedObjectKey = [self managedObjectKeyForKey:propertyKey]; + if (managedObjectKey == nil) continue; + + BOOL (^deserializeAttribute)(NSAttributeDescription *) = ^(NSAttributeDescription *attributeDescription) { + id value = performInContext(context, ^{ + return [managedObject valueForKey:managedObjectKey]; + }); + + NSValueTransformer *attributeTransformer = [self entityAttributeTransformerForKey:propertyKey]; + if (attributeTransformer != nil) value = [attributeTransformer reverseTransformedValue:value]; + + return setValueForKey(propertyKey, value); + }; + + BOOL (^deserializeRelationship)(NSRelationshipDescription *) = ^(NSRelationshipDescription *relationshipDescription) { + Class nestedClass = self.relationshipModelClassesByPropertyKey[propertyKey]; + if (nestedClass == nil) { + [NSException raise:NSInvalidArgumentException format:@"No class specified for decoding relationship at key \"%@\" in managed object %@", managedObjectKey, managedObject]; + } + + if ([relationshipDescription isToMany]) { + id models = performInContext(context, ^ id { + id relationshipCollection = [managedObject valueForKey:managedObjectKey]; + NSMutableArray *models = [NSMutableArray arrayWithCapacity:[relationshipCollection count]]; + + for (NSManagedObject *nestedObject in relationshipCollection) { + MTLModel *model = [self.class modelOfClass:nestedClass fromManagedObject:nestedObject processedObjects:processedObjects error:error]; + if (model == nil) return nil; + + [models addObject:model]; + } + + return models; + }); + + if (models == nil) return NO; + if (![relationshipDescription isOrdered]) models = [NSSet setWithArray:models]; + + return setValueForKey(propertyKey, models); + } else { + NSManagedObject *nestedObject = performInContext(context, ^{ + return [managedObject valueForKey:managedObjectKey]; + }); + + if (nestedObject == nil) return YES; + + MTLModel *model = [self.class modelOfClass:nestedClass fromManagedObject:nestedObject processedObjects:processedObjects error:error]; + if (model == nil) return NO; + + return setValueForKey(propertyKey, model); + } + }; + + BOOL (^deserializeProperty)(NSPropertyDescription *) = ^(NSPropertyDescription *propertyDescription) { + if (propertyDescription == nil) { + if (error != NULL) { + NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"No property by name \"%@\" exists on the entity.", @""), managedObjectKey]; + + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not deserialize managed object", @""), + NSLocalizedFailureReasonErrorKey: failureReason, + }; + + *error = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorInvalidManagedObjectKey userInfo:userInfo]; + } + + return NO; + } + + // Jump through some hoops to avoid referencing classes directly. + NSString *propertyClassName = NSStringFromClass(propertyDescription.class); + if ([propertyClassName isEqual:@"NSAttributeDescription"]) { + return deserializeAttribute((id)propertyDescription); + } else if ([propertyClassName isEqual:@"NSRelationshipDescription"]) { + return deserializeRelationship((id)propertyDescription); + } else { + if (error != NULL) { + NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"Property descriptions of class %@ are unsupported.", @""), propertyClassName]; + + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not deserialize managed object", @""), + NSLocalizedFailureReasonErrorKey: failureReason, + }; + + *error = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorUnsupportedManagedObjectPropertyType userInfo:userInfo]; + } + + return NO; + } + }; + + if (!deserializeProperty(managedObjectProperties[managedObjectKey])) return nil; + } + + return model; +} + ++ (id)modelOfClass:(Class)modelClass fromManagedObject:(NSManagedObject *)managedObject error:(NSError **)error { + NSSet *propertyKeys = [modelClass propertyKeys]; + + for (NSString *mappedPropertyKey in [modelClass managedObjectKeysByPropertyKey]) { + if ([propertyKeys containsObject:mappedPropertyKey]) continue; + + if (error != NULL) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Invalid entity attribute mapping", nil), + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:NSLocalizedString(@"%1$@ could not be parsed because its entity attribute mapping contains illegal property keys.", nil), modelClass] + }; + + *error = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorInvalidManagedObjectMapping userInfo:userInfo]; + } + + return nil; + } + + CFMutableDictionaryRef processedObjects = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + if (processedObjects == NULL) return nil; + + @onExit { + CFRelease(processedObjects); + }; + + return [self modelOfClass:modelClass fromManagedObject:managedObject processedObjects:processedObjects error:error]; +} + ++ (id)modelOfClass:(Class)modelClass fromManagedObject:(NSManagedObject *)managedObject processedObjects:(CFMutableDictionaryRef)processedObjects error:(NSError **)error { + NSParameterAssert(modelClass != nil); + NSParameterAssert(processedObjects != nil); + + if (managedObject == nil) return nil; + + const void *existingModel = CFDictionaryGetValue(processedObjects, (__bridge void *)managedObject); + if (existingModel != NULL) { + return (__bridge id)existingModel; + } + + if ([modelClass respondsToSelector:@selector(classForDeserializingManagedObject:)]) { + modelClass = [modelClass classForDeserializingManagedObject:managedObject]; + if (modelClass == nil) { + if (error != NULL) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not deserialize managed object", @""), + NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"No model class could be found to deserialize the object.", @"") + }; + + *error = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorNoClassFound userInfo:userInfo]; + } + + return nil; + } + } + + MTLManagedObjectAdapter *adapter = [[self alloc] initWithModelClass:modelClass]; + return [adapter modelFromManagedObject:managedObject processedObjects:processedObjects error:error]; +} + +- (id)managedObjectFromModel:(MTLModel *)model insertingIntoContext:(NSManagedObjectContext *)context processedObjects:(CFMutableDictionaryRef)processedObjects error:(NSError **)error { + NSParameterAssert(model != nil); + NSParameterAssert(context != nil); + NSParameterAssert(processedObjects != nil); + + NSString *entityName = [model.class managedObjectEntityName]; + NSAssert(entityName != nil, @"%@ returned a nil +managedObjectEntityName", model.class); + + Class entityDescriptionClass = NSClassFromString(@"NSEntityDescription"); + NSAssert(entityDescriptionClass != nil, @"CoreData.framework must be linked to use MTLManagedObjectAdapter"); + + Class fetchRequestClass = NSClassFromString(@"NSFetchRequest"); + NSAssert(fetchRequestClass != nil, @"CoreData.framework must be linked to use MTLManagedObjectAdapter"); + + // If a uniquing predicate is provided, perform a fetch request to guarantee a unique managed object. + __block NSManagedObject *managedObject = nil; + NSPredicate *uniquingPredicate = [self uniquingPredicateForModel:model]; + + if (uniquingPredicate != nil) { + __block NSError *fetchRequestError = nil; + __block BOOL encountedError = NO; + managedObject = performInContext(context, ^ id { + NSFetchRequest *fetchRequest = [[fetchRequestClass alloc] init]; + fetchRequest.entity = [entityDescriptionClass entityForName:entityName inManagedObjectContext:context]; + fetchRequest.predicate = uniquingPredicate; + fetchRequest.returnsObjectsAsFaults = NO; + fetchRequest.fetchLimit = 1; + + NSArray *results = [context executeFetchRequest:fetchRequest error:&fetchRequestError]; + + if (results == nil) { + encountedError = YES; + if (error != NULL) { + NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"Failed to fetch a managed object for uniqing predicate \"%@\".", @""), uniquingPredicate]; + + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not serialize managed object", @""), + NSLocalizedFailureReasonErrorKey: failureReason, + }; + + fetchRequestError = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorUniqueFetchRequestFailed userInfo:userInfo]; + } + + return nil; + } + + return results.mtl_firstObject; + }); + + if (encountedError && error != NULL) { + *error = fetchRequestError; + return nil; + } + } + + if (managedObject == nil) { + managedObject = [entityDescriptionClass insertNewObjectForEntityForName:entityName inManagedObjectContext:context]; + } else { + // Our CoreData store already has data for this model, we need to merge + [self mergeValuesOfModel:model forKeysFromManagedObject:managedObject]; + } + + if (managedObject == nil) { + if (error != NULL) { + NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"Failed to initialize a managed object from entity named \"%@\".", @""), entityName]; + + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not serialize managed object", @""), + NSLocalizedFailureReasonErrorKey: failureReason, + }; + + *error = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorInitializationFailed userInfo:userInfo]; + } + + return nil; + } + + // Assign all errors to this variable to work around a memory problem. + // + // See https://github.com/github/Mantle/pull/120 for more context. + __block NSError *tmpError; + + // Pre-emptively consider this object processed, so that we don't get into + // any cycles when processing its relationships. + CFDictionaryAddValue(processedObjects, (__bridge void *)model, (__bridge void *)managedObject); + + NSDictionary *dictionaryValue = model.dictionaryValue; + NSDictionary *managedObjectProperties = managedObject.entity.propertiesByName; + + [dictionaryValue enumerateKeysAndObjectsUsingBlock:^(NSString *propertyKey, id value, BOOL *stop) { + NSString *managedObjectKey = [self managedObjectKeyForKey:propertyKey]; + if (managedObjectKey == nil) return; + if ([value isEqual:NSNull.null]) value = nil; + + BOOL (^serializeAttribute)(NSAttributeDescription *) = ^(NSAttributeDescription *attributeDescription) { + // Mark this as being autoreleased, because validateValue may return + // a new object to be stored in this variable (and we don't want ARC to + // double-free or leak the old or new values). + __autoreleasing id transformedValue = value; + + NSValueTransformer *attributeTransformer = [self entityAttributeTransformerForKey:propertyKey]; + if (attributeTransformer != nil) transformedValue = [attributeTransformer transformedValue:transformedValue]; + + if (![managedObject validateValue:&transformedValue forKey:managedObjectKey error:&tmpError]) return NO; + [managedObject setValue:transformedValue forKey:managedObjectKey]; + + return YES; + }; + + NSManagedObject * (^objectForRelationshipFromModel)(id) = ^ id (id model) { + if (![model isKindOfClass:MTLModel.class] || ![model conformsToProtocol:@protocol(MTLManagedObjectSerializing)]) { + NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"Property of class %@ cannot be encoded into an NSManagedObject.", @""), [model class]]; + + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not serialize managed object", @""), + NSLocalizedFailureReasonErrorKey: failureReason + }; + + tmpError = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorUnsupportedRelationshipClass userInfo:userInfo]; + + return nil; + } + + return [self.class managedObjectFromModel:model insertingIntoContext:context processedObjects:processedObjects error:&tmpError]; + }; + + BOOL (^serializeRelationship)(NSRelationshipDescription *) = ^(NSRelationshipDescription *relationshipDescription) { + if (value == nil) return YES; + + if ([relationshipDescription isToMany]) { + if (![value conformsToProtocol:@protocol(NSFastEnumeration)]) { + NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"Property of class %@ cannot be encoded into a to-many relationship.", @""), [value class]]; + + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not serialize managed object", @""), + NSLocalizedFailureReasonErrorKey: failureReason + }; + + tmpError = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorUnsupportedRelationshipClass userInfo:userInfo]; + + return NO; + } + + id relationshipCollection; + if ([relationshipDescription isOrdered]) { + relationshipCollection = [NSMutableOrderedSet orderedSet]; + } else { + relationshipCollection = [NSMutableSet set]; + } + + for (MTLModel *model in value) { + NSManagedObject *nestedObject = objectForRelationshipFromModel(model); + if (nestedObject == nil) return NO; + + [relationshipCollection addObject:nestedObject]; + } + + [managedObject setValue:relationshipCollection forKey:managedObjectKey]; + } else { + NSManagedObject *nestedObject = objectForRelationshipFromModel(value); + if (nestedObject == nil) return NO; + + [managedObject setValue:nestedObject forKey:managedObjectKey]; + } + + return YES; + }; + + BOOL (^serializeProperty)(NSPropertyDescription *) = ^(NSPropertyDescription *propertyDescription) { + if (propertyDescription == nil) { + NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"No property by name \"%@\" exists on the entity.", @""), managedObjectKey]; + + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not serialize managed object", @""), + NSLocalizedFailureReasonErrorKey: failureReason + }; + + tmpError = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorInvalidManagedObjectKey userInfo:userInfo]; + + return NO; + } + + // Jump through some hoops to avoid referencing classes directly. + NSString *propertyClassName = NSStringFromClass(propertyDescription.class); + if ([propertyClassName isEqual:@"NSAttributeDescription"]) { + return serializeAttribute((id)propertyDescription); + } else if ([propertyClassName isEqual:@"NSRelationshipDescription"]) { + return serializeRelationship((id)propertyDescription); + } else { + NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"Property descriptions of class %@ are unsupported.", @""), propertyClassName]; + + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"Could not serialize managed object", @""), + NSLocalizedFailureReasonErrorKey: failureReason + }; + + tmpError = [NSError errorWithDomain:MTLManagedObjectAdapterErrorDomain code:MTLManagedObjectAdapterErrorUnsupportedManagedObjectPropertyType userInfo:userInfo]; + + return NO; + } + }; + + if (!serializeProperty(managedObjectProperties[managedObjectKey])) { + performInContext(context, ^ id { + [context deleteObject:managedObject]; + return nil; + }); + + managedObject = nil; + *stop = YES; + } + }]; + + if (managedObject != nil && ![managedObject validateForInsert:&tmpError]) { + managedObject = performInContext(context, ^ id { + [context deleteObject:managedObject]; + return nil; + }); + } + + if (error != NULL) { + *error = tmpError; + } + + return managedObject; +} + ++ (id)managedObjectFromModel:(MTLModel *)model insertingIntoContext:(NSManagedObjectContext *)context error:(NSError **)error { + CFDictionaryKeyCallBacks keyCallbacks = kCFTypeDictionaryKeyCallBacks; + + // Compare MTLModel keys using pointer equality, not -isEqual:. + keyCallbacks.equal = NULL; + + CFMutableDictionaryRef processedObjects = CFDictionaryCreateMutable(NULL, 0, &keyCallbacks, &kCFTypeDictionaryValueCallBacks); + if (processedObjects == NULL) return nil; + + @onExit { + CFRelease(processedObjects); + }; + + return [self managedObjectFromModel:model insertingIntoContext:context processedObjects:processedObjects error:error]; +} + ++ (id)managedObjectFromModel:(MTLModel *)model insertingIntoContext:(NSManagedObjectContext *)context processedObjects:(CFMutableDictionaryRef)processedObjects error:(NSError **)error { + NSParameterAssert(model != nil); + NSParameterAssert(context != nil); + NSParameterAssert(processedObjects != nil); + + const void *existingManagedObject = CFDictionaryGetValue(processedObjects, (__bridge void *)model); + if (existingManagedObject != NULL) { + return (__bridge id)existingManagedObject; + } + + MTLManagedObjectAdapter *adapter = [[self alloc] initWithModelClass:model.class]; + return [adapter managedObjectFromModel:model insertingIntoContext:context processedObjects:processedObjects error:error]; +} + +- (NSValueTransformer *)entityAttributeTransformerForKey:(NSString *)key { + NSParameterAssert(key != nil); + + SEL selector = MTLSelectorWithKeyPattern(key, "EntityAttributeTransformer"); + if ([self.modelClass respondsToSelector:selector]) { + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self.modelClass methodSignatureForSelector:selector]]; + invocation.target = self.modelClass; + invocation.selector = selector; + [invocation invoke]; + + __unsafe_unretained id result = nil; + [invocation getReturnValue:&result]; + return result; + } + + if ([self.modelClass respondsToSelector:@selector(entityAttributeTransformerForKey:)]) { + return [self.modelClass entityAttributeTransformerForKey:key]; + } + + return nil; +} + +- (NSString *)managedObjectKeyForKey:(NSString *)key { + NSParameterAssert(key != nil); + + id managedObjectKey = self.managedObjectKeysByPropertyKey[key]; + if ([managedObjectKey isEqual:NSNull.null]) return nil; + + if (managedObjectKey == nil) { + return key; + } else { + return managedObjectKey; + } +} + +- (void)mergeValueOfModel:(MTLModel *)model forKey:(NSString *)key fromManagedObject:(NSManagedObject *)managedObject { + [model mergeValueForKey:key fromManagedObject:managedObject]; +} + +- (void)mergeValuesOfModel:(MTLModel *)model forKeysFromManagedObject:(NSManagedObject *)managedObject { + if ([model respondsToSelector:@selector(mergeValuesForKeysFromManagedObject:)]) { + [model mergeValuesForKeysFromManagedObject:managedObject]; + } else if ([model respondsToSelector:@selector(mergeValueForKey:fromManagedObject:)]) { + [[model.class managedObjectKeysByPropertyKey] enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *managedObjectKey, BOOL *stop) { + [self mergeValueOfModel:model forKey:key fromManagedObject:managedObject]; + }]; + } +} + +- (NSPredicate *)uniquingPredicateForModel:(MTLModel *)model { + if (![self.modelClass respondsToSelector:@selector(propertyKeysForManagedObjectUniquing)]) return nil; + + NSSet *propertyKeys = [self.modelClass propertyKeysForManagedObjectUniquing]; + + if (propertyKeys == nil) return nil; + + NSAssert(propertyKeys.count > 0, @"+propertyKeysForManagedObjectUniquing must not be empty."); + + NSMutableArray *subpredicates = [NSMutableArray array]; + for (NSString *propertyKey in propertyKeys) { + NSString *managedObjectKey = [self managedObjectKeyForKey:propertyKey]; + + NSAssert(managedObjectKey != nil, @"%@ must map to a managed object key.", propertyKey); + + id transformedValue = [model valueForKeyPath:propertyKey]; + + NSValueTransformer *attributeTransformer = [self entityAttributeTransformerForKey:propertyKey]; + if (attributeTransformer != nil) transformedValue = [attributeTransformer transformedValue:transformedValue]; + + NSPredicate *subpredicate = [NSPredicate predicateWithFormat:@"%K == %@", managedObjectKey, transformedValue]; + [subpredicates addObject:subpredicate]; + } + + return [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel+NSCoding.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel+NSCoding.h new file mode 100644 index 0000000..94b8f7b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel+NSCoding.h @@ -0,0 +1,128 @@ +// +// MTLModel+NSCoding.h +// Mantle +// +// Created by Justin Spahr-Summers on 2013-02-12. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import "MTLModel.h" + +// Defines how a MTLModel property key should be encoded into an archive. +// +// MTLModelEncodingBehaviorExcluded - The property should never be encoded. +// MTLModelEncodingBehaviorUnconditional - The property should always be +// encoded. +// MTLModelEncodingBehaviorConditional - The object should be encoded only +// if unconditionally encoded elsewhere. +// This should only be used for object +// properties. +typedef enum : NSUInteger { + MTLModelEncodingBehaviorExcluded = 0, + MTLModelEncodingBehaviorUnconditional, + MTLModelEncodingBehaviorConditional, +} MTLModelEncodingBehavior; + +// Implements default archiving and unarchiving behaviors for MTLModel. +@interface MTLModel (NSCoding) + +// Initializes the receiver from an archive. +// +// This will decode the original +modelVersion of the archived object, then +// invoke -decodeValueForKey:withCoder:modelVersion: for each of the receiver's +// +propertyKeys. +// +// Returns an initialized model object, or nil if a decoding error occurred. +- (id)initWithCoder:(NSCoder *)coder; + +// Archives the receiver using the given coder. +// +// This will encode the receiver's +modelVersion, then the receiver's properties +// according to the behaviors specified in +encodingBehaviorsByPropertyKey. +- (void)encodeWithCoder:(NSCoder *)coder; + +// Determines how the +propertyKeys of the class are encoded into an archive. +// The values of this dictionary should be boxed MTLModelEncodingBehavior +// values. +// +// Any keys not present in the dictionary will be excluded from the archive. +// +// Subclasses overriding this method should combine their values with those of +// `super`. +// +// Returns a dictionary mapping the receiver's +propertyKeys to default encoding +// behaviors. If a property is an object with `weak` semantics, the default +// behavior is MTLModelEncodingBehaviorConditional; otherwise, the default is +// MTLModelEncodingBehaviorUnconditional. ++ (NSDictionary *)encodingBehaviorsByPropertyKey; + +// Determines the classes that are allowed to be decoded for each of the +// receiver's properties when using . The values of this +// dictionary should be NSArrays of Class objects. +// +// If any encodable keys (as determined by +encodingBehaviorsByPropertyKey) are +// not present in the dictionary, an exception will be thrown during secure +// encoding or decoding. +// +// Subclasses overriding this method should combine their values with those of +// `super`. +// +// Returns a dictionary mapping the receiver's encodable keys (as determined by +// +encodingBehaviorsByPropertyKey) to default allowed classes, based on the +// type that each property is declared as. If type of an encodable property +// cannot be determined (e.g., it is declared as `id`), it will be omitted from +// the dictionary, and subclasses must provide a valid value to prevent an +// exception being thrown during encoding/decoding. ++ (NSDictionary *)allowedSecureCodingClassesByPropertyKey; + +// Decodes the value of the given property key from an archive. +// +// By default, this method looks for a `-decodeWithCoder:modelVersion:` +// method on the receiver, and invokes it if found. +// +// If the custom method is not implemented and `coder` does not require secure +// coding, `-[NSCoder decodeObjectForKey:]` will be invoked with the given +// `key`. +// +// If the custom method is not implemented and `coder` requires secure coding, +// `-[NSCoder decodeObjectOfClasses:forKey:]` will be invoked with the +// information from +allowedSecureCodingClassesByPropertyKey and the given `key`. The +// receiver must conform to for this to work correctly. +// +// key - The property key to decode the value for. This argument cannot +// be nil. +// coder - The NSCoder representing the archive being decoded. This +// argument cannot be nil. +// modelVersion - The version of the original model object that was encoded. +// +// Returns the decoded and boxed value, or nil if the key was not present. +- (id)decodeValueForKey:(NSString *)key withCoder:(NSCoder *)coder modelVersion:(NSUInteger)modelVersion; + +// The version of this MTLModel subclass. +// +// This version number is saved in archives so that later model changes can be +// made backwards-compatible with old versions. +// +// Subclasses should override this method to return a higher version number +// whenever a breaking change is made to the model. +// +// Returns 0. ++ (NSUInteger)modelVersion; + +@end + +// This method must be overridden to support archives created by older versions +// of Mantle (before the `MTLModel+NSCoding` interface existed). +@interface MTLModel (OldArchiveSupport) + +// Converts an archived external representation to a dictionary suitable for +// passing to -initWithDictionary:. +// +// externalRepresentation - The decoded external representation of the receiver. +// fromVersion - The model version at the time the external +// representation was encoded. +// +// Returns nil by default, indicating that conversion failed. ++ (NSDictionary *)dictionaryValueFromArchivedExternalRepresentation:(NSDictionary *)externalRepresentation version:(NSUInteger)fromVersion; + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel+NSCoding.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel+NSCoding.m new file mode 100644 index 0000000..852f5ae --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel+NSCoding.m @@ -0,0 +1,267 @@ +// +// MTLModel+NSCoding.m +// Mantle +// +// Created by Justin Spahr-Summers on 2013-02-12. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import "MTLModel+NSCoding.h" +#import "EXTRuntimeExtensions.h" +#import "EXTScope.h" +#import "MTLReflection.h" +#import + +// Used in archives to store the modelVersion of the archived instance. +static NSString * const MTLModelVersionKey = @"MTLModelVersion"; + +// Used to cache the reflection performed in +allowedSecureCodingClassesByPropertyKey. +static void *MTLModelCachedAllowedClassesKey = &MTLModelCachedAllowedClassesKey; + +// Returns whether the given NSCoder requires secure coding. +static BOOL coderRequiresSecureCoding(NSCoder *coder) { + SEL requiresSecureCodingSelector = @selector(requiresSecureCoding); + + // Only invoke the method if it's implemented (i.e., only on OS X 10.8+ and + // iOS 6+). + if (![coder respondsToSelector:requiresSecureCodingSelector]) return NO; + + BOOL (*requiresSecureCodingIMP)(NSCoder *, SEL) = (__typeof__(requiresSecureCodingIMP))[coder methodForSelector:requiresSecureCodingSelector]; + if (requiresSecureCodingIMP == NULL) return NO; + + return requiresSecureCodingIMP(coder, requiresSecureCodingSelector); +} + +// Returns all of the given class' encodable property keys (those that will not +// be excluded from archives). +static NSSet *encodablePropertyKeysForClass(Class modelClass) { + return [[modelClass encodingBehaviorsByPropertyKey] keysOfEntriesPassingTest:^ BOOL (NSString *propertyKey, NSNumber *behavior, BOOL *stop) { + return behavior.unsignedIntegerValue != MTLModelEncodingBehaviorExcluded; + }]; +} + +// Verifies that all of the specified class' encodable property keys are present +// in +allowedSecureCodingClassesByPropertyKey, and throws an exception if not. +static void verifyAllowedClassesByPropertyKey(Class modelClass) { + NSDictionary *allowedClasses = [modelClass allowedSecureCodingClassesByPropertyKey]; + + NSMutableSet *specifiedPropertyKeys = [[NSMutableSet alloc] initWithArray:allowedClasses.allKeys]; + [specifiedPropertyKeys minusSet:encodablePropertyKeysForClass(modelClass)]; + + if (specifiedPropertyKeys.count > 0) { + [NSException raise:NSInvalidArgumentException format:@"Cannot encode %@ securely, because keys are missing from +allowedSecureCodingClassesByPropertyKey: %@", modelClass, specifiedPropertyKeys]; + } +} + +@implementation MTLModel (NSCoding) + +#pragma mark Versioning + ++ (NSUInteger)modelVersion { + return 0; +} + +#pragma mark Encoding Behaviors + ++ (NSDictionary *)encodingBehaviorsByPropertyKey { + NSSet *propertyKeys = self.propertyKeys; + NSMutableDictionary *behaviors = [[NSMutableDictionary alloc] initWithCapacity:propertyKeys.count]; + + for (NSString *key in propertyKeys) { + objc_property_t property = class_getProperty(self, key.UTF8String); + NSAssert(property != NULL, @"Could not find property \"%@\" on %@", key, self); + + mtl_propertyAttributes *attributes = mtl_copyPropertyAttributes(property); + @onExit { + free(attributes); + }; + + MTLModelEncodingBehavior behavior = (attributes->weak ? MTLModelEncodingBehaviorConditional : MTLModelEncodingBehaviorUnconditional); + behaviors[key] = @(behavior); + } + + return behaviors; +} + ++ (NSDictionary *)allowedSecureCodingClassesByPropertyKey { + NSDictionary *cachedClasses = objc_getAssociatedObject(self, MTLModelCachedAllowedClassesKey); + if (cachedClasses != nil) return cachedClasses; + + // Get all property keys that could potentially be encoded. + NSSet *propertyKeys = [self.encodingBehaviorsByPropertyKey keysOfEntriesPassingTest:^ BOOL (NSString *propertyKey, NSNumber *behavior, BOOL *stop) { + return behavior.unsignedIntegerValue != MTLModelEncodingBehaviorExcluded; + }]; + + NSMutableDictionary *allowedClasses = [[NSMutableDictionary alloc] initWithCapacity:propertyKeys.count]; + + for (NSString *key in propertyKeys) { + objc_property_t property = class_getProperty(self, key.UTF8String); + NSAssert(property != NULL, @"Could not find property \"%@\" on %@", key, self); + + mtl_propertyAttributes *attributes = mtl_copyPropertyAttributes(property); + @onExit { + free(attributes); + }; + + // If the property is not of object or class type, assume that it's + // a primitive which would be boxed into an NSValue. + if (attributes->type[0] != '@' && attributes->type[0] != '#') { + allowedClasses[key] = @[ NSValue.class ]; + continue; + } + + // Omit this property from the dictionary if its class isn't known. + if (attributes->objectClass != nil) { + allowedClasses[key] = @[ attributes->objectClass ]; + } + } + + // It doesn't really matter if we replace another thread's work, since we do + // it atomically and the result should be the same. + objc_setAssociatedObject(self, MTLModelCachedAllowedClassesKey, allowedClasses, OBJC_ASSOCIATION_COPY); + + return allowedClasses; +} + +- (id)decodeValueForKey:(NSString *)key withCoder:(NSCoder *)coder modelVersion:(NSUInteger)modelVersion { + NSParameterAssert(key != nil); + NSParameterAssert(coder != nil); + + SEL selector = MTLSelectorWithCapitalizedKeyPattern("decode", key, "WithCoder:modelVersion:"); + if ([self respondsToSelector:selector]) { + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:selector]]; + invocation.target = self; + invocation.selector = selector; + [invocation setArgument:&coder atIndex:2]; + [invocation setArgument:&modelVersion atIndex:3]; + [invocation invoke]; + + __unsafe_unretained id result = nil; + [invocation getReturnValue:&result]; + return result; + } + + @try { + if (coderRequiresSecureCoding(coder)) { + NSArray *allowedClasses = self.class.allowedSecureCodingClassesByPropertyKey[key]; + NSAssert(allowedClasses != nil, @"No allowed classes specified for securely decoding key \"%@\" on %@", key, self.class); + + return [coder decodeObjectOfClasses:[NSSet setWithArray:allowedClasses] forKey:key]; + } else { + return [coder decodeObjectForKey:key]; + } + } @catch (NSException *ex) { + NSLog(@"*** Caught exception decoding value for key \"%@\" on class %@: %@", key, self.class, ex); + @throw ex; + } +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)coder { + BOOL requiresSecureCoding = coderRequiresSecureCoding(coder); + NSNumber *version = nil; + if (requiresSecureCoding) { + version = [coder decodeObjectOfClass:NSNumber.class forKey:MTLModelVersionKey]; + } else { + version = [coder decodeObjectForKey:MTLModelVersionKey]; + } + + if (version == nil) { + NSLog(@"Warning: decoding an archive of %@ without a version, assuming 0", self.class); + } else if (version.unsignedIntegerValue > self.class.modelVersion) { + // Don't try to decode newer versions. + return nil; + } + + if (requiresSecureCoding) { + verifyAllowedClassesByPropertyKey(self.class); + } else { + // Handle the old archive format. + NSDictionary *externalRepresentation = [coder decodeObjectForKey:@"externalRepresentation"]; + if (externalRepresentation != nil) { + NSAssert([self.class methodForSelector:@selector(dictionaryValueFromArchivedExternalRepresentation:version:)] != [MTLModel methodForSelector:@selector(dictionaryValueFromArchivedExternalRepresentation:version:)], @"Decoded an old archive of %@ that contains an externalRepresentation, but +dictionaryValueFromArchivedExternalRepresentation:version: is not overridden to handle it", self.class); + + NSDictionary *dictionaryValue = [self.class dictionaryValueFromArchivedExternalRepresentation:externalRepresentation version:version.unsignedIntegerValue]; + if (dictionaryValue == nil) return nil; + + NSError *error = nil; + self = [self initWithDictionary:dictionaryValue error:&error]; + if (self == nil) NSLog(@"*** Could not decode old %@ archive: %@", self.class, error); + + return self; + } + } + + NSSet *propertyKeys = self.class.propertyKeys; + NSMutableDictionary *dictionaryValue = [[NSMutableDictionary alloc] initWithCapacity:propertyKeys.count]; + + for (NSString *key in propertyKeys) { + id value = [self decodeValueForKey:key withCoder:coder modelVersion:version.unsignedIntegerValue]; + if (value == nil) continue; + + dictionaryValue[key] = value; + } + + NSError *error = nil; + self = [self initWithDictionary:dictionaryValue error:&error]; + if (self == nil) NSLog(@"*** Could not unarchive %@: %@", self.class, error); + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + if (coderRequiresSecureCoding(coder)) verifyAllowedClassesByPropertyKey(self.class); + + [coder encodeObject:@(self.class.modelVersion) forKey:MTLModelVersionKey]; + + NSDictionary *encodingBehaviors = self.class.encodingBehaviorsByPropertyKey; + [self.dictionaryValue enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *stop) { + @try { + // Skip nil values. + if ([value isEqual:NSNull.null]) return; + + switch ([encodingBehaviors[key] unsignedIntegerValue]) { + // This will also match a nil behavior. + case MTLModelEncodingBehaviorExcluded: + break; + + case MTLModelEncodingBehaviorUnconditional: + [coder encodeObject:value forKey:key]; + break; + + case MTLModelEncodingBehaviorConditional: + [coder encodeConditionalObject:value forKey:key]; + break; + + default: + NSAssert(NO, @"Unrecognized encoding behavior %@ on class %@ for key \"%@\"", self.class, encodingBehaviors[key], key); + } + } @catch (NSException *ex) { + NSLog(@"*** Caught exception encoding value for key \"%@\" on class %@: %@", key, self.class, ex); + @throw ex; + } + }]; +} + +#pragma mark NSSecureCoding + ++ (BOOL)supportsSecureCoding { + // Disable secure coding support by default, so subclasses are forced to + // opt-in by conforming to the protocol and overriding this method. + // + // We only implement this method because XPC complains if a subclass tries + // to implement it but does not override -initWithCoder:. See + // https://github.com/github/Mantle/issues/74. + return NO; +} + +@end + +@implementation MTLModel (OldArchiveSupport) + ++ (NSDictionary *)dictionaryValueFromArchivedExternalRepresentation:(NSDictionary *)externalRepresentation version:(NSUInteger)fromVersion { + return nil; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel.h new file mode 100644 index 0000000..65da40d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel.h @@ -0,0 +1,125 @@ +// +// MTLModel.h +// Mantle +// +// Created by Justin Spahr-Summers on 2012-09-11. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +// An abstract base class for model objects, using reflection to provide +// sensible default behaviors. +// +// The default implementations of , -hash, and -isEqual: make use of +// the +propertyKeys method. +@interface MTLModel : NSObject + +// Returns a new instance of the receiver initialized using +// -initWithDictionary:error:. ++ (instancetype)modelWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error; + +// Initializes the receiver with default values. +// +// This is the designated initializer for this class. +- (instancetype)init; + +// Initializes the receiver using key-value coding, setting the keys and values +// in the given dictionary. +// +// Subclass implementations may override this method, calling the super +// implementation, in order to perform further processing and initialization +// after deserialization. +// +// dictionaryValue - Property keys and values to set on the receiver. Any NSNull +// values will be converted to nil before being used. KVC +// validation methods will automatically be invoked for all of +// the properties given. If nil, this method is equivalent to +// -init. +// error - If not NULL, this may be set to any error that occurs +// (like a KVC validation error). +// +// Returns an initialized model object, or nil if validation failed. +- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error; + +// Returns the keys for all @property declarations, except for `readonly` +// properties without ivars, or properties on MTLModel itself. ++ (NSSet *)propertyKeys; + +// A dictionary representing the properties of the receiver. +// +// The default implementation combines the values corresponding to all +// +propertyKeys into a dictionary, with any nil values represented by NSNull. +// +// This property must never be nil. +@property (nonatomic, copy, readonly) NSDictionary *dictionaryValue; + +// Merges the value of the given key on the receiver with the value of the same +// key from the given model object, giving precedence to the other model object. +// +// By default, this method looks for a `-mergeFromModel:` method on the +// receiver, and invokes it if found. If not found, and `model` is not nil, the +// value for the given key is taken from `model`. +- (void)mergeValueForKey:(NSString *)key fromModel:(MTLModel *)model; + +// Merges the values of the given model object into the receiver, using +// -mergeValueForKey:fromModel: for each key in +propertyKeys. +// +// `model` must be an instance of the receiver's class or a subclass thereof. +- (void)mergeValuesForKeysFromModel:(MTLModel *)model; + +// Compares the receiver with another object for equality. +// +// The default implementation is equivalent to comparing both models' +// -dictionaryValue. +// +// Note that this may lead to infinite loops if the receiver holds a circular +// reference to another MTLModel and both use the default behavior. +// It is recommended to override -isEqual: in this scenario. +- (BOOL)isEqual:(id)object; + +// A string that describes the contents of the receiver. +// +// The default implementation is based on the receiver's class and its +// -dictionaryValue. +// +// Note that this may lead to infinite loops if the receiver holds a circular +// reference to another MTLModel and both use the default behavior. +// It is recommended to override -description in this scenario. +- (NSString *)description; + +@end + +// Implements validation logic for MTLModel. +@interface MTLModel (Validation) + +// Validates the model. +// +// The default implementation simply invokes -validateValue:forKey:error: with +// all +propertyKeys and their current value. If -validateValue:forKey:error: +// returns a new value, the property is set to that new value. +// +// error - If not NULL, this may be set to any error that occurs during +// validation +// +// Returns YES if the model is valid, or NO if the validation failed. +- (BOOL)validate:(NSError **)error; + +@end + +@interface MTLModel (Unavailable) + ++ (instancetype)modelWithDictionary:(NSDictionary *)dictionaryValue __attribute__((deprecated("Replaced by +modelWithDictionary:error:"))); +- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue __attribute__((deprecated("Replaced by -initWithDictionary:error:"))); + ++ (instancetype)modelWithExternalRepresentation:(NSDictionary *)externalRepresentation __attribute__((deprecated("Replaced by -[MTLJSONAdapter initWithJSONDictionary:modelClass:]"))); +- (instancetype)initWithExternalRepresentation:(NSDictionary *)externalRepresentation __attribute__((deprecated("Replaced by -[MTLJSONAdapter initWithJSONDictionary:modelClass:]"))); + +@property (nonatomic, copy, readonly) NSDictionary *externalRepresentation __attribute__((deprecated("Replaced by MTLJSONAdapter.JSONDictionary"))); + ++ (NSDictionary *)externalRepresentationKeyPathsByPropertyKey __attribute__((deprecated("Replaced by +JSONKeyPathsByPropertyKey in "))); ++ (NSValueTransformer *)transformerForKey:(NSString *)key __attribute__((deprecated("Replaced by +JSONTransformerForKey: in "))); + ++ (NSDictionary *)migrateExternalRepresentation:(NSDictionary *)externalRepresentation fromVersion:(NSUInteger)fromVersion __attribute__((deprecated("Replaced by -decodeValueForKey:withCoder:modelVersion:"))); + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel.m new file mode 100644 index 0000000..2ef60fe --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLModel.m @@ -0,0 +1,245 @@ +// +// MTLModel.m +// Mantle +// +// Created by Justin Spahr-Summers on 2012-09-11. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSError+MTLModelException.h" +#import "MTLModel.h" +#import "EXTRuntimeExtensions.h" +#import "EXTScope.h" +#import "MTLReflection.h" +#import + +// This coupling is needed for backwards compatibility in MTLModel's deprecated +// methods. +#import "MTLJSONAdapter.h" +#import "MTLModel+NSCoding.h" + +// Used to cache the reflection performed in +propertyKeys. +static void *MTLModelCachedPropertyKeysKey = &MTLModelCachedPropertyKeysKey; + +// Validates a value for an object and sets it if necessary. +// +// obj - The object for which the value is being validated. This value +// must not be nil. +// key - The name of one of `obj`s properties. This value must not be +// nil. +// value - The new value for the property identified by `key`. +// forceUpdate - If set to `YES`, the value is being updated even if validating +// it did not change it. +// error - If not NULL, this may be set to any error that occurs during +// validation +// +// Returns YES if `value` could be validated and set, or NO if an error +// occurred. +static BOOL MTLValidateAndSetValue(id obj, NSString *key, id value, BOOL forceUpdate, NSError **error) { + // Mark this as being autoreleased, because validateValue may return + // a new object to be stored in this variable (and we don't want ARC to + // double-free or leak the old or new values). + __autoreleasing id validatedValue = value; + + @try { + if (![obj validateValue:&validatedValue forKey:key error:error]) return NO; + + if (forceUpdate || value != validatedValue) { + [obj setValue:validatedValue forKey:key]; + } + + return YES; + } @catch (NSException *ex) { + NSLog(@"*** Caught exception setting key \"%@\" : %@", key, ex); + + // Fail fast in Debug builds. + #if DEBUG + @throw ex; + #else + if (error != NULL) { + *error = [NSError mtl_modelErrorWithException:ex]; + } + + return NO; + #endif + } +} + +@interface MTLModel () + +// Enumerates all properties of the receiver's class hierarchy, starting at the +// receiver, and continuing up until (but not including) MTLModel. +// +// The given block will be invoked multiple times for any properties declared on +// multiple classes in the hierarchy. ++ (void)enumeratePropertiesUsingBlock:(void (^)(objc_property_t property, BOOL *stop))block; + +@end + +@implementation MTLModel + +#pragma mark Lifecycle + ++ (instancetype)modelWithDictionary:(NSDictionary *)dictionary error:(NSError **)error { + return [[self alloc] initWithDictionary:dictionary error:error]; +} + +- (instancetype)init { + // Nothing special by default, but we have a declaration in the header. + return [super init]; +} + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary error:(NSError **)error { + self = [self init]; + if (self == nil) return nil; + + for (NSString *key in dictionary) { + // Mark this as being autoreleased, because validateValue may return + // a new object to be stored in this variable (and we don't want ARC to + // double-free or leak the old or new values). + __autoreleasing id value = [dictionary objectForKey:key]; + + if ([value isEqual:NSNull.null]) value = nil; + + BOOL success = MTLValidateAndSetValue(self, key, value, YES, error); + if (!success) return nil; + } + + return self; +} + +#pragma mark Reflection + ++ (void)enumeratePropertiesUsingBlock:(void (^)(objc_property_t property, BOOL *stop))block { + Class cls = self; + BOOL stop = NO; + + while (!stop && ![cls isEqual:MTLModel.class]) { + unsigned count = 0; + objc_property_t *properties = class_copyPropertyList(cls, &count); + + cls = cls.superclass; + if (properties == NULL) continue; + + @onExit { + free(properties); + }; + + for (unsigned i = 0; i < count; i++) { + block(properties[i], &stop); + if (stop) break; + } + } +} + ++ (NSSet *)propertyKeys { + NSSet *cachedKeys = objc_getAssociatedObject(self, MTLModelCachedPropertyKeysKey); + if (cachedKeys != nil) return cachedKeys; + + NSMutableSet *keys = [NSMutableSet set]; + + [self enumeratePropertiesUsingBlock:^(objc_property_t property, BOOL *stop) { + mtl_propertyAttributes *attributes = mtl_copyPropertyAttributes(property); + @onExit { + free(attributes); + }; + + if (attributes->readonly && attributes->ivar == NULL) return; + + NSString *key = @(property_getName(property)); + [keys addObject:key]; + }]; + + // It doesn't really matter if we replace another thread's work, since we do + // it atomically and the result should be the same. + objc_setAssociatedObject(self, MTLModelCachedPropertyKeysKey, keys, OBJC_ASSOCIATION_COPY); + + return keys; +} + +- (NSDictionary *)dictionaryValue { + return [self dictionaryWithValuesForKeys:self.class.propertyKeys.allObjects]; +} + +#pragma mark Merging + +- (void)mergeValueForKey:(NSString *)key fromModel:(MTLModel *)model { + NSParameterAssert(key != nil); + + SEL selector = MTLSelectorWithCapitalizedKeyPattern("merge", key, "FromModel:"); + if (![self respondsToSelector:selector]) { + if (model != nil) { + [self setValue:[model valueForKey:key] forKey:key]; + } + + return; + } + + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:selector]]; + invocation.target = self; + invocation.selector = selector; + + [invocation setArgument:&model atIndex:2]; + [invocation invoke]; +} + +- (void)mergeValuesForKeysFromModel:(MTLModel *)model { + NSSet *propertyKeys = model.class.propertyKeys; + for (NSString *key in self.class.propertyKeys) { + if (![propertyKeys containsObject:key]) continue; + + [self mergeValueForKey:key fromModel:model]; + } +} + +#pragma mark Validation + +- (BOOL)validate:(NSError **)error { + for (NSString *key in self.class.propertyKeys) { + id value = [self valueForKey:key]; + + BOOL success = MTLValidateAndSetValue(self, key, value, NO, error); + if (!success) return NO; + } + + return YES; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone { + return [[self.class allocWithZone:zone] initWithDictionary:self.dictionaryValue error:NULL]; +} + +#pragma mark NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p> %@", self.class, self, self.dictionaryValue]; +} + +- (NSUInteger)hash { + NSUInteger value = 0; + + for (NSString *key in self.class.propertyKeys) { + value ^= [[self valueForKey:key] hash]; + } + + return value; +} + +- (BOOL)isEqual:(MTLModel *)model { + if (self == model) return YES; + if (![model isMemberOfClass:self.class]) return NO; + + for (NSString *key in self.class.propertyKeys) { + id selfValue = [self valueForKey:key]; + id modelValue = [model valueForKey:key]; + + BOOL valuesEqual = ((selfValue == nil && modelValue == nil) || [selfValue isEqual:modelValue]); + if (!valuesEqual) return NO; + } + + return YES; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLReflection.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLReflection.h new file mode 100644 index 0000000..f4c100e --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLReflection.h @@ -0,0 +1,31 @@ +// +// MTLReflection.h +// Mantle +// +// Created by Justin Spahr-Summers on 2013-03-12. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import + +// Creates a selector from a key and a constant string. +// +// key - The key to insert into the generated selector. This key should be in +// its natural case. +// suffix - A string to append to the key as part of the selector. +// +// Returns a selector, or NULL if the input strings cannot form a valid +// selector. +SEL MTLSelectorWithKeyPattern(NSString *key, const char *suffix) __attribute__((pure, nonnull(1, 2))); + +// Creates a selector from a key and a constant prefix and suffix. +// +// prefix - A string to prepend to the key as part of the selector. +// key - The key to insert into the generated selector. This key should be in +// its natural case, and will have its first letter capitalized when +// inserted. +// suffix - A string to append to the key as part of the selector. +// +// Returns a selector, or NULL if the input strings cannot form a valid +// selector. +SEL MTLSelectorWithCapitalizedKeyPattern(const char *prefix, NSString *key, const char *suffix) __attribute__((pure, nonnull(1, 2, 3))); diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLReflection.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLReflection.m new file mode 100644 index 0000000..923e9e2 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLReflection.m @@ -0,0 +1,50 @@ +// +// MTLReflection.m +// Mantle +// +// Created by Justin Spahr-Summers on 2013-03-12. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import "MTLReflection.h" +#import + +SEL MTLSelectorWithKeyPattern(NSString *key, const char *suffix) { + NSUInteger keyLength = [key maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + NSUInteger suffixLength = strlen(suffix); + + char selector[keyLength + suffixLength + 1]; + + BOOL success = [key getBytes:selector maxLength:keyLength usedLength:&keyLength encoding:NSUTF8StringEncoding options:0 range:NSMakeRange(0, key.length) remainingRange:NULL]; + if (!success) return NULL; + + memcpy(selector + keyLength, suffix, suffixLength); + selector[keyLength + suffixLength] = '\0'; + + return sel_registerName(selector); +} + +SEL MTLSelectorWithCapitalizedKeyPattern(const char *prefix, NSString *key, const char *suffix) { + NSUInteger prefixLength = strlen(prefix); + NSUInteger suffixLength = strlen(suffix); + + NSString *initial = [key substringToIndex:1].uppercaseString; + NSUInteger initialLength = [initial maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + NSString *rest = [key substringFromIndex:1]; + NSUInteger restLength = [rest maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + char selector[prefixLength + initialLength + restLength + suffixLength + 1]; + memcpy(selector, prefix, prefixLength); + + BOOL success = [initial getBytes:selector + prefixLength maxLength:initialLength usedLength:&initialLength encoding:NSUTF8StringEncoding options:0 range:NSMakeRange(0, initial.length) remainingRange:NULL]; + if (!success) return NULL; + + success = [rest getBytes:selector + prefixLength + initialLength maxLength:restLength usedLength:&restLength encoding:NSUTF8StringEncoding options:0 range:NSMakeRange(0, rest.length) remainingRange:NULL]; + if (!success) return NULL; + + memcpy(selector + prefixLength + initialLength + restLength, suffix, suffixLength); + selector[prefixLength + initialLength + restLength + suffixLength] = '\0'; + + return sel_registerName(selector); +} diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLValueTransformer.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLValueTransformer.h new file mode 100644 index 0000000..231b59f --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLValueTransformer.h @@ -0,0 +1,29 @@ +// +// MTLValueTransformer.h +// Mantle +// +// Created by Justin Spahr-Summers on 2012-09-11. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +typedef id (^MTLValueTransformerBlock)(id); + +// +// A value transformer supporting block-based transformation. +// +@interface MTLValueTransformer : NSValueTransformer + +// Returns a transformer which transforms values using the given block. Reverse +// transformations will not be allowed. ++ (instancetype)transformerWithBlock:(MTLValueTransformerBlock)transformationBlock; + +// Returns a transformer which transforms values using the given block, for +// forward or reverse transformations. ++ (instancetype)reversibleTransformerWithBlock:(MTLValueTransformerBlock)transformationBlock; + +// Returns a transformer which transforms values using the given blocks. ++ (instancetype)reversibleTransformerWithForwardBlock:(MTLValueTransformerBlock)forwardBlock reverseBlock:(MTLValueTransformerBlock)reverseBlock; + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLValueTransformer.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLValueTransformer.m new file mode 100644 index 0000000..5400d45 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/MTLValueTransformer.m @@ -0,0 +1,88 @@ +// +// MTLValueTransformer.m +// Mantle +// +// Created by Justin Spahr-Summers on 2012-09-11. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "MTLValueTransformer.h" + +// +// Any MTLValueTransformer supporting reverse transformation. Necessary because +// +allowsReverseTransformation is a class method. +// +@interface MTLReversibleValueTransformer : MTLValueTransformer +@end + +@interface MTLValueTransformer () + +@property (nonatomic, copy, readonly) MTLValueTransformerBlock forwardBlock; +@property (nonatomic, copy, readonly) MTLValueTransformerBlock reverseBlock; + +@end + +@implementation MTLValueTransformer + +#pragma mark Lifecycle + ++ (instancetype)transformerWithBlock:(MTLValueTransformerBlock)transformationBlock { + return [[self alloc] initWithForwardBlock:transformationBlock reverseBlock:nil]; +} + ++ (instancetype)reversibleTransformerWithBlock:(MTLValueTransformerBlock)transformationBlock { + return [self reversibleTransformerWithForwardBlock:transformationBlock reverseBlock:transformationBlock]; +} + ++ (instancetype)reversibleTransformerWithForwardBlock:(MTLValueTransformerBlock)forwardBlock reverseBlock:(MTLValueTransformerBlock)reverseBlock { + return [[MTLReversibleValueTransformer alloc] initWithForwardBlock:forwardBlock reverseBlock:reverseBlock]; +} + +- (id)initWithForwardBlock:(MTLValueTransformerBlock)forwardBlock reverseBlock:(MTLValueTransformerBlock)reverseBlock { + NSParameterAssert(forwardBlock != nil); + + self = [super init]; + if (self == nil) return nil; + + _forwardBlock = [forwardBlock copy]; + _reverseBlock = [reverseBlock copy]; + + return self; +} + +#pragma mark NSValueTransformer + ++ (BOOL)allowsReverseTransformation { + return NO; +} + ++ (Class)transformedValueClass { + return [NSObject class]; +} + +- (id)transformedValue:(id)value { + return self.forwardBlock(value); +} + +@end + +@implementation MTLReversibleValueTransformer + +#pragma mark Lifecycle + +- (id)initWithForwardBlock:(MTLValueTransformerBlock)forwardBlock reverseBlock:(MTLValueTransformerBlock)reverseBlock { + NSParameterAssert(reverseBlock != nil); + return [super initWithForwardBlock:forwardBlock reverseBlock:reverseBlock]; +} + +#pragma mark NSValueTransformer + ++ (BOOL)allowsReverseTransformation { + return YES; +} + +- (id)reverseTransformedValue:(id)value { + return self.reverseBlock(value); +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/Mantle.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/Mantle.h new file mode 100644 index 0000000..ebd74e7 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/Mantle.h @@ -0,0 +1,26 @@ +// +// Mantle.h +// Mantle +// +// Created by Justin Spahr-Summers on 2012-09-04. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +//! Project version number for Mantle. +FOUNDATION_EXPORT double MantleVersionNumber; + +//! Project version string for Mantle. +FOUNDATION_EXPORT const unsigned char MantleVersionString[]; + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSArray+MTLManipulationAdditions.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSArray+MTLManipulationAdditions.h new file mode 100644 index 0000000..fd7347c --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSArray+MTLManipulationAdditions.h @@ -0,0 +1,28 @@ +// +// NSArray+MTLManipulationAdditions.h +// Mantle +// +// Created by Josh Abernathy on 9/19/12. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +@interface NSArray (MTLManipulationAdditions) + +// The first object in the array or nil if the array is empty. +// Forwards to `firstObject` which has been first declared in iOS7, but works with iOS4/10.6. +@property (nonatomic, readonly, strong) id mtl_firstObject; + +// Returns a new array without all instances of the given object. +- (NSArray *)mtl_arrayByRemovingObject:(id)object; + +// Returns a new array without the first object. If the array is empty, it +// returns the empty array. +- (NSArray *)mtl_arrayByRemovingFirstObject; + +// Returns a new array without the last object. If the array is empty, it +// returns the empty array. +- (NSArray *)mtl_arrayByRemovingLastObject; + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSArray+MTLManipulationAdditions.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSArray+MTLManipulationAdditions.m new file mode 100644 index 0000000..e6932c9 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSArray+MTLManipulationAdditions.m @@ -0,0 +1,42 @@ +// +// NSArray+MTLManipulationAdditions.m +// Mantle +// +// Created by Josh Abernathy on 9/19/12. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSArray+MTLManipulationAdditions.h" + +@interface NSArray (MTLDeclarations) + +// This declaration is needed so Mantle can be compiled with SDK 6 / 10.8. +- (id)firstObject; + +@end + +@implementation NSArray (MTLManipulationAdditions) + +- (id)mtl_firstObject { + return self.firstObject; +} + +- (instancetype)mtl_arrayByRemovingObject:(id)object { + NSMutableArray *result = [self mutableCopy]; + [result removeObject:object]; + return result; +} + +- (instancetype)mtl_arrayByRemovingFirstObject { + if (self.count == 0) return self; + + return [self subarrayWithRange:NSMakeRange(1, self.count - 1)]; +} + +- (instancetype)mtl_arrayByRemovingLastObject { + if (self.count == 0) return self; + + return [self subarrayWithRange:NSMakeRange(0, self.count - 1)]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.h new file mode 100644 index 0000000..83254d3 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.h @@ -0,0 +1,25 @@ +// +// NSDictionary+MTLManipulationAdditions.h +// Mantle +// +// Created by Justin Spahr-Summers on 2012-09-24. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +@interface NSDictionary (MTLManipulationAdditions) + +// Merges the keys and values from the given dictionary into the receiver. If +// both the receiver and `dictionary` have a given key, the value from +// `dictionary` is used. +// +// Returns a new dictionary containing the entries of the receiver combined with +// those of `dictionary`. +- (NSDictionary *)mtl_dictionaryByAddingEntriesFromDictionary:(NSDictionary *)dictionary; + +// Creates a new dictionary with all the entries for the given keys removed from +// the receiver. +- (NSDictionary *)mtl_dictionaryByRemovingEntriesWithKeys:(NSSet *)keys; + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.m new file mode 100644 index 0000000..0ed5746 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSDictionary+MTLManipulationAdditions.m @@ -0,0 +1,25 @@ +// +// NSDictionary+MTLManipulationAdditions.m +// Mantle +// +// Created by Justin Spahr-Summers on 2012-09-24. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSDictionary+MTLManipulationAdditions.h" + +@implementation NSDictionary (MTLManipulationAdditions) + +- (NSDictionary *)mtl_dictionaryByAddingEntriesFromDictionary:(NSDictionary *)dictionary { + NSMutableDictionary *result = [self mutableCopy]; + [result addEntriesFromDictionary:dictionary]; + return result; +} + +- (NSDictionary *)mtl_dictionaryByRemovingEntriesWithKeys:(NSSet *)keys { + NSMutableDictionary *result = [self mutableCopy]; + [result removeObjectsForKeys:keys.allObjects]; + return result; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSError+MTLModelException.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSError+MTLModelException.h new file mode 100644 index 0000000..f7c1e9e --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSError+MTLModelException.h @@ -0,0 +1,23 @@ +// +// NSError+MTLModelException.h +// Mantle +// +// Created by Robert Böhnke on 7/6/13. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import + +@interface NSError (MTLModelException) + +// Creates a new error for an exception that occured during updating an +// MTLModel. +// +// exception - The exception that was thrown while updating the model. +// This argument must not be nil. +// +// Returns an error that takes its localized description and failure reason +// from the exception. ++ (instancetype)mtl_modelErrorWithException:(NSException *)exception; + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSError+MTLModelException.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSError+MTLModelException.m new file mode 100644 index 0000000..8b71e06 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSError+MTLModelException.m @@ -0,0 +1,36 @@ +// +// NSError+MTLModelException.m +// Mantle +// +// Created by Robert Böhnke on 7/6/13. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import "MTLModel.h" + +#import "NSError+MTLModelException.h" + +// The domain for errors originating from MTLModel. +static NSString * const MTLModelErrorDomain = @"MTLModelErrorDomain"; + +// An exception was thrown and caught. +static const NSInteger MTLModelErrorExceptionThrown = 1; + +// Associated with the NSException that was caught. +static NSString * const MTLModelThrownExceptionErrorKey = @"MTLModelThrownException"; + +@implementation NSError (MTLModelException) + ++ (instancetype)mtl_modelErrorWithException:(NSException *)exception { + NSParameterAssert(exception != nil); + + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: exception.description, + NSLocalizedFailureReasonErrorKey: exception.reason, + MTLModelThrownExceptionErrorKey: exception + }; + + return [NSError errorWithDomain:MTLModelErrorDomain code:MTLModelErrorExceptionThrown userInfo:userInfo]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSObject+MTLComparisonAdditions.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSObject+MTLComparisonAdditions.h new file mode 100644 index 0000000..4f7c03e --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSObject+MTLComparisonAdditions.h @@ -0,0 +1,15 @@ +// +// NSObject+MTLComparisonAdditions.h +// Mantle +// +// Created by Josh Vera on 10/26/12. +// Copyright (c) 2012 GitHub. All rights reserved. +// +// Portions copyright (c) 2011 Bitswift. All rights reserved. +// See the LICENSE file for more information. +// + +#import + +// Returns whether both objects are identical or equal via -isEqual: +BOOL MTLEqualObjects(id obj1, id obj2); diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSObject+MTLComparisonAdditions.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSObject+MTLComparisonAdditions.m new file mode 100644 index 0000000..3b77b35 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSObject+MTLComparisonAdditions.m @@ -0,0 +1,16 @@ +// +// NSObject+MTLComparisonAdditions.m +// Mantle +// +// Created by Josh Vera on 10/26/12. +// Copyright (c) 2012 GitHub. All rights reserved. +// +// Portions copyright (c) 2011 Bitswift. All rights reserved. +// See the LICENSE file for more information. +// + +#import "NSObject+MTLComparisonAdditions.h" + +BOOL MTLEqualObjects(id obj1, id obj2) { + return (obj1 == obj2 || [obj1 isEqual:obj2]); +} diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.h new file mode 100644 index 0000000..eefceec --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.h @@ -0,0 +1,21 @@ +// +// NSValueTransformer+MTLInversionAdditions.h +// Mantle +// +// Created by Justin Spahr-Summers on 2013-05-18. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import + +@interface NSValueTransformer (MTLInversionAdditions) + +// Flips the direction of the receiver's transformation, such that +// -transformedValue: will become -reverseTransformedValue:, and vice-versa. +// +// The receiver must allow reverse transformation. +// +// Returns an inverted transformer. +- (NSValueTransformer *)mtl_invertedTransformer; + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.m new file mode 100644 index 0000000..71fe4b0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLInversionAdditions.m @@ -0,0 +1,24 @@ +// +// NSValueTransformer+MTLInversionAdditions.m +// Mantle +// +// Created by Justin Spahr-Summers on 2013-05-18. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import "NSValueTransformer+MTLInversionAdditions.h" +#import "MTLValueTransformer.h" + +@implementation NSValueTransformer (MTLInversionAdditions) + +- (NSValueTransformer *)mtl_invertedTransformer { + NSParameterAssert(self.class.allowsReverseTransformation); + + return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(id value) { + return [self reverseTransformedValue:value]; + } reverseBlock:^(id value) { + return [self transformedValue:value]; + }]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h new file mode 100644 index 0000000..78a6b19 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h @@ -0,0 +1,84 @@ +// +// NSValueTransformer+MTLPredefinedTransformerAdditions.h +// Mantle +// +// Created by Justin Spahr-Summers on 2012-09-27. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +// The name for a value transformer that converts strings into URLs and back. +extern NSString * const MTLURLValueTransformerName; + +// Ensure an NSNumber is backed by __NSCFBoolean/CFBooleanRef +// +// NSJSONSerialization, and likely other serialization libraries, ordinarily +// serialize NSNumbers as numbers, and thus booleans would be serialized as +// 0/1. The exception is when the NSNumber is backed by __NSCFBoolean, which, +// though very much an implementation detail, is detected and serialized as a +// proper boolean. +extern NSString * const MTLBooleanValueTransformerName; + +@interface NSValueTransformer (MTLPredefinedTransformerAdditions) + +// Creates a reversible transformer to convert a JSON dictionary into a MTLModel +// object, and vice-versa. +// +// modelClass - The MTLModel subclass to attempt to parse from the JSON. This +// class must conform to . This argument must +// not be nil. +// +// Returns a reversible transformer which uses MTLJSONAdapter for transforming +// values back and forth. ++ (NSValueTransformer *)mtl_JSONDictionaryTransformerWithModelClass:(Class)modelClass; + +// Creates a reversible transformer to convert an array of JSON dictionaries +// into an array of MTLModel objects, and vice-versa. +// +// modelClass - The MTLModel subclass to attempt to parse from each JSON +// dictionary. This class must conform to . +// This argument must not be nil. +// +// Returns a reversible transformer which uses MTLJSONAdapter for transforming +// array elements back and forth. ++ (NSValueTransformer *)mtl_JSONArrayTransformerWithModelClass:(Class)modelClass; + +// A reversible value transformer to transform between the keys and objects of a +// dictionary. +// +// dictionary - The dictionary whose keys and values should be +// transformed between. This argument must not be nil. +// defaultValue - The result to fall back to, in case no key matching the +// input value was found during a forward transformation. +// reverseDefaultValue - The result to fall back to, in case no value matching +// the input value was found during a reverse +// transformation. +// +// Can for example be used for transforming between enum values and their string +// representation. +// +// NSValueTransformer *valueTransformer = [NSValueTransformer mtl_valueMappingTransformerWithDictionary:@{ +// @"foo": @(EnumDataTypeFoo), +// @"bar": @(EnumDataTypeBar), +// } defaultValue: @(EnumDataTypeUndefined) reverseDefaultValue: @"undefined"]; +// +// Returns a transformer that will map from keys to values in dictionary +// for forward transformation, and from values to keys for reverse +// transformations. If no matching key or value can be found, the respective +// default value is returned. ++ (NSValueTransformer *)mtl_valueMappingTransformerWithDictionary:(NSDictionary *)dictionary defaultValue:(id)defaultValue reverseDefaultValue:(id)reverseDefaultValue; + +// Returns a value transformer created by calling +// `+mtl_valueMappingTransformerWithDictionary:defaultValue:reverseDefaultValue:` +// with a default value of `nil` and a reverse default value of `nil`. ++ (NSValueTransformer *)mtl_valueMappingTransformerWithDictionary:(NSDictionary *)dictionary; + +@end + +@interface NSValueTransformer (UnavailableMTLPredefinedTransformerAdditions) + ++ (NSValueTransformer *)mtl_externalRepresentationTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONDictionaryTransformerWithModelClass:"))); ++ (NSValueTransformer *)mtl_externalRepresentationArrayTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONArrayTransformerWithModelClass:"))); + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.m new file mode 100644 index 0000000..10622a0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.m @@ -0,0 +1,141 @@ +// +// NSValueTransformer+MTLPredefinedTransformerAdditions.m +// Mantle +// +// Created by Justin Spahr-Summers on 2012-09-27. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSValueTransformer+MTLPredefinedTransformerAdditions.h" +#import "MTLJSONAdapter.h" +#import "MTLModel.h" +#import "MTLValueTransformer.h" + +NSString * const MTLURLValueTransformerName = @"MTLURLValueTransformerName"; +NSString * const MTLBooleanValueTransformerName = @"MTLBooleanValueTransformerName"; + +@implementation NSValueTransformer (MTLPredefinedTransformerAdditions) + +#pragma mark Category Loading + ++ (void)load { + @autoreleasepool { + MTLValueTransformer *URLValueTransformer = [MTLValueTransformer + reversibleTransformerWithForwardBlock:^ id (NSString *str) { + if (![str isKindOfClass:NSString.class]) return nil; + return [NSURL URLWithString:str]; + } + reverseBlock:^ id (NSURL *URL) { + if (![URL isKindOfClass:NSURL.class]) return nil; + return URL.absoluteString; + }]; + + [NSValueTransformer setValueTransformer:URLValueTransformer forName:MTLURLValueTransformerName]; + + MTLValueTransformer *booleanValueTransformer = [MTLValueTransformer + reversibleTransformerWithBlock:^ id (NSNumber *boolean) { + if (![boolean isKindOfClass:NSNumber.class]) return nil; + return (NSNumber *)(boolean.boolValue ? kCFBooleanTrue : kCFBooleanFalse); + }]; + + [NSValueTransformer setValueTransformer:booleanValueTransformer forName:MTLBooleanValueTransformerName]; + } +} + +#pragma mark Customizable Transformers + ++ (NSValueTransformer *)mtl_JSONDictionaryTransformerWithModelClass:(Class)modelClass { + NSParameterAssert([modelClass isSubclassOfClass:MTLModel.class]); + NSParameterAssert([modelClass conformsToProtocol:@protocol(MTLJSONSerializing)]); + + return [MTLValueTransformer + reversibleTransformerWithForwardBlock:^ id (id JSONDictionary) { + if (JSONDictionary == nil) return nil; + + NSAssert([JSONDictionary isKindOfClass:NSDictionary.class], @"Expected a dictionary, got: %@", JSONDictionary); + + return [MTLJSONAdapter modelOfClass:modelClass fromJSONDictionary:JSONDictionary error:NULL]; + } + reverseBlock:^ id (id model) { + if (model == nil) return nil; + + NSAssert([model isKindOfClass:MTLModel.class], @"Expected a MTLModel object, got %@", model); + NSAssert([model conformsToProtocol:@protocol(MTLJSONSerializing)], @"Expected a model object conforming to , got %@", model); + + return [MTLJSONAdapter JSONDictionaryFromModel:model]; + }]; +} + ++ (NSValueTransformer *)mtl_JSONArrayTransformerWithModelClass:(Class)modelClass { + NSValueTransformer *dictionaryTransformer = [self mtl_JSONDictionaryTransformerWithModelClass:modelClass]; + + return [MTLValueTransformer + reversibleTransformerWithForwardBlock:^ id (NSArray *dictionaries) { + if (dictionaries == nil) return nil; + + NSAssert([dictionaries isKindOfClass:NSArray.class], @"Expected an array of dictionaries, got: %@", dictionaries); + + NSMutableArray *models = [NSMutableArray arrayWithCapacity:dictionaries.count]; + for (id JSONDictionary in dictionaries) { + if (JSONDictionary == NSNull.null) { + [models addObject:NSNull.null]; + continue; + } + + NSAssert([JSONDictionary isKindOfClass:NSDictionary.class], @"Expected a dictionary or an NSNull, got: %@", JSONDictionary); + + id model = [dictionaryTransformer transformedValue:JSONDictionary]; + if (model == nil) continue; + + [models addObject:model]; + } + + return models; + } + reverseBlock:^ id (NSArray *models) { + if (models == nil) return nil; + + NSAssert([models isKindOfClass:NSArray.class], @"Expected an array of MTLModels, got: %@", models); + + NSMutableArray *dictionaries = [NSMutableArray arrayWithCapacity:models.count]; + for (id model in models) { + if (model == NSNull.null) { + [dictionaries addObject:NSNull.null]; + continue; + } + + NSAssert([model isKindOfClass:MTLModel.class], @"Expected an MTLModel or an NSNull, got: %@", model); + + NSDictionary *dict = [dictionaryTransformer reverseTransformedValue:model]; + if (dict == nil) continue; + + [dictionaries addObject:dict]; + } + + return dictionaries; + }]; +} + ++ (NSValueTransformer *)mtl_valueMappingTransformerWithDictionary:(NSDictionary *)dictionary { + return [self mtl_valueMappingTransformerWithDictionary:dictionary defaultValue:nil reverseDefaultValue:nil]; +} + ++ (NSValueTransformer *)mtl_valueMappingTransformerWithDictionary:(NSDictionary *)dictionary defaultValue:(id)defaultValue reverseDefaultValue:(id)reverseDefaultValue { + NSParameterAssert(dictionary != nil); + NSParameterAssert(dictionary.count == [[NSSet setWithArray:dictionary.allValues] count]); + + return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(id key) { + return dictionary[key ?: NSNull.null] ?: defaultValue; + } reverseBlock:^(id object) { + __block id result = nil; + [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id anObject, BOOL *stop) { + if ([object isEqual:anObject]) { + result = key; + *stop = YES; + } + }]; + return result ?: reverseDefaultValue; + }]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTKeyPathCoding.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTKeyPathCoding.h new file mode 100644 index 0000000..f34dc4a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTKeyPathCoding.h @@ -0,0 +1,68 @@ +// +// EXTKeyPathCoding.h +// extobjc +// +// Created by Justin Spahr-Summers on 19.06.12. +// Copyright (C) 2012 Justin Spahr-Summers. +// Released under the MIT license. +// + +#import +#import "metamacros.h" + +/** + * \@keypath allows compile-time verification of key paths. Given a real object + * receiver and key path: + * + * @code + +NSString *UTF8StringPath = @keypath(str.lowercaseString.UTF8String); +// => @"lowercaseString.UTF8String" + +NSString *versionPath = @keypath(NSObject, version); +// => @"version" + +NSString *lowercaseStringPath = @keypath(NSString.new, lowercaseString); +// => @"lowercaseString" + + * @endcode + * + * ... the macro returns an \c NSString containing all but the first path + * component or argument (e.g., @"lowercaseString.UTF8String", @"version"). + * + * In addition to simply creating a key path, this macro ensures that the key + * path is valid at compile-time (causing a syntax error if not), and supports + * refactoring, such that changing the name of the property will also update any + * uses of \@keypath. + */ +#define keypath(...) \ + metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__))(keypath1(__VA_ARGS__))(keypath2(__VA_ARGS__)) + +#define keypath1(PATH) \ + (((void)(NO && ((void)PATH, NO)), strchr(# PATH, '.') + 1)) + +#define keypath2(OBJ, PATH) \ + (((void)(NO && ((void)OBJ.PATH, NO)), # PATH)) + +/** + * \@collectionKeypath allows compile-time verification of key paths across collections NSArray/NSSet etc. Given a real object + * receiver, collection object receiver and related keypaths: + * + * @code + + NSString *employessFirstNamePath = @collectionKeypath(department.employees, Employee.new, firstName) + // => @"employees.firstName" + + NSString *employessFirstNamePath = @collectionKeypath(Department.new, employees, Employee.new, firstName) + // => @"employees.firstName" + + * @endcode + * + */ +#define collectionKeypath(...) \ + metamacro_if_eq(3, metamacro_argcount(__VA_ARGS__))(collectionKeypath3(__VA_ARGS__))(collectionKeypath4(__VA_ARGS__)) + +#define collectionKeypath3(PATH, COLLECTION_OBJECT, COLLECTION_PATH) ([[NSString stringWithFormat:@"%s.%s",keypath(PATH), keypath(COLLECTION_OBJECT, COLLECTION_PATH)] UTF8String]) + +#define collectionKeypath4(OBJ, PATH, COLLECTION_OBJECT, COLLECTION_PATH) ([[NSString stringWithFormat:@"%s.%s",keypath(OBJ, PATH), keypath(COLLECTION_OBJECT, COLLECTION_PATH)] UTF8String]) + diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTRuntimeExtensions.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTRuntimeExtensions.h new file mode 100644 index 0000000..191d749 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTRuntimeExtensions.h @@ -0,0 +1,113 @@ +// +// EXTRuntimeExtensions.h +// extobjc +// +// Created by Justin Spahr-Summers on 2011-03-05. +// Copyright (C) 2012 Justin Spahr-Summers. +// Released under the MIT license. +// + +#import + +/** + * Describes the memory management policy of a property. + */ +typedef enum { + /** + * The value is assigned. + */ + mtl_propertyMemoryManagementPolicyAssign = 0, + + /** + * The value is retained. + */ + mtl_propertyMemoryManagementPolicyRetain, + + /** + * The value is copied. + */ + mtl_propertyMemoryManagementPolicyCopy +} mtl_propertyMemoryManagementPolicy; + +/** + * Describes the attributes and type information of a property. + */ +typedef struct { + /** + * Whether this property was declared with the \c readonly attribute. + */ + BOOL readonly; + + /** + * Whether this property was declared with the \c nonatomic attribute. + */ + BOOL nonatomic; + + /** + * Whether the property is a weak reference. + */ + BOOL weak; + + /** + * Whether the property is eligible for garbage collection. + */ + BOOL canBeCollected; + + /** + * Whether this property is defined with \c \@dynamic. + */ + BOOL dynamic; + + /** + * The memory management policy for this property. This will always be + * #mtl_propertyMemoryManagementPolicyAssign if #readonly is \c YES. + */ + mtl_propertyMemoryManagementPolicy memoryManagementPolicy; + + /** + * The selector for the getter of this property. This will reflect any + * custom \c getter= attribute provided in the property declaration, or the + * inferred getter name otherwise. + */ + SEL getter; + + /** + * The selector for the setter of this property. This will reflect any + * custom \c setter= attribute provided in the property declaration, or the + * inferred setter name otherwise. + * + * @note If #readonly is \c YES, this value will represent what the setter + * \e would be, if the property were writable. + */ + SEL setter; + + /** + * The backing instance variable for this property, or \c NULL if \c + * \c @synthesize was not used, and therefore no instance variable exists. This + * would also be the case if the property is implemented dynamically. + */ + const char *ivar; + + /** + * If this property is defined as being an instance of a specific class, + * this will be the class object representing it. + * + * This will be \c nil if the property was defined as type \c id, if the + * property is not of an object type, or if the class could not be found at + * runtime. + */ + Class objectClass; + + /** + * The type encoding for the value of this property. This is the type as it + * would be returned by the \c \@encode() directive. + */ + char type[]; +} mtl_propertyAttributes; + +/** + * Returns a pointer to a structure containing information about \a property. + * You must \c free() the returned pointer. Returns \c NULL if there is an error + * obtaining information from \a property. + */ +mtl_propertyAttributes *mtl_copyPropertyAttributes (objc_property_t property); diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTRuntimeExtensions.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTRuntimeExtensions.m new file mode 100644 index 0000000..6a034b0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTRuntimeExtensions.m @@ -0,0 +1,211 @@ +// +// EXTRuntimeExtensions.m +// extobjc +// +// Created by Justin Spahr-Summers on 2011-03-05. +// Copyright (C) 2012 Justin Spahr-Summers. +// Released under the MIT license. +// + +#import "EXTRuntimeExtensions.h" + +#import + +mtl_propertyAttributes *mtl_copyPropertyAttributes (objc_property_t property) { + const char * const attrString = property_getAttributes(property); + if (!attrString) { + fprintf(stderr, "ERROR: Could not get attribute string from property %s\n", property_getName(property)); + return NULL; + } + + if (attrString[0] != 'T') { + fprintf(stderr, "ERROR: Expected attribute string \"%s\" for property %s to start with 'T'\n", attrString, property_getName(property)); + return NULL; + } + + const char *typeString = attrString + 1; + const char *next = NSGetSizeAndAlignment(typeString, NULL, NULL); + if (!next) { + fprintf(stderr, "ERROR: Could not read past type in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + return NULL; + } + + size_t typeLength = next - typeString; + if (!typeLength) { + fprintf(stderr, "ERROR: Invalid type in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + return NULL; + } + + // allocate enough space for the structure and the type string (plus a NUL) + mtl_propertyAttributes *attributes = calloc(1, sizeof(mtl_propertyAttributes) + typeLength + 1); + if (!attributes) { + fprintf(stderr, "ERROR: Could not allocate mtl_propertyAttributes structure for attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + return NULL; + } + + // copy the type string + strncpy(attributes->type, typeString, typeLength); + attributes->type[typeLength] = '\0'; + + // if this is an object type, and immediately followed by a quoted string... + if (typeString[0] == *(@encode(id)) && typeString[1] == '"') { + // we should be able to extract a class name + const char *className = typeString + 2; + next = strchr(className, '"'); + + if (!next) { + fprintf(stderr, "ERROR: Could not read class name in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + return NULL; + } + + if (className != next) { + size_t classNameLength = next - className; + char trimmedName[classNameLength + 1]; + + strncpy(trimmedName, className, classNameLength); + trimmedName[classNameLength] = '\0'; + + // attempt to look up the class in the runtime + attributes->objectClass = objc_getClass(trimmedName); + } + } + + if (*next != '\0') { + // skip past any junk before the first flag + next = strchr(next, ','); + } + + while (next && *next == ',') { + char flag = next[1]; + next += 2; + + switch (flag) { + case '\0': + break; + + case 'R': + attributes->readonly = YES; + break; + + case 'C': + attributes->memoryManagementPolicy = mtl_propertyMemoryManagementPolicyCopy; + break; + + case '&': + attributes->memoryManagementPolicy = mtl_propertyMemoryManagementPolicyRetain; + break; + + case 'N': + attributes->nonatomic = YES; + break; + + case 'G': + case 'S': + { + const char *nextFlag = strchr(next, ','); + SEL name = NULL; + + if (!nextFlag) { + // assume that the rest of the string is the selector + const char *selectorString = next; + next = ""; + + name = sel_registerName(selectorString); + } else { + size_t selectorLength = nextFlag - next; + if (!selectorLength) { + fprintf(stderr, "ERROR: Found zero length selector name in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + goto errorOut; + } + + char selectorString[selectorLength + 1]; + + strncpy(selectorString, next, selectorLength); + selectorString[selectorLength] = '\0'; + + name = sel_registerName(selectorString); + next = nextFlag; + } + + if (flag == 'G') + attributes->getter = name; + else + attributes->setter = name; + } + + break; + + case 'D': + attributes->dynamic = YES; + attributes->ivar = NULL; + break; + + case 'V': + // assume that the rest of the string (if present) is the ivar name + if (*next == '\0') { + // if there's nothing there, let's assume this is dynamic + attributes->ivar = NULL; + } else { + attributes->ivar = next; + next = ""; + } + + break; + + case 'W': + attributes->weak = YES; + break; + + case 'P': + attributes->canBeCollected = YES; + break; + + case 't': + fprintf(stderr, "ERROR: Old-style type encoding is unsupported in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + + // skip over this type encoding + while (*next != ',' && *next != '\0') + ++next; + + break; + + default: + fprintf(stderr, "ERROR: Unrecognized attribute string flag '%c' in attribute string \"%s\" for property %s\n", flag, attrString, property_getName(property)); + } + } + + if (next && *next != '\0') { + fprintf(stderr, "Warning: Unparsed data \"%s\" in attribute string \"%s\" for property %s\n", next, attrString, property_getName(property)); + } + + if (!attributes->getter) { + // use the property name as the getter by default + attributes->getter = sel_registerName(property_getName(property)); + } + + if (!attributes->setter) { + const char *propertyName = property_getName(property); + size_t propertyNameLength = strlen(propertyName); + + // we want to transform the name to setProperty: style + size_t setterLength = propertyNameLength + 4; + + char setterName[setterLength + 1]; + strncpy(setterName, "set", 3); + strncpy(setterName + 3, propertyName, propertyNameLength); + + // capitalize property name for the setter + setterName[3] = (char)toupper(setterName[3]); + + setterName[setterLength - 1] = ':'; + setterName[setterLength] = '\0'; + + attributes->setter = sel_registerName(setterName); + } + + return attributes; + +errorOut: + free(attributes); + return NULL; +} diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTScope.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTScope.h new file mode 100644 index 0000000..7548b81 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTScope.h @@ -0,0 +1,99 @@ +// +// EXTScope.h +// extobjc +// +// Created by Justin Spahr-Summers on 2011-05-04. +// Copyright (C) 2012 Justin Spahr-Summers. +// Released under the MIT license. +// + +#import "metamacros.h" + +/** + * \@onExit defines some code to be executed when the current scope exits. The + * code must be enclosed in braces and terminated with a semicolon, and will be + * executed regardless of how the scope is exited, including from exceptions, + * \c goto, \c return, \c break, and \c continue. + * + * Provided code will go into a block to be executed later. Keep this in mind as + * it pertains to memory management, restrictions on assignment, etc. Because + * the code is used within a block, \c return is a legal (though perhaps + * confusing) way to exit the cleanup block early. + * + * Multiple \@onExit statements in the same scope are executed in reverse + * lexical order. This helps when pairing resource acquisition with \@onExit + * statements, as it guarantees teardown in the opposite order of acquisition. + * + * @note This statement cannot be used within scopes defined without braces + * (like a one line \c if). In practice, this is not an issue, since \@onExit is + * a useless construct in such a case anyways. + */ +#define onExit \ + try {} @finally {} \ + __strong mtl_cleanupBlock_t metamacro_concat(mtl_exitBlock_, __LINE__) __attribute__((cleanup(mtl_executeCleanupBlock), unused)) = ^ + +/** + * Creates \c __weak shadow variables for each of the variables provided as + * arguments, which can later be made strong again with #strongify. + * + * This is typically used to weakly reference variables in a block, but then + * ensure that the variables stay alive during the actual execution of the block + * (if they were live upon entry). + * + * See #strongify for an example of usage. + */ +#define weakify(...) \ + try {} @finally {} \ + metamacro_foreach_cxt(mtl_weakify_,, __weak, __VA_ARGS__) + +/** + * Like #weakify, but uses \c __unsafe_unretained instead, for targets or + * classes that do not support weak references. + */ +#define unsafeify(...) \ + try {} @finally {} \ + metamacro_foreach_cxt(mtl_weakify_,, __unsafe_unretained, __VA_ARGS__) + +/** + * Strongly references each of the variables provided as arguments, which must + * have previously been passed to #weakify. + * + * The strong references created will shadow the original variable names, such + * that the original names can be used without issue (and a significantly + * reduced risk of retain cycles) in the current scope. + * + * @code + + id foo = [[NSObject alloc] init]; + id bar = [[NSObject alloc] init]; + + @weakify(foo, bar); + + // this block will not keep 'foo' or 'bar' alive + BOOL (^matchesFooOrBar)(id) = ^ BOOL (id obj){ + // but now, upon entry, 'foo' and 'bar' will stay alive until the block has + // finished executing + @strongify(foo, bar); + + return [foo isEqual:obj] || [bar isEqual:obj]; + }; + + * @endcode + */ +#define strongify(...) \ + try {} @finally {} \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wshadow\"") \ + metamacro_foreach(mtl_strongify_,, __VA_ARGS__) \ + _Pragma("clang diagnostic pop") + +/*** implementation details follow ***/ +typedef void (^mtl_cleanupBlock_t)(); + +void mtl_executeCleanupBlock (__strong mtl_cleanupBlock_t *block); + +#define mtl_weakify_(INDEX, CONTEXT, VAR) \ + CONTEXT __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR); + +#define mtl_strongify_(INDEX, VAR) \ + __strong __typeof__(VAR) VAR = metamacro_concat(VAR, _weak_); diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTScope.m b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTScope.m new file mode 100644 index 0000000..b34c1c6 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/EXTScope.m @@ -0,0 +1,15 @@ +// +// EXTScope.m +// extobjc +// +// Created by Justin Spahr-Summers on 2011-05-04. +// Copyright (C) 2012 Justin Spahr-Summers. +// Released under the MIT license. +// + +#import "EXTScope.h" + +void mtl_executeCleanupBlock (__strong mtl_cleanupBlock_t *block) { + (*block)(); +} + diff --git a/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/metamacros.h b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/metamacros.h new file mode 100644 index 0000000..77a77b5 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/Mantle/extobjc/metamacros.h @@ -0,0 +1,666 @@ +/** + * Macros for metaprogramming + * ExtendedC + * + * Copyright (C) 2012 Justin Spahr-Summers + * Released under the MIT license + */ + +#ifndef EXTC_METAMACROS_H +#define EXTC_METAMACROS_H + +/** + * Executes one or more expressions (which may have a void type, such as a call + * to a function that returns no value) and always returns true. + */ +#define metamacro_exprify(...) \ + ((__VA_ARGS__), true) + +/** + * Returns a string representation of VALUE after full macro expansion. + */ +#define metamacro_stringify(VALUE) \ + metamacro_stringify_(VALUE) + +/** + * Returns A and B concatenated after full macro expansion. + */ +#define metamacro_concat(A, B) \ + metamacro_concat_(A, B) + +/** + * Returns the Nth variadic argument (starting from zero). At least + * N + 1 variadic arguments must be given. N must be between zero and twenty, + * inclusive. + */ +#define metamacro_at(N, ...) \ + metamacro_concat(metamacro_at, N)(__VA_ARGS__) + +/** + * Returns the number of arguments (up to twenty) provided to the macro. At + * least one argument must be provided. + * + * Inspired by P99: http://p99.gforge.inria.fr + */ +#define metamacro_argcount(...) \ + metamacro_at(20, __VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) + +/** + * Identical to #metamacro_foreach_cxt, except that no CONTEXT argument is + * given. Only the index and current argument will thus be passed to MACRO. + */ +#define metamacro_foreach(MACRO, SEP, ...) \ + metamacro_foreach_cxt(metamacro_foreach_iter, SEP, MACRO, __VA_ARGS__) + +/** + * For each consecutive variadic argument (up to twenty), MACRO is passed the + * zero-based index of the current argument, CONTEXT, and then the argument + * itself. The results of adjoining invocations of MACRO are then separated by + * SEP. + * + * Inspired by P99: http://p99.gforge.inria.fr + */ +#define metamacro_foreach_cxt(MACRO, SEP, CONTEXT, ...) \ + metamacro_concat(metamacro_foreach_cxt, metamacro_argcount(__VA_ARGS__))(MACRO, SEP, CONTEXT, __VA_ARGS__) + +/** + * Identical to #metamacro_foreach_cxt. This can be used when the former would + * fail due to recursive macro expansion. + */ +#define metamacro_foreach_cxt_recursive(MACRO, SEP, CONTEXT, ...) \ + metamacro_concat(metamacro_foreach_cxt_recursive, metamacro_argcount(__VA_ARGS__))(MACRO, SEP, CONTEXT, __VA_ARGS__) + +/** + * In consecutive order, appends each variadic argument (up to twenty) onto + * BASE. The resulting concatenations are then separated by SEP. + * + * This is primarily useful to manipulate a list of macro invocations into instead + * invoking a different, possibly related macro. + */ +#define metamacro_foreach_concat(BASE, SEP, ...) \ + metamacro_foreach_cxt(metamacro_foreach_concat_iter, SEP, BASE, __VA_ARGS__) + +/** + * Iterates COUNT times, each time invoking MACRO with the current index + * (starting at zero) and CONTEXT. The results of adjoining invocations of MACRO + * are then separated by SEP. + * + * COUNT must be an integer between zero and twenty, inclusive. + */ +#define metamacro_for_cxt(COUNT, MACRO, SEP, CONTEXT) \ + metamacro_concat(metamacro_for_cxt, COUNT)(MACRO, SEP, CONTEXT) + +/** + * Returns the first argument given. At least one argument must be provided. + * + * This is useful when implementing a variadic macro, where you may have only + * one variadic argument, but no way to retrieve it (for example, because \c ... + * always needs to match at least one argument). + * + * @code + +#define varmacro(...) \ + metamacro_head(__VA_ARGS__) + + * @endcode + */ +#define metamacro_head(...) \ + metamacro_head_(__VA_ARGS__, 0) + +/** + * Returns every argument except the first. At least two arguments must be + * provided. + */ +#define metamacro_tail(...) \ + metamacro_tail_(__VA_ARGS__) + +/** + * Returns the first N (up to twenty) variadic arguments as a new argument list. + * At least N variadic arguments must be provided. + */ +#define metamacro_take(N, ...) \ + metamacro_concat(metamacro_take, N)(__VA_ARGS__) + +/** + * Removes the first N (up to twenty) variadic arguments from the given argument + * list. At least N variadic arguments must be provided. + */ +#define metamacro_drop(N, ...) \ + metamacro_concat(metamacro_drop, N)(__VA_ARGS__) + +/** + * Decrements VAL, which must be a number between zero and twenty, inclusive. + * + * This is primarily useful when dealing with indexes and counts in + * metaprogramming. + */ +#define metamacro_dec(VAL) \ + metamacro_at(VAL, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19) + +/** + * Increments VAL, which must be a number between zero and twenty, inclusive. + * + * This is primarily useful when dealing with indexes and counts in + * metaprogramming. + */ +#define metamacro_inc(VAL) \ + metamacro_at(VAL, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21) + +/** + * If A is equal to B, the next argument list is expanded; otherwise, the + * argument list after that is expanded. A and B must be numbers between zero + * and twenty, inclusive. Additionally, B must be greater than or equal to A. + * + * @code + +// expands to true +metamacro_if_eq(0, 0)(true)(false) + +// expands to false +metamacro_if_eq(0, 1)(true)(false) + + * @endcode + * + * This is primarily useful when dealing with indexes and counts in + * metaprogramming. + */ +#define metamacro_if_eq(A, B) \ + metamacro_concat(metamacro_if_eq, A)(B) + +/** + * Identical to #metamacro_if_eq. This can be used when the former would fail + * due to recursive macro expansion. + */ +#define metamacro_if_eq_recursive(A, B) \ + metamacro_concat(metamacro_if_eq_recursive, A)(B) + +/** + * Returns 1 if N is an even number, or 0 otherwise. N must be between zero and + * twenty, inclusive. + * + * For the purposes of this test, zero is considered even. + */ +#define metamacro_is_even(N) \ + metamacro_at(N, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1) + +/** + * Returns the logical NOT of B, which must be the number zero or one. + */ +#define metamacro_not(B) \ + metamacro_at(B, 1, 0) + +// IMPLEMENTATION DETAILS FOLLOW! +// Do not write code that depends on anything below this line. +#define metamacro_stringify_(VALUE) # VALUE +#define metamacro_concat_(A, B) A ## B +#define metamacro_foreach_iter(INDEX, MACRO, ARG) MACRO(INDEX, ARG) +#define metamacro_head_(FIRST, ...) FIRST +#define metamacro_tail_(FIRST, ...) __VA_ARGS__ +#define metamacro_consume_(...) +#define metamacro_expand_(...) __VA_ARGS__ + +// implemented from scratch so that metamacro_concat() doesn't end up nesting +#define metamacro_foreach_concat_iter(INDEX, BASE, ARG) metamacro_foreach_concat_iter_(BASE, ARG) +#define metamacro_foreach_concat_iter_(BASE, ARG) BASE ## ARG + +// metamacro_at expansions +#define metamacro_at0(...) metamacro_head(__VA_ARGS__) +#define metamacro_at1(_0, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at2(_0, _1, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at3(_0, _1, _2, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at4(_0, _1, _2, _3, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at5(_0, _1, _2, _3, _4, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at6(_0, _1, _2, _3, _4, _5, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at7(_0, _1, _2, _3, _4, _5, _6, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at8(_0, _1, _2, _3, _4, _5, _6, _7, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at9(_0, _1, _2, _3, _4, _5, _6, _7, _8, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at10(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at11(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at12(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at13(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at14(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at15(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at17(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at18(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at19(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at20(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, ...) metamacro_head(__VA_ARGS__) + +// metamacro_foreach_cxt expansions +#define metamacro_foreach_cxt0(MACRO, SEP, CONTEXT) +#define metamacro_foreach_cxt1(MACRO, SEP, CONTEXT, _0) MACRO(0, CONTEXT, _0) + +#define metamacro_foreach_cxt2(MACRO, SEP, CONTEXT, _0, _1) \ + metamacro_foreach_cxt1(MACRO, SEP, CONTEXT, _0) \ + SEP \ + MACRO(1, CONTEXT, _1) + +#define metamacro_foreach_cxt3(MACRO, SEP, CONTEXT, _0, _1, _2) \ + metamacro_foreach_cxt2(MACRO, SEP, CONTEXT, _0, _1) \ + SEP \ + MACRO(2, CONTEXT, _2) + +#define metamacro_foreach_cxt4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ + metamacro_foreach_cxt3(MACRO, SEP, CONTEXT, _0, _1, _2) \ + SEP \ + MACRO(3, CONTEXT, _3) + +#define metamacro_foreach_cxt5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ + metamacro_foreach_cxt4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ + SEP \ + MACRO(4, CONTEXT, _4) + +#define metamacro_foreach_cxt6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ + metamacro_foreach_cxt5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ + SEP \ + MACRO(5, CONTEXT, _5) + +#define metamacro_foreach_cxt7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ + metamacro_foreach_cxt6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ + SEP \ + MACRO(6, CONTEXT, _6) + +#define metamacro_foreach_cxt8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ + metamacro_foreach_cxt7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ + SEP \ + MACRO(7, CONTEXT, _7) + +#define metamacro_foreach_cxt9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ + metamacro_foreach_cxt8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ + SEP \ + MACRO(8, CONTEXT, _8) + +#define metamacro_foreach_cxt10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ + metamacro_foreach_cxt9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ + SEP \ + MACRO(9, CONTEXT, _9) + +#define metamacro_foreach_cxt11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ + metamacro_foreach_cxt10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ + SEP \ + MACRO(10, CONTEXT, _10) + +#define metamacro_foreach_cxt12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ + metamacro_foreach_cxt11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ + SEP \ + MACRO(11, CONTEXT, _11) + +#define metamacro_foreach_cxt13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ + metamacro_foreach_cxt12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ + SEP \ + MACRO(12, CONTEXT, _12) + +#define metamacro_foreach_cxt14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ + metamacro_foreach_cxt13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ + SEP \ + MACRO(13, CONTEXT, _13) + +#define metamacro_foreach_cxt15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ + metamacro_foreach_cxt14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ + SEP \ + MACRO(14, CONTEXT, _14) + +#define metamacro_foreach_cxt16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ + metamacro_foreach_cxt15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ + SEP \ + MACRO(15, CONTEXT, _15) + +#define metamacro_foreach_cxt17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + metamacro_foreach_cxt16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ + SEP \ + MACRO(16, CONTEXT, _16) + +#define metamacro_foreach_cxt18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ + metamacro_foreach_cxt17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + SEP \ + MACRO(17, CONTEXT, _17) + +#define metamacro_foreach_cxt19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ + metamacro_foreach_cxt18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ + SEP \ + MACRO(18, CONTEXT, _18) + +#define metamacro_foreach_cxt20(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \ + metamacro_foreach_cxt19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ + SEP \ + MACRO(19, CONTEXT, _19) + +// metamacro_foreach_cxt_recursive expansions +#define metamacro_foreach_cxt_recursive0(MACRO, SEP, CONTEXT) +#define metamacro_foreach_cxt_recursive1(MACRO, SEP, CONTEXT, _0) MACRO(0, CONTEXT, _0) + +#define metamacro_foreach_cxt_recursive2(MACRO, SEP, CONTEXT, _0, _1) \ + metamacro_foreach_cxt_recursive1(MACRO, SEP, CONTEXT, _0) \ + SEP \ + MACRO(1, CONTEXT, _1) + +#define metamacro_foreach_cxt_recursive3(MACRO, SEP, CONTEXT, _0, _1, _2) \ + metamacro_foreach_cxt_recursive2(MACRO, SEP, CONTEXT, _0, _1) \ + SEP \ + MACRO(2, CONTEXT, _2) + +#define metamacro_foreach_cxt_recursive4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ + metamacro_foreach_cxt_recursive3(MACRO, SEP, CONTEXT, _0, _1, _2) \ + SEP \ + MACRO(3, CONTEXT, _3) + +#define metamacro_foreach_cxt_recursive5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ + metamacro_foreach_cxt_recursive4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ + SEP \ + MACRO(4, CONTEXT, _4) + +#define metamacro_foreach_cxt_recursive6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ + metamacro_foreach_cxt_recursive5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ + SEP \ + MACRO(5, CONTEXT, _5) + +#define metamacro_foreach_cxt_recursive7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ + metamacro_foreach_cxt_recursive6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ + SEP \ + MACRO(6, CONTEXT, _6) + +#define metamacro_foreach_cxt_recursive8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ + metamacro_foreach_cxt_recursive7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ + SEP \ + MACRO(7, CONTEXT, _7) + +#define metamacro_foreach_cxt_recursive9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ + metamacro_foreach_cxt_recursive8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ + SEP \ + MACRO(8, CONTEXT, _8) + +#define metamacro_foreach_cxt_recursive10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ + metamacro_foreach_cxt_recursive9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ + SEP \ + MACRO(9, CONTEXT, _9) + +#define metamacro_foreach_cxt_recursive11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ + metamacro_foreach_cxt_recursive10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ + SEP \ + MACRO(10, CONTEXT, _10) + +#define metamacro_foreach_cxt_recursive12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ + metamacro_foreach_cxt_recursive11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ + SEP \ + MACRO(11, CONTEXT, _11) + +#define metamacro_foreach_cxt_recursive13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ + metamacro_foreach_cxt_recursive12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ + SEP \ + MACRO(12, CONTEXT, _12) + +#define metamacro_foreach_cxt_recursive14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ + metamacro_foreach_cxt_recursive13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ + SEP \ + MACRO(13, CONTEXT, _13) + +#define metamacro_foreach_cxt_recursive15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ + metamacro_foreach_cxt_recursive14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ + SEP \ + MACRO(14, CONTEXT, _14) + +#define metamacro_foreach_cxt_recursive16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ + metamacro_foreach_cxt_recursive15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ + SEP \ + MACRO(15, CONTEXT, _15) + +#define metamacro_foreach_cxt_recursive17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + metamacro_foreach_cxt_recursive16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ + SEP \ + MACRO(16, CONTEXT, _16) + +#define metamacro_foreach_cxt_recursive18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ + metamacro_foreach_cxt_recursive17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + SEP \ + MACRO(17, CONTEXT, _17) + +#define metamacro_foreach_cxt_recursive19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ + metamacro_foreach_cxt_recursive18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ + SEP \ + MACRO(18, CONTEXT, _18) + +#define metamacro_foreach_cxt_recursive20(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \ + metamacro_foreach_cxt_recursive19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ + SEP \ + MACRO(19, CONTEXT, _19) + +// metamacro_for_cxt expansions +#define metamacro_for_cxt0(MACRO, SEP, CONTEXT) +#define metamacro_for_cxt1(MACRO, SEP, CONTEXT) MACRO(0, CONTEXT) + +#define metamacro_for_cxt2(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt1(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(1, CONTEXT) + +#define metamacro_for_cxt3(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt2(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(2, CONTEXT) + +#define metamacro_for_cxt4(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt3(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(3, CONTEXT) + +#define metamacro_for_cxt5(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt4(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(4, CONTEXT) + +#define metamacro_for_cxt6(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt5(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(5, CONTEXT) + +#define metamacro_for_cxt7(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt6(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(6, CONTEXT) + +#define metamacro_for_cxt8(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt7(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(7, CONTEXT) + +#define metamacro_for_cxt9(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt8(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(8, CONTEXT) + +#define metamacro_for_cxt10(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt9(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(9, CONTEXT) + +#define metamacro_for_cxt11(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt10(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(10, CONTEXT) + +#define metamacro_for_cxt12(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt11(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(11, CONTEXT) + +#define metamacro_for_cxt13(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt12(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(12, CONTEXT) + +#define metamacro_for_cxt14(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt13(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(13, CONTEXT) + +#define metamacro_for_cxt15(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt14(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(14, CONTEXT) + +#define metamacro_for_cxt16(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt15(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(15, CONTEXT) + +#define metamacro_for_cxt17(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt16(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(16, CONTEXT) + +#define metamacro_for_cxt18(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt17(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(17, CONTEXT) + +#define metamacro_for_cxt19(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt18(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(18, CONTEXT) + +#define metamacro_for_cxt20(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt19(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(19, CONTEXT) + +// metamacro_if_eq expansions +#define metamacro_if_eq0(VALUE) \ + metamacro_concat(metamacro_if_eq0_, VALUE) + +#define metamacro_if_eq0_0(...) __VA_ARGS__ metamacro_consume_ +#define metamacro_if_eq0_1(...) metamacro_expand_ +#define metamacro_if_eq0_2(...) metamacro_expand_ +#define metamacro_if_eq0_3(...) metamacro_expand_ +#define metamacro_if_eq0_4(...) metamacro_expand_ +#define metamacro_if_eq0_5(...) metamacro_expand_ +#define metamacro_if_eq0_6(...) metamacro_expand_ +#define metamacro_if_eq0_7(...) metamacro_expand_ +#define metamacro_if_eq0_8(...) metamacro_expand_ +#define metamacro_if_eq0_9(...) metamacro_expand_ +#define metamacro_if_eq0_10(...) metamacro_expand_ +#define metamacro_if_eq0_11(...) metamacro_expand_ +#define metamacro_if_eq0_12(...) metamacro_expand_ +#define metamacro_if_eq0_13(...) metamacro_expand_ +#define metamacro_if_eq0_14(...) metamacro_expand_ +#define metamacro_if_eq0_15(...) metamacro_expand_ +#define metamacro_if_eq0_16(...) metamacro_expand_ +#define metamacro_if_eq0_17(...) metamacro_expand_ +#define metamacro_if_eq0_18(...) metamacro_expand_ +#define metamacro_if_eq0_19(...) metamacro_expand_ +#define metamacro_if_eq0_20(...) metamacro_expand_ + +#define metamacro_if_eq1(VALUE) metamacro_if_eq0(metamacro_dec(VALUE)) +#define metamacro_if_eq2(VALUE) metamacro_if_eq1(metamacro_dec(VALUE)) +#define metamacro_if_eq3(VALUE) metamacro_if_eq2(metamacro_dec(VALUE)) +#define metamacro_if_eq4(VALUE) metamacro_if_eq3(metamacro_dec(VALUE)) +#define metamacro_if_eq5(VALUE) metamacro_if_eq4(metamacro_dec(VALUE)) +#define metamacro_if_eq6(VALUE) metamacro_if_eq5(metamacro_dec(VALUE)) +#define metamacro_if_eq7(VALUE) metamacro_if_eq6(metamacro_dec(VALUE)) +#define metamacro_if_eq8(VALUE) metamacro_if_eq7(metamacro_dec(VALUE)) +#define metamacro_if_eq9(VALUE) metamacro_if_eq8(metamacro_dec(VALUE)) +#define metamacro_if_eq10(VALUE) metamacro_if_eq9(metamacro_dec(VALUE)) +#define metamacro_if_eq11(VALUE) metamacro_if_eq10(metamacro_dec(VALUE)) +#define metamacro_if_eq12(VALUE) metamacro_if_eq11(metamacro_dec(VALUE)) +#define metamacro_if_eq13(VALUE) metamacro_if_eq12(metamacro_dec(VALUE)) +#define metamacro_if_eq14(VALUE) metamacro_if_eq13(metamacro_dec(VALUE)) +#define metamacro_if_eq15(VALUE) metamacro_if_eq14(metamacro_dec(VALUE)) +#define metamacro_if_eq16(VALUE) metamacro_if_eq15(metamacro_dec(VALUE)) +#define metamacro_if_eq17(VALUE) metamacro_if_eq16(metamacro_dec(VALUE)) +#define metamacro_if_eq18(VALUE) metamacro_if_eq17(metamacro_dec(VALUE)) +#define metamacro_if_eq19(VALUE) metamacro_if_eq18(metamacro_dec(VALUE)) +#define metamacro_if_eq20(VALUE) metamacro_if_eq19(metamacro_dec(VALUE)) + +// metamacro_if_eq_recursive expansions +#define metamacro_if_eq_recursive0(VALUE) \ + metamacro_concat(metamacro_if_eq_recursive0_, VALUE) + +#define metamacro_if_eq_recursive0_0(...) __VA_ARGS__ metamacro_consume_ +#define metamacro_if_eq_recursive0_1(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_2(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_3(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_4(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_5(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_6(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_7(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_8(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_9(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_10(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_11(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_12(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_13(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_14(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_15(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_16(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_17(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_18(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_19(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_20(...) metamacro_expand_ + +#define metamacro_if_eq_recursive1(VALUE) metamacro_if_eq_recursive0(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive2(VALUE) metamacro_if_eq_recursive1(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive3(VALUE) metamacro_if_eq_recursive2(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive4(VALUE) metamacro_if_eq_recursive3(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive5(VALUE) metamacro_if_eq_recursive4(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive6(VALUE) metamacro_if_eq_recursive5(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive7(VALUE) metamacro_if_eq_recursive6(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive8(VALUE) metamacro_if_eq_recursive7(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive9(VALUE) metamacro_if_eq_recursive8(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive10(VALUE) metamacro_if_eq_recursive9(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive11(VALUE) metamacro_if_eq_recursive10(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive12(VALUE) metamacro_if_eq_recursive11(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive13(VALUE) metamacro_if_eq_recursive12(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive14(VALUE) metamacro_if_eq_recursive13(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive15(VALUE) metamacro_if_eq_recursive14(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive16(VALUE) metamacro_if_eq_recursive15(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive17(VALUE) metamacro_if_eq_recursive16(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive18(VALUE) metamacro_if_eq_recursive17(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive19(VALUE) metamacro_if_eq_recursive18(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive20(VALUE) metamacro_if_eq_recursive19(metamacro_dec(VALUE)) + +// metamacro_take expansions +#define metamacro_take0(...) +#define metamacro_take1(...) metamacro_head(__VA_ARGS__) +#define metamacro_take2(...) metamacro_head(__VA_ARGS__), metamacro_take1(metamacro_tail(__VA_ARGS__)) +#define metamacro_take3(...) metamacro_head(__VA_ARGS__), metamacro_take2(metamacro_tail(__VA_ARGS__)) +#define metamacro_take4(...) metamacro_head(__VA_ARGS__), metamacro_take3(metamacro_tail(__VA_ARGS__)) +#define metamacro_take5(...) metamacro_head(__VA_ARGS__), metamacro_take4(metamacro_tail(__VA_ARGS__)) +#define metamacro_take6(...) metamacro_head(__VA_ARGS__), metamacro_take5(metamacro_tail(__VA_ARGS__)) +#define metamacro_take7(...) metamacro_head(__VA_ARGS__), metamacro_take6(metamacro_tail(__VA_ARGS__)) +#define metamacro_take8(...) metamacro_head(__VA_ARGS__), metamacro_take7(metamacro_tail(__VA_ARGS__)) +#define metamacro_take9(...) metamacro_head(__VA_ARGS__), metamacro_take8(metamacro_tail(__VA_ARGS__)) +#define metamacro_take10(...) metamacro_head(__VA_ARGS__), metamacro_take9(metamacro_tail(__VA_ARGS__)) +#define metamacro_take11(...) metamacro_head(__VA_ARGS__), metamacro_take10(metamacro_tail(__VA_ARGS__)) +#define metamacro_take12(...) metamacro_head(__VA_ARGS__), metamacro_take11(metamacro_tail(__VA_ARGS__)) +#define metamacro_take13(...) metamacro_head(__VA_ARGS__), metamacro_take12(metamacro_tail(__VA_ARGS__)) +#define metamacro_take14(...) metamacro_head(__VA_ARGS__), metamacro_take13(metamacro_tail(__VA_ARGS__)) +#define metamacro_take15(...) metamacro_head(__VA_ARGS__), metamacro_take14(metamacro_tail(__VA_ARGS__)) +#define metamacro_take16(...) metamacro_head(__VA_ARGS__), metamacro_take15(metamacro_tail(__VA_ARGS__)) +#define metamacro_take17(...) metamacro_head(__VA_ARGS__), metamacro_take16(metamacro_tail(__VA_ARGS__)) +#define metamacro_take18(...) metamacro_head(__VA_ARGS__), metamacro_take17(metamacro_tail(__VA_ARGS__)) +#define metamacro_take19(...) metamacro_head(__VA_ARGS__), metamacro_take18(metamacro_tail(__VA_ARGS__)) +#define metamacro_take20(...) metamacro_head(__VA_ARGS__), metamacro_take19(metamacro_tail(__VA_ARGS__)) + +// metamacro_drop expansions +#define metamacro_drop0(...) __VA_ARGS__ +#define metamacro_drop1(...) metamacro_tail(__VA_ARGS__) +#define metamacro_drop2(...) metamacro_drop1(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop3(...) metamacro_drop2(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop4(...) metamacro_drop3(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop5(...) metamacro_drop4(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop6(...) metamacro_drop5(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop7(...) metamacro_drop6(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop8(...) metamacro_drop7(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop9(...) metamacro_drop8(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop10(...) metamacro_drop9(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop11(...) metamacro_drop10(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop12(...) metamacro_drop11(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop13(...) metamacro_drop12(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop14(...) metamacro_drop13(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop15(...) metamacro_drop14(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop16(...) metamacro_drop15(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop17(...) metamacro_drop16(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop18(...) metamacro_drop17(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop19(...) metamacro_drop18(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop20(...) metamacro_drop19(metamacro_tail(__VA_ARGS__)) + +#endif diff --git a/iOSStudy/iOSStudy/Pods/Mantle/README.md b/iOSStudy/iOSStudy/Pods/Mantle/README.md new file mode 100644 index 0000000..b3bee10 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Mantle/README.md @@ -0,0 +1,507 @@ +# Mantle + +Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch +application. + +## The Typical Model Object + +What's wrong with the way model objects are usually written in Objective-C? + +Let's use the [GitHub API](http://developer.github.com) for demonstration. How +would one typically represent a [GitHub +issue](http://developer.github.com/v3/issues/#get-a-single-issue) in +Objective-C? + +```objc +typedef enum : NSUInteger { + GHIssueStateOpen, + GHIssueStateClosed +} GHIssueState; + +@interface GHIssue : NSObject + +@property (nonatomic, copy, readonly) NSURL *URL; +@property (nonatomic, copy, readonly) NSURL *HTMLURL; +@property (nonatomic, copy, readonly) NSNumber *number; +@property (nonatomic, assign, readonly) GHIssueState state; +@property (nonatomic, copy, readonly) NSString *reporterLogin; +@property (nonatomic, copy, readonly) NSDate *updatedAt; +@property (nonatomic, strong, readonly) GHUser *assignee; +@property (nonatomic, copy, readonly) NSDate *retrievedAt; + +@property (nonatomic, copy) NSString *title; +@property (nonatomic, copy) NSString *body; + +- (id)initWithDictionary:(NSDictionary *)dictionary; + +@end +``` + +```objc +@implementation GHIssue + ++ (NSDateFormatter *)dateFormatter { + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'Z'"; + return dateFormatter; +} + +- (id)initWithDictionary:(NSDictionary *)dictionary { + self = [self init]; + if (self == nil) return nil; + + _URL = [NSURL URLWithString:dictionary[@"url"]]; + _HTMLURL = [NSURL URLWithString:dictionary[@"html_url"]]; + _number = dictionary[@"number"]; + + if ([dictionary[@"state"] isEqualToString:@"open"]) { + _state = GHIssueStateOpen; + } else if ([dictionary[@"state"] isEqualToString:@"closed"]) { + _state = GHIssueStateClosed; + } + + _title = [dictionary[@"title"] copy]; + _retrievedAt = [NSDate date]; + _body = [dictionary[@"body"] copy]; + _reporterLogin = [dictionary[@"user"][@"login"] copy]; + _assignee = [[GHUser alloc] initWithDictionary:dictionary[@"assignee"]]; + + _updatedAt = [self.class.dateFormatter dateFromString:dictionary[@"updated_at"]]; + + return self; +} + +- (id)initWithCoder:(NSCoder *)coder { + self = [self init]; + if (self == nil) return nil; + + _URL = [coder decodeObjectForKey:@"URL"]; + _HTMLURL = [coder decodeObjectForKey:@"HTMLURL"]; + _number = [coder decodeObjectForKey:@"number"]; + _state = [coder decodeUnsignedIntegerForKey:@"state"]; + _title = [coder decodeObjectForKey:@"title"]; + _retrievedAt = [NSDate date]; + _body = [coder decodeObjectForKey:@"body"]; + _reporterLogin = [coder decodeObjectForKey:@"reporterLogin"]; + _assignee = [coder decodeObjectForKey:@"assignee"]; + _updatedAt = [coder decodeObjectForKey:@"updatedAt"]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + if (self.URL != nil) [coder encodeObject:self.URL forKey:@"URL"]; + if (self.HTMLURL != nil) [coder encodeObject:self.HTMLURL forKey:@"HTMLURL"]; + if (self.number != nil) [coder encodeObject:self.number forKey:@"number"]; + if (self.title != nil) [coder encodeObject:self.title forKey:@"title"]; + if (self.body != nil) [coder encodeObject:self.body forKey:@"body"]; + if (self.reporterLogin != nil) [coder encodeObject:self.reporterLogin forKey:@"reporterLogin"]; + if (self.assignee != nil) [coder encodeObject:self.assignee forKey:@"assignee"]; + if (self.updatedAt != nil) [coder encodeObject:self.updatedAt forKey:@"updatedAt"]; + + [coder encodeUnsignedInteger:self.state forKey:@"state"]; +} + +- (id)copyWithZone:(NSZone *)zone { + GHIssue *issue = [[self.class allocWithZone:zone] init]; + issue->_URL = self.URL; + issue->_HTMLURL = self.HTMLURL; + issue->_number = self.number; + issue->_state = self.state; + issue->_reporterLogin = self.reporterLogin; + issue->_assignee = self.assignee; + issue->_updatedAt = self.updatedAt; + + issue.title = self.title; + issue->_retrievedAt = [NSDate date]; + issue.body = self.body; + + return issue; +} + +- (NSUInteger)hash { + return self.number.hash; +} + +- (BOOL)isEqual:(GHIssue *)issue { + if (![issue isKindOfClass:GHIssue.class]) return NO; + + return [self.number isEqual:issue.number] && [self.title isEqual:issue.title] && [self.body isEqual:issue.body]; +} + +@end +``` + +Whew, that's a lot of boilerplate for something so simple! And, even then, there +are some problems that this example doesn't address: + + * There's no way to update a `GHIssue` with new data from the server. + * There's no way to turn a `GHIssue` _back_ into JSON. + * `GHIssueState` shouldn't be encoded as-is. If the enum changes in the future, + existing archives might break. + * If the interface of `GHIssue` changes down the road, existing archives might + break. + +## Why Not Use Core Data? + +Core Data solves certain problems very well. If you need to execute complex +queries across your data, handle a huge object graph with lots of relationships, +or support undo and redo, Core Data is an excellent fit. + +It does, however, come with a couple of pain points: + + * **There's still a lot of boilerplate.** Managed objects reduce some of the + boilerplate seen above, but Core Data has plenty of its own. Correctly + setting up a Core Data stack (with a persistent store and persistent store + coordinator) and executing fetches can take many lines of code. + * **It's hard to get right.** Even experienced developers can make mistakes + when using Core Data, and the framework is not forgiving. + +If you're just trying to access some JSON objects, Core Data can be a lot of +work for little gain. + +Nonetheless, if you're using or want to use Core Data in your app already, +Mantle can still be a convenient translation layer between the API and your +managed model objects. + +## MTLModel + +Enter +**[MTLModel](https://github.com/github/Mantle/blob/master/Mantle/MTLModel.h)**. +This is what `GHIssue` looks like inheriting from `MTLModel`: + +```objc +typedef enum : NSUInteger { + GHIssueStateOpen, + GHIssueStateClosed +} GHIssueState; + +@interface GHIssue : MTLModel + +@property (nonatomic, copy, readonly) NSURL *URL; +@property (nonatomic, copy, readonly) NSURL *HTMLURL; +@property (nonatomic, copy, readonly) NSNumber *number; +@property (nonatomic, assign, readonly) GHIssueState state; +@property (nonatomic, copy, readonly) NSString *reporterLogin; +@property (nonatomic, strong, readonly) GHUser *assignee; +@property (nonatomic, copy, readonly) NSDate *updatedAt; + +@property (nonatomic, copy) NSString *title; +@property (nonatomic, copy) NSString *body; + +@property (nonatomic, copy, readonly) NSDate *retrievedAt; + +@end +``` + +```objc +@implementation GHIssue + ++ (NSDateFormatter *)dateFormatter { + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'Z'"; + return dateFormatter; +} + ++ (NSDictionary *)JSONKeyPathsByPropertyKey { + return @{ + @"URL": @"url", + @"HTMLURL": @"html_url", + @"reporterLogin": @"user.login", + @"assignee": @"assignee", + @"updatedAt": @"updated_at" + }; +} + ++ (NSValueTransformer *)URLJSONTransformer { + return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName]; +} + ++ (NSValueTransformer *)HTMLURLJSONTransformer { + return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName]; +} + ++ (NSValueTransformer *)stateJSONTransformer { + return [NSValueTransformer mtl_valueMappingTransformerWithDictionary:@{ + @"open": @(GHIssueStateOpen), + @"closed": @(GHIssueStateClosed) + }]; +} + ++ (NSValueTransformer *)assigneeJSONTransformer { + return [NSValueTransformer mtl_JSONDictionaryTransformerWithModelClass:GHUser.class]; +} + ++ (NSValueTransformer *)updatedAtJSONTransformer { + return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *str) { + return [self.dateFormatter dateFromString:str]; + } reverseBlock:^(NSDate *date) { + return [self.dateFormatter stringFromDate:date]; + }]; +} + +- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error { + self = [super initWithDictionary:dictionaryValue error:error]; + if (self == nil) return nil; + + // Store a value that needs to be determined locally upon initialization. + _retrievedAt = [NSDate date]; + + return self; +} + +@end +``` + +Notably absent from this version are implementations of ``, +``, `-isEqual:`, and `-hash`. By inspecting the `@property` +declarations you have in your subclass, `MTLModel` can provide default +implementations for all these methods. + +The problems with the original example all happen to be fixed as well: + +> There's no way to update a `GHIssue` with new data from the server. + +`MTLModel` has an extensible `-mergeValuesForKeysFromModel:` method, which makes +it easy to specify how new model data should be integrated. + +> There's no way to turn a `GHIssue` _back_ into JSON. + +This is where reversible transformers really come in handy. `+[MTLJSONAdapter +JSONDictionaryFromModel:]` can transform any model object conforming to +`` back into a JSON dictionary. `+[MTLJSONAdapter +JSONArrayForModels:]` is the same but turns an array of model objects into an JSON array of dictionaries. + +> If the interface of `GHIssue` changes down the road, existing archives might break. + +`MTLModel` automatically saves the version of the model object that was used for +archival. When unarchiving, `-decodeValueForKey:withCoder:modelVersion:` will +be invoked if overridden, giving you a convenient hook to upgrade old data. + +## MTLJSONSerializing + +In order to serialize your model objects from or into JSON, you need to +implement `` in your `MTLModel` subclass. This allows you to +use `MTLJSONAdapter` to convert your model objects from JSON and back: + +```objc +NSError *error = nil; +XYUser *user = [MTLJSONAdapter modelOfClass:XYUser.class fromJSONDictionary:JSONDictionary error:&error]; +``` + +```objc +NSDictionary *JSONDictionary = [MTLJSONAdapter JSONDictionaryFromModel:user]; +``` + +### `+JSONKeyPathsByPropertyKey` + +The dictionary returned by this method specifies how your model object's +properties map to the keys in the JSON representation. Properties that map to +`NSNull` will not be present in the JSON representation, for example: + +```objc + +@interface XYUser : MTLModel + +@property (readonly, nonatomic, copy) NSString *name; +@property (readonly, nonatomic, strong) NSDate *createdAt; + +@property (readonly, nonatomic, assign, getter = isMeUser) BOOL meUser; +@property (readonly, nonatomic, strong) XYHelper *helper; + +@end + +@implementation XYUser + ++ (NSDictionary *)JSONKeyPathsByPropertyKey { + return @{ + @"createdAt": @"created_at", + @"meUser": NSNull.null + }; +} + +- (instancetype)initWithDictionary:(NSDictionary *)dictionaryValue error:(NSError **)error { + self = [super initWithDictionary:dictionaryValue error:error]; + if (self == nil) return nil; + + _helper = [XYHelper helperWithName:self.name createdAt:self.createdAt]; + + return self; +} + +@end +``` + +In this example, the `XYUser` class declares four properties that Mantle +handles in different ways: + +- `name` is implicitly mapped to a key of the same name in the JSON + representation. +- `createdAt` is converted to its snake case equivalent. +- `meUser` is not serialized into JSON. +- `helper` is initialized exactly once after JSON deserialization. + +Use `-[NSDictionary mtl_dictionaryByAddingEntriesFromDictionary:]` if your +model's superclass also implements `MTLJSONSerializing` to merge their mappings. + +When deserializing JSON using +`+[MTLJSONAdapter modelOfClass:fromJSONDictionary:error:]`, JSON keys that don't +correspond to a property name or have an explicit mapping are ignored: + +```objc +NSDictionary *JSONDictionary = @{ + @"name": @"john", + @"created_at": @"2013/07/02 16:40:00 +0000", + @"plan": @"lite" +}; + +XYUser *user = [MTLJSONAdapter modelOfClass:XYUser.class fromJSONDictionary:JSONDictionary error:&error]; +``` + +Here, the `plan` would be ignored since it neither matches a property name of +`XYUser` nor is it otherwise mapped in `+JSONKeyPathsByPropertyKey`. + +### `+JSONTransformerForKey:` + +Implement this optional method to convert a property from a different type when +deserializing from JSON. + +``` ++ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key { + if ([key isEqualToString:@"createdAt"]) { + return [NSValueTransformer valueTransformerForName:XYDateValueTransformerName]; + } + + return nil; +} +``` + +For added convenience, if you implement `+JSONTransformer`, +`MTLJSONAdapter` will use the result of that method instead. For example, dates +that are commonly represented as strings in JSON can be transformed to `NSDate`s +like so: + +```objc ++ (NSValueTransformer *)createdAtJSONTransformer { + return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *str) { + return [self.dateFormatter dateFromString:str]; + } reverseBlock:^(NSDate *date) { + return [self.dateFormatter stringFromDate:date]; + }]; +} +``` + +If the transformer is reversible, it will also be used when serializing the +object into JSON. + +### `+classForParsingJSONDictionary:` + +If you are implementing a class cluster, implement this optional method to +determine which subclass of your base class should be used when deserializing an +object from JSON. + +```objc +@interface XYMessage : MTLModel + +@end + +@interface XYTextMessage: XYMessage + +@property (readonly, nonatomic, copy) NSString *body; + +@end + +@interface XYPictureMessage : XYMessage + +@property (readonly, nonatomic, strong) NSURL *imageURL; + +@end + +@implementation XYMessage + ++ (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary { + if (JSONDictionary[@"image_url"] != nil) { + return XYPictureMessage.class; + } + + if (JSONDictionary[@"body"] != nil) { + return XYTextMessage.class; + } + + NSAssert(NO, @"No matching class for the JSON dictionary '%@'.", JSONDictionary); + return self; +} + +@end +``` + +`MTLJSONAdapter` will then pick the class based on the JSON dictionary you pass +in: + +```objc +NSDictionary *textMessage = @{ + @"id": @1, + @"body": @"Hello World!" +}; + +NSDictionary *pictureMessage = @{ + @"id": @2, + @"image_url": @"http://example.com/lolcat.gif" +}; + +XYTextMessage *messageA = [MTLJSONAdapter modelOfClass:XYMessage.class fromJSONDictionary:textMessage error:NULL]; + +XYPictureMessage *messageB = [MTLJSONAdapter modelOfClass:XYMessage.class fromJSONDictionary:pictureMessage error:NULL]; +``` + +## Persistence + +Mantle doesn't automatically persist your objects for you. However, `MTLModel` +does conform to ``, so model objects can be archived to disk using +`NSKeyedArchiver`. + +If you need something more powerful, or want to avoid keeping your whole model +in memory at once, Core Data may be a better choice. + +## System Requirements + +Mantle supports OS X 10.7+ and iOS 5.0+. + +## Importing Mantle + +To add Mantle to your application: + + 1. Add the Mantle repository as a submodule of your application's repository. + 1. Run `script/bootstrap` from within the Mantle folder. + 1. Drag and drop `Mantle.xcodeproj` into your application's Xcode project or + workspace. + 1. On the "Build Phases" tab of your application target, add Mantle to the + "Link Binary With Libraries" phase. + * **On iOS**, add `libMantle.a`. + * **On OS X**, add `Mantle.framework`. Mantle must also be added to any + "Copy Frameworks" build phase. If you don't already have one, simply add a + "Copy Files" build phase and target the "Frameworks" destination. + 1. Add `"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include" $(inherited)` + to the "Header Search Paths" build setting (this is only + necessary for archive builds, but it has no negative effect otherwise). + 1. **For iOS targets**, add `-ObjC` to the "Other Linker Flags" build setting. + 1. **If you added Mantle to a project (not a workspace)**, you will also need + to add the appropriate Mantle target to the "Target Dependencies" of your + application. + +If you would prefer to use [CocoaPods](http://cocoapods.org), there are some +[Mantle podspecs](https://github.com/CocoaPods/Specs/tree/master/Specs/Mantle) that +have been generously contributed by third parties. + +If you’re instead developing Mantle on its own, use the `Mantle.xcworkspace` file. + +## License + +Mantle is released under the MIT license. See +[LICENSE.md](https://github.com/github/Mantle/blob/master/LICENSE.md). + +## More Info + +Have a question? Please [open an issue](https://github.com/Mantle/Mantle/issues/new)! diff --git a/iOSStudy/iOSStudy/Pods/Pods.xcodeproj/project.pbxproj b/iOSStudy/iOSStudy/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d94c134 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,7325 @@ + + + + + archiveVersion + 1 + classes + + objectVersion + 46 + objects + + 00184188B977DFF23A1F85C5 + + buildConfigurations + + F6CDC7E60CF17930F7262034 + 72575C4414A386B75A1236C3 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 003A31C6AADD74836B88341F + + attributes + + LastUpgradeCheck + 0510 + + buildConfigurationList + EF1605A5BAD020789C0D6DCD + compatibilityVersion + Xcode 3.2 + developmentRegion + English + hasScannedForEncodings + 0 + isa + PBXProject + knownRegions + + en + + mainGroup + 29EBF6D132B45FA490AAE8C4 + productRefGroup + 7A9806F1FFB8C59E80CBFD08 + projectDirPath + + projectReferences + + projectRoot + + targets + + 41B60CD843C52B8457DCB0E0 + E0F50EA1905F2A7094812973 + F5AD41E8F4E3CBFFE9D0A6AD + D6558E03D7E8E7369D57D62A + EA053313AC9B201518E824AF + 7FFBF073B63F5E27B5D0072F + 6736EF81F571346B01E63AAB + 0D2F41CC755DC941A9D3282F + 0E44B521E203EC4F111815E4 + + + 00768924736E895D7D503478 + + buildConfigurations + + A25EAE9D801AB760A4747E4B + 8A72EC2E5ADEFD1185ACE525 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 015D98E4D31C2E29C4FB9DBA + + fileRef + B2DFB8ABE3C361564605FC09 + isa + PBXBuildFile + + 016D2ED5429A374F8D023442 + + fileRef + D405E1711A624A1719E082D2 + isa + PBXBuildFile + + 019033947122D26DFF88E20C + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerBack.png + path + SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack.png + sourceTree + <group> + + 02E92DC83C62401C25C8913C + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + NSError+MTLModelException.m + path + Mantle/NSError+MTLModelException.m + sourceTree + <group> + + 0371BF6A0BA2FCC5D93407F8 + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods-SDWebImage.a + sourceTree + BUILT_PRODUCTS_DIR + + 0398B69338481EC817F6F6EB + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods-FMDB.a + sourceTree + BUILT_PRODUCTS_DIR + + 03FA11483C1D0F3D8E20B008 + + fileRef + BDD54D59F9F168C7CDC3C286 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 04205120B87CE3914882E1E1 + + fileRef + F0D0B8FA1F237AF39207A58C + isa + PBXBuildFile + + 051EC94587D0A832E9D6DEBA + + isa + PBXTargetDependency + name + Pods-SVWebViewController + target + 0D2F41CC755DC941A9D3282F + targetProxy + CCD36D89B4623217A9BB4F11 + + 055CD4E1DAF33217D19B9141 + + fileRef + 52C22D274C762A81E9AEFD70 + isa + PBXBuildFile + + 057A36C64C16BAE9CBB65645 + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerActivityChrome@2x.png + path + SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome@2x.png + sourceTree + <group> + + 060110539E4022EC7547DC8A + + children + + E1AD240F7028E1A092DCBEDC + 7B237DEB99E4A1EC780BD565 + + isa + PBXGroup + name + Security + sourceTree + <group> + + 06B18C667B34A3836288B3E6 + + buildActionMask + 2147483647 + files + + D003F4EA52D0953E6AF73AF6 + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 06D77D3ADBE13269F32AE1CF + + buildActionMask + 2147483647 + files + + AB1DEC2C8FBB36DEECEF04E0 + 8CCB2EE71B1282861778906D + DD8F1007201AC5D9E168DE32 + ADC6D3BD671FB020D4E165E1 + 651297332C80103B10000DCA + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 071305CB59F3D8E013288619 + + children + + C50CBBB3320CBFC5FA8EA34D + 8A081DC2D78B0C22A3B1CDDE + 6D6492CFDFC03E3EEED90937 + 225B176F2E2BC5974E8C8001 + BB46AB577CB11E2DEC496B53 + 304E5532CC66B25020968ED2 + 90692384AE86654AF740CBA0 + A110D8DB17AB6647C7795EBD + 674480447F049BFA1C4EA514 + 4D56B1E3005FDE505FCEF6C6 + 98D565C31B4E1BA8DEC0CD71 + 778D223C43915891DECBE645 + D139BE864E7331A490A31F83 + 7A75EF39F7B6094E98E9D58F + 11E705D1FBE2231D8B3FA30B + 76D0502FC1D6208D9E893050 + BB9E6E4F4B05385705EB97C0 + + isa + PBXGroup + name + UIKit + sourceTree + <group> + + 0BC85B368F05F28D8AC1E014 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + EXTScope.h + path + Mantle/extobjc/EXTScope.h + sourceTree + <group> + + 0BD156919664C48A35EEDBFE + + fileRef + E7926F44F6DD7675C4CAB292 + isa + PBXBuildFile + + 0BD65AA041B8332119344140 + + fileRef + 0E03512149CABB1F580F757D + isa + PBXBuildFile + + 0C14F1A11A291CA30BCB976F + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + FMDB.h + path + src/fmdb/FMDB.h + sourceTree + <group> + + 0D2F41CC755DC941A9D3282F + + buildConfigurationList + 00768924736E895D7D503478 + buildPhases + + FAFFA27183B7E1544DC2D54D + 9165E3916BCF3741753508DC + 06D77D3ADBE13269F32AE1CF + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Pods-SVWebViewController + productName + Pods-SVWebViewController + productReference + 8BF1A56862208AAE73DA9531 + productType + com.apple.product-type.library.static + + 0DDB7686E187F3FC19D520AC + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods-Mantle.a + sourceTree + BUILT_PRODUCTS_DIR + + 0E03512149CABB1F580F757D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIScrollView+MJExtension.h + path + MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.h + sourceTree + <group> + + 0E0B9761485C54F60690139C + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFHTTPRequestOperationManager.h + path + AFNetworking/AFHTTPRequestOperationManager.h + sourceTree + <group> + + 0E0C3DD3CC95A1B05DA0ED85 + + fileRef + BB9E6E4F4B05385705EB97C0 + isa + PBXBuildFile + + 0E44B521E203EC4F111815E4 + + buildConfigurationList + 7571161F8493E257141282E2 + buildPhases + + 9AAAE1957C330405FAFB9600 + 8F935F9ED6A55A5476D707C4 + BDD171D88E04245FF41CFF78 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Pods-SWTableViewCell + productName + Pods-SWTableViewCell + productReference + 463D037C8D05265B93AA341F + productType + com.apple.product-type.library.static + + 0E941574580314BABC46EF00 + + buildActionMask + 2147483647 + files + + CC2EB1431A8BBB896B00A972 + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 0F22D9A04C4D256875AD1033 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIButton+WebCache.h + path + SDWebImage/UIButton+WebCache.h + sourceTree + <group> + + 10BE1219154FDDC59F7E91E8 + + fileRef + AC1C5B4CE91F11AE998D64F6 + isa + PBXBuildFile + + 10D51B68691D31108009BE93 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFHTTPRequestOperation.m + path + AFNetworking/AFHTTPRequestOperation.m + sourceTree + <group> + + 11292E3DE8EF40F9DCBCD526 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-MJRefresh-Private.xcconfig + sourceTree + <group> + + 11E705D1FBE2231D8B3FA30B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIRefreshControl+AFNetworking.m + path + UIKit+AFNetworking/UIRefreshControl+AFNetworking.m + sourceTree + <group> + + 12371F77B302ED20D4ABE615 + + children + + EB111D63CDEEB43E08195847 + + isa + PBXGroup + name + Resources + sourceTree + <group> + + 12896047E29D3DF31213A494 + + fileRef + EDA79BFF36ED8CC66472C4B4 + isa + PBXBuildFile + + 13A1A364A5506D8A8B3CB81E + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SVModalWebViewController.m + path + SVWebViewController/SVModalWebViewController.m + sourceTree + <group> + + 142C5427A774A7FFD4A9FD58 + + fileRef + 225B176F2E2BC5974E8C8001 + isa + PBXBuildFile + + 14C6C2B33E3B9C9DB8064CE3 + + fileRef + 9F77207596AAC05C2F57FD7F + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 15C57B0A0D754AA9967330DF + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + SystemConfiguration.framework + path + Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/SystemConfiguration.framework + sourceTree + DEVELOPER_DIR + + 160D3E2EB45E710B513005B2 + + fileRef + 18779A7BA8AAD008F51F3F9D + isa + PBXBuildFile + + 16BE2A454A10A0FFBBFDD201 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-AFNetworking-dummy.m + sourceTree + <group> + + 1817BF46EC0C042C7D3CF340 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MTLJSONAdapter.m + path + Mantle/MTLJSONAdapter.m + sourceTree + <group> + + 183B217DE3DE00FBD76C9DE5 + + isa + PBXTargetDependency + name + Pods-SDWebImage + target + 7FFBF073B63F5E27B5D0072F + targetProxy + 1A50A961A1670095B4C092C4 + + 18779A7BA8AAD008F51F3F9D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + FMResultSet.h + path + src/fmdb/FMResultSet.h + sourceTree + <group> + + 187C3AFF7CA47A0B29C75D89 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MJRefreshBaseView.h + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.h + sourceTree + <group> + + 1890A9018AFB550869401948 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SDWebImageDownloader.m + path + SDWebImage/SDWebImageDownloader.m + sourceTree + <group> + + 1A404CF9215FA5CE825E6AE2 + + fileRef + 0C14F1A11A291CA30BCB976F + isa + PBXBuildFile + + 1A50A961A1670095B4C092C4 + + containerPortal + 003A31C6AADD74836B88341F + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + 7FFBF073B63F5E27B5D0072F + remoteInfo + Pods-SDWebImage + + 1AF9F27A2984FABBCD8BB35F + + fileRef + 6A38B085018671A0ABB83BE1 + isa + PBXBuildFile + + 1B0ECD78A6C7584001AA72BE + + fileRef + 3FE2CB4E3BF724BF9DADD804 + isa + PBXBuildFile + + 1BF5129F506CB75B0F1BC5FB + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + wrapper.plug-in + name + SVWebViewController.bundle + path + SVWebViewController/SVWebViewController.bundle + sourceTree + <group> + + 1CD8DE0BC0E13E9F18B3F9A1 + + containerPortal + 003A31C6AADD74836B88341F + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + E0F50EA1905F2A7094812973 + remoteInfo + Pods-AFNetworking + + 1D5CA0F9B7FCF817B26A5DBE + + fileRef + 9449B700FD78B567CDCE349E + isa + PBXBuildFile + + 1D87621C8A8B06BD9D364D45 + + children + + 752BB0BB115A89E3F4860E7E + + isa + PBXGroup + name + Targets Support Files + sourceTree + <group> + + 1DBA1A3F18B0BCF7E976DA37 + + fileRef + D139BE864E7331A490A31F83 + isa + PBXBuildFile + + 1DFAEC12DD2639335AF49ACE + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + NSArray+MTLManipulationAdditions.m + path + Mantle/NSArray+MTLManipulationAdditions.m + sourceTree + <group> + + 1F5410B3AD75104BB163C869 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-dummy.m + sourceTree + <group> + + 2046088381816FB1A6115AE8 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFURLRequestSerialization.h + path + AFNetworking/AFURLRequestSerialization.h + sourceTree + <group> + + 2170FBC10D2E8E490ECD303D + + fileRef + DC50FB9ACAC3D68AE360BF5F + isa + PBXBuildFile + + 217FA4FB15D4EDE83A84233D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MJRefreshConst.h + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.h + sourceTree + <group> + + 21E3949570212F296A98F3C3 + + fileRef + 1F5410B3AD75104BB163C869 + isa + PBXBuildFile + + 221E3FF2B9CDB1D4F3615F0D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.plist.xml + path + Pods-acknowledgements.plist + sourceTree + <group> + + 222F9FE85B6C3B610407F404 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + FMResultSet.m + path + src/fmdb/FMResultSet.m + sourceTree + <group> + + 225B176F2E2BC5974E8C8001 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIActivityIndicatorView+AFNetworking.m + path + UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m + sourceTree + <group> + + 2366FECF46A2354EC3AC77D5 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + NSDictionary+MTLManipulationAdditions.h + path + Mantle/NSDictionary+MTLManipulationAdditions.h + sourceTree + <group> + + 2384225F66B601A470E03B2D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + NSMutableArray+SWUtilityButtons.h + path + SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.h + sourceTree + <group> + + 23A7B732974BAA16EF4D4F5A + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MTLModel+NSCoding.m + path + Mantle/MTLModel+NSCoding.m + sourceTree + <group> + + 24200E9BAE5616D614E3BA14 + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + YES + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES + COPY_PHASE_STRIP + YES + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + ONLY_ACTIVE_ARCH + YES + STRIP_INSTALLED_PRODUCT + NO + + isa + XCBuildConfiguration + name + Debug + + 245A7D5B09274802299A5413 + + fileRef + DC6959F6B0389433A846F09B + isa + PBXBuildFile + + 2480FD39925604EC68E2B1B1 + + children + + F7446765000306425A8653CB + 33DC1FE29B55A083427A2983 + 3AACA1031CB453DF0B0F1B62 + 9E99E930712393BD264CF051 + B2FE89B302D990CFC2393FFB + 4346B230A89B46E6BE901D9E + A3516881B3D6F981B73AC538 + 6C91BBFD0AEB7230111657C4 + + isa + PBXGroup + name + Pods + sourceTree + <group> + + 24ECE29E2A83329E77BC464B + + fileRef + 716C03D21AAED4A8DD5ED96E + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 24EDA1E60FA28D25D59006F1 + + fileRef + 6D0FE93D2F53E6F9BE778A43 + isa + PBXBuildFile + + 256F4A417937912F5BA0262B + + fileRef + 8DC0686ECBB745003C3651C3 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 2579348338E55E4DD3339342 + + children + + A9649B3D73F213DD8CAF3844 + E3C180F70C4829EC3E7C8741 + AD4009A3CA3371D1F8C780E5 + 7AF9843A5A131AAFDB93EA21 + + isa + PBXGroup + name + Support Files + path + ../Target Support Files/Pods-FMDB + sourceTree + <group> + + 25BC2970B45A7D905D5F19BB + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIScrollView+MJRefresh.m + path + MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.m + sourceTree + <group> + + 25CE073DBCD2584B257B39DA + + fileRef + D0C3135DA2BA3C019BAF2DCF + isa + PBXBuildFile + + 26D05A8A28DCD60C1CA8EC7E + + buildActionMask + 2147483647 + files + + 749D67B382740B441A6C9985 + 04205120B87CE3914882E1E1 + F5336FA18F2792224B01F5AD + DDCF5122548DF51242583A68 + F44EDFC44AEF1BC95DB7FA7D + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 273E8CC1B7A1DF52553B76D7 + + buildActionMask + 2147483647 + files + + A566AAD0BC4F7B6641A8C759 + FA2858642D021A2940D97851 + F3B157F0A7C5AE48DEF99006 + 9FA315080E627AB06418F4B4 + C2F2F561C27931B0CFA6A5AD + A0BC09B6CD44A3EC41327140 + 7C9788498CCBBD0718711B7D + 9F9C79DFE629562CA77CD2CA + 12896047E29D3DF31213A494 + 1D5CA0F9B7FCF817B26A5DBE + 6EE966C6726621AA9BA61694 + 142C5427A774A7FFD4A9FD58 + 47D9D21AF5FF6276C1230478 + BE940E795DD463ACED5B538C + 6DC5F2F2A80D898D1B9BA4E9 + 1DBA1A3F18B0BCF7E976DA37 + 79AE7927E2E34267BBB4EEFB + 0E0C3DD3CC95A1B05DA0ED85 + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 27A001025D8F6246D8E0D8D3 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFHTTPRequestOperation.h + path + AFNetworking/AFHTTPRequestOperation.h + sourceTree + <group> + + 27CC88179E549D8028BB3973 + + buildActionMask + 2147483647 + files + + 8C11E60C3F243002B20ABAF7 + A3E886CEC48C491886768370 + D6D6D28D37442BAAA468A18D + A3A92429628C08F12D3FC1CD + 24ECE29E2A83329E77BC464B + B5CE0321A8AEFC3F5FA0DF70 + 639C0E9A9E7ADF70C513571E + EDCDF1F1A409A8EF63058261 + 14C6C2B33E3B9C9DB8064CE3 + 895426A01E6E4514960D5307 + F38473E10FE10739CC22000B + 03FA11483C1D0F3D8E20B008 + 55A7772828B4EE4C2F35A0CD + 8D934380DB6CDDF6B1F43315 + 256F4A417937912F5BA0262B + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 282B0048A3E511971931B363 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFURLConnectionOperation.h + path + AFNetworking/AFURLConnectionOperation.h + sourceTree + <group> + + 283AD6CF440DCA9B38B0B53C + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MTLModel.m + path + Mantle/MTLModel.m + sourceTree + <group> + + 290221507373808ABAA4054B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFHTTPSessionManager.m + path + AFNetworking/AFHTTPSessionManager.m + sourceTree + <group> + + 292F5F1319A89AE506A962C2 + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + CoreGraphics.framework + path + Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/CoreGraphics.framework + sourceTree + DEVELOPER_DIR + + 29A714F97FEC7249C075FD1B + + fileRef + 98D565C31B4E1BA8DEC0CD71 + isa + PBXBuildFile + + 29C91E9A9A1FACD36088397D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SWTableViewCell-Private.xcconfig + sourceTree + <group> + + 29EBF6D132B45FA490AAE8C4 + + children + + EF04ADF8DBB1227D34EBBEEA + DD72EA41B8BD0DC998006611 + 2480FD39925604EC68E2B1B1 + 7A9806F1FFB8C59E80CBFD08 + 1D87621C8A8B06BD9D364D45 + + isa + PBXGroup + sourceTree + <group> + + 2A7803167CE7616DAD6D45D8 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + FMDatabase.h + path + src/fmdb/FMDatabase.h + sourceTree + <group> + + 2C5859609EFA12DBF8041624 + + containerPortal + 003A31C6AADD74836B88341F + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + EA053313AC9B201518E824AF + remoteInfo + Pods-Mantle + + 2D3A6D4FA7D703DF6C8A7450 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFURLSessionManager.h + path + AFNetworking/AFURLSessionManager.h + sourceTree + <group> + + 2D77E6FB71644E503AB9ED42 + + fileRef + 23A7B732974BAA16EF4D4F5A + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 2E82A19ADA9D6FA582DFA1B8 + + fileRef + 5CDF5BD81D96D9F7921C8DC4 + isa + PBXBuildFile + + 2F252426DE161299AE05188D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + wrapper.plug-in + name + MJRefresh.bundle + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefresh.bundle + sourceTree + <group> + + 2FC003B95AA7F89F6830FF92 + + fileRef + 32C94CBBCF8C76526F8213DA + isa + PBXBuildFile + + 304E5532CC66B25020968ED2 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIAlertView+AFNetworking.m + path + UIKit+AFNetworking/UIAlertView+AFNetworking.m + sourceTree + <group> + + 30531E76C05F3BC19F4D8D31 + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerNext@2x.png + path + SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext@2x.png + sourceTree + <group> + + 30C3BD86CBED0DC2975AE9C1 + + fileRef + 282B0048A3E511971931B363 + isa + PBXBuildFile + + 31ED12F5CEA9A23F5663038A + + buildConfigurations + + 666B1AFF5E73BE290468F5EC + 8A8E2AEA05C87BF2E72C7FCA + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 322D65FFB3319CBE9B35DD56 + + children + + 575254127992AC3095637C85 + C8519CEEEF547AA9EE9D9271 + 928FEC03396D35D183A65963 + 8DCB4D41A489D80F71A9D029 + F19082954117D5EC4CBF111A + E32EAF52CDE8541AAA86F6A0 + B3C85AC9AFD3294AE7C56106 + 716C03D21AAED4A8DD5ED96E + 84E79296009B0C709F29B5C1 + 1890A9018AFB550869401948 + 60142F5566216743E153E6C3 + 9F59D37382C8481C4A3543E6 + 3C4B103B2DCE282C9C9EA571 + FD93687F5220E28F92C0D41E + E9A68AA93E6B24526C1517E5 + 69070D1F2DAD001B977D7FCD + 9F77207596AAC05C2F57FD7F + 0F22D9A04C4D256875AD1033 + 7A1CB4CAA83E0FC77E12607B + 43B8A0C73CAAAADDEBCE7C0C + 8E7746C93B5A382A8BFB31C8 + FD317A4CDFFEF6932C841E62 + BDD54D59F9F168C7CDC3C286 + 5CDF5BD81D96D9F7921C8DC4 + 9878234455241C9D71D7D974 + E96F46F8A984911D7538CA63 + BC949D87330F6EC5E34A3352 + 35DE48B4FA6E51BD7D1BA6FC + 8DC0686ECBB745003C3651C3 + + isa + PBXGroup + name + Core + sourceTree + <group> + + 32C94CBBCF8C76526F8213DA + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MJRefreshBaseView.m + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshBaseView.m + sourceTree + <group> + + 3396072C759A0E898549D6E7 + + fileRef + 90E53DFD34C1281914AAC149 + isa + PBXBuildFile + + 33DC1FE29B55A083427A2983 + + children + + 2579348338E55E4DD3339342 + 3A04D5BA2926938475C2BC63 + + isa + PBXGroup + name + FMDB + path + FMDB + sourceTree + <group> + + 34257C1DD98D838891B765BC + + children + + 44E5FEBB52959F4FE292E75F + 29C91E9A9A1FACD36088397D + A2B106C048B78A5C6FBAA445 + 94AC0364478A39DA51322B7F + + isa + PBXGroup + name + Support Files + path + ../Target Support Files/Pods-SWTableViewCell + sourceTree + <group> + + 34A0A9B27EF8487D6B85D039 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFNetworkReachabilityManager.m + path + AFNetworking/AFNetworkReachabilityManager.m + sourceTree + <group> + + 35DE48B4FA6E51BD7D1BA6FC + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIView+WebCacheOperation.h + path + SDWebImage/UIView+WebCacheOperation.h + sourceTree + <group> + + 379C4A4E6343D5622A38206E + + fileRef + 0F22D9A04C4D256875AD1033 + isa + PBXBuildFile + + 379D3CCD2FFBB2698E6A788E + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + metamacros.h + path + Mantle/extobjc/metamacros.h + sourceTree + <group> + + 37B990D486EB877EA36E8C25 + + fileRef + 6352CB3951039CAB104F5D32 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 3886D77C2964260BA24AC311 + + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + CLANG_CXX_LANGUAGE_STANDARD + gnu++0x + CLANG_CXX_LIBRARY + libc++ + CLANG_ENABLE_MODULES + YES + CLANG_ENABLE_OBJC_ARC + YES + CLANG_WARN_BOOL_CONVERSION + YES + CLANG_WARN_CONSTANT_CONVERSION + YES + CLANG_WARN_DIRECT_OBJC_ISA_USAGE + YES + CLANG_WARN_EMPTY_BODY + YES + CLANG_WARN_ENUM_CONVERSION + YES + CLANG_WARN_INT_CONVERSION + YES + CLANG_WARN_OBJC_ROOT_CLASS + YES + COPY_PHASE_STRIP + NO + ENABLE_NS_ASSERTIONS + NO + GCC_C_LANGUAGE_STANDARD + gnu99 + GCC_PREPROCESSOR_DEFINITIONS + + RELEASE=1 + + GCC_WARN_64_TO_32_BIT_CONVERSION + YES + GCC_WARN_ABOUT_RETURN_TYPE + YES + GCC_WARN_UNDECLARED_SELECTOR + YES + GCC_WARN_UNINITIALIZED_AUTOS + YES + GCC_WARN_UNUSED_FUNCTION + YES + GCC_WARN_UNUSED_VARIABLE + YES + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + STRIP_INSTALLED_PRODUCT + NO + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + 3A04D5BA2926938475C2BC63 + + children + + 0C14F1A11A291CA30BCB976F + 2A7803167CE7616DAD6D45D8 + 595FC29ACF0D8E7894A124BF + 9E3CADF4D34242891C1E4725 + 96B82497505EF98401B50E1D + C684423B9F0BCABE69332621 + 6352CB3951039CAB104F5D32 + DC332F6A26805C987939E79B + FFF0E1F586F1C9698F168012 + 18779A7BA8AAD008F51F3F9D + 222F9FE85B6C3B610407F404 + + isa + PBXGroup + name + common + sourceTree + <group> + + 3A2FD88F529A99A655D5C439 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SVIndefiniteAnimatedView.m + path + SVProgressHUD/SVIndefiniteAnimatedView.m + sourceTree + <group> + + 3AACA1031CB453DF0B0F1B62 + + children + + 3D08731A2D8B7A9D2A860E1E + 187C3AFF7CA47A0B29C75D89 + 32C94CBBCF8C76526F8213DA + 217FA4FB15D4EDE83A84233D + A19B2B715041A76AD22B7BB7 + C5B29E7C81D4C77334248AA5 + 3ED88041ED6DCCA7AB130669 + DC6959F6B0389433A846F09B + D0C6BE4F0F08EEF1AD4759BF + 0E03512149CABB1F580F757D + DC50FB9ACAC3D68AE360BF5F + 8ED9213EE55680C24F1EB677 + 25BC2970B45A7D905D5F19BB + 635165301CE75B15CC16EE35 + D405E1711A624A1719E082D2 + 77D44783F9EE017394DF2D6A + 6A082816851C55476BD99C06 + + isa + PBXGroup + name + MJRefresh + path + MJRefresh + sourceTree + <group> + + 3C4B103B2DCE282C9C9EA571 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SDWebImageManager.h + path + SDWebImage/SDWebImageManager.h + sourceTree + <group> + + 3C55B095805681785D374172 + + fileRef + D0C6BE4F0F08EEF1AD4759BF + isa + PBXBuildFile + + 3CF9B45DDE34993A3FD50533 + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods-MJRefresh.a + sourceTree + BUILT_PRODUCTS_DIR + + 3D08731A2D8B7A9D2A860E1E + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MJRefresh.h + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefresh.h + sourceTree + <group> + + 3E47599B0E330499635F07EE + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods.a + sourceTree + BUILT_PRODUCTS_DIR + + 3E7E94589902454FD328B4FD + + fileRef + 76D0502FC1D6208D9E893050 + isa + PBXBuildFile + + 3ED88041ED6DCCA7AB130669 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MJRefreshFooterView.m + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.m + sourceTree + <group> + + 3F40BF383E1E1834C0191BD5 + + fileRef + 771F20504BB303BB62A88285 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 3FE2CB4E3BF724BF9DADD804 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-SVProgressHUD-dummy.m + sourceTree + <group> + + 404F813C33EA2B5B22382ED6 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-AFNetworking.xcconfig + sourceTree + <group> + + 4128868F2EF04420A1F35E0D + + buildActionMask + 2147483647 + files + + 1B0ECD78A6C7584001AA72BE + 912AE7405EF879CF2313E84E + 055CD4E1DAF33217D19B9141 + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 41B60CD843C52B8457DCB0E0 + + buildConfigurationList + BEC66FA7BE915660404F69F2 + buildPhases + + E6D38302A5F37DB5658C41BB + F3B7C44428DC09B4933F043E + + buildRules + + dependencies + + 57232EF4CF27F922F799FEB8 + AD73A79FDD2F245D4F40C14B + 75C7388F53F668992B97A813 + DCFD647287A6F3DEE53059EB + 183B217DE3DE00FBD76C9DE5 + AADD81544137DB9F341D6ED3 + 051EC94587D0A832E9D6DEBA + 74B2111F4657AE8313673C8E + + isa + PBXNativeTarget + name + Pods + productName + Pods + productReference + 3E47599B0E330499635F07EE + productType + com.apple.product-type.library.static + + 4346B230A89B46E6BE901D9E + + children + + 9FB2FE90C5104F065B94608B + 3A2FD88F529A99A655D5C439 + 47ED5B3E2E498FA972A1AC3B + 52C22D274C762A81E9AEFD70 + 12371F77B302ED20D4ABE615 + F85DB5D3718ADE63303C06E7 + + isa + PBXGroup + name + SVProgressHUD + path + SVProgressHUD + sourceTree + <group> + + 436DFB9BEE3EAF06EAB25B0A + + fileRef + 1DFAEC12DD2639335AF49ACE + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 43B8A0C73CAAAADDEBCE7C0C + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIImage+GIF.h + path + SDWebImage/UIImage+GIF.h + sourceTree + <group> + + 4404E8E40C694424BA0B2EA2 + + fileRef + 514D95EC1DE6E7F84DFD7077 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 447B33241D6E8376ACAC2270 + + fileRef + 2046088381816FB1A6115AE8 + isa + PBXBuildFile + + 44E5FEBB52959F4FE292E75F + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SWTableViewCell.xcconfig + sourceTree + <group> + + 4510BD0D82B5FD8633E82F6C + + fileRef + 61E1D6F569824AE60EC953DC + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 4639EC1DFC9BDEE03FCECD28 + + fileRef + FD317A4CDFFEF6932C841E62 + isa + PBXBuildFile + + 463D037C8D05265B93AA341F + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods-SWTableViewCell.a + sourceTree + BUILT_PRODUCTS_DIR + + 46F1E537458316428EEE009F + + fileRef + C834791111C32E19511470D4 + isa + PBXBuildFile + + 475828FB9C2F29954582B1E4 + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerNext.png + path + SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext.png + sourceTree + <group> + + 47BC372C33FCDDB0603FF870 + + baseConfigurationReference + 11292E3DE8EF40F9DCBCD526 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-MJRefresh/Pods-MJRefresh-prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + 47C11AD21FEAD8A5CAA86FC0 + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods-AFNetworking.a + sourceTree + BUILT_PRODUCTS_DIR + + 47D9D21AF5FF6276C1230478 + + fileRef + 304E5532CC66B25020968ED2 + isa + PBXBuildFile + + 47ED5B3E2E498FA972A1AC3B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SVProgressHUD.h + path + SVProgressHUD/SVProgressHUD.h + sourceTree + <group> + + 48558FEAC015CC0EFC37FD0A + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SVWebViewControllerActivity.m + path + SVWebViewController/UIActivities/SVWebViewControllerActivity.m + sourceTree + <group> + + 49C2583DD5BC008CD83F6071 + + fileRef + C50CBBB3320CBFC5FA8EA34D + isa + PBXBuildFile + + 4AC5FA018B13C92FA6D66B86 + + fileRef + 983F9AB5B982D654799AA2AC + isa + PBXBuildFile + + 4D56B1E3005FDE505FCEF6C6 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIImageView+AFNetworking.m + path + UIKit+AFNetworking/UIImageView+AFNetworking.m + sourceTree + <group> + + 514D95EC1DE6E7F84DFD7077 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + EXTRuntimeExtensions.m + path + Mantle/extobjc/EXTRuntimeExtensions.m + sourceTree + <group> + + 5161C757881F6F6873559967 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-SVProgressHUD-prefix.pch + sourceTree + <group> + + 52C22D274C762A81E9AEFD70 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SVProgressHUD.m + path + SVProgressHUD/SVProgressHUD.m + sourceTree + <group> + + 52D9636A49CE4EAB4B056599 + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerActivitySafari@2x.png + path + SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari@2x.png + sourceTree + <group> + + 531197FDF80BC84527CCAF02 + + fileRef + F0D0B8FA1F237AF39207A58C + isa + PBXBuildFile + + 532E5B4150ED4F50E11BF0C7 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MTLModel+NSCoding.h + path + Mantle/MTLModel+NSCoding.h + sourceTree + <group> + + 53C5A15AD63D3476D0CF1531 + + fileRef + F0D0B8FA1F237AF39207A58C + isa + PBXBuildFile + + 5453F743BF1ED5091106B499 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MTLManagedObjectAdapter.h + path + Mantle/MTLManagedObjectAdapter.h + sourceTree + <group> + + 54AF66B17C0AEFF7AE1E5828 + + children + + 27A001025D8F6246D8E0D8D3 + 10D51B68691D31108009BE93 + 0E0B9761485C54F60690139C + 63B65631DCD63B55E53DCE03 + 282B0048A3E511971931B363 + BD7A57AABDA83E720552763E + + isa + PBXGroup + name + NSURLConnection + sourceTree + <group> + + 55A7772828B4EE4C2F35A0CD + + fileRef + 9878234455241C9D71D7D974 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 57232EF4CF27F922F799FEB8 + + isa + PBXTargetDependency + name + Pods-AFNetworking + target + E0F50EA1905F2A7094812973 + targetProxy + 1CD8DE0BC0E13E9F18B3F9A1 + + 5737FC94B9492B6E6C616163 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text + path + Pods-acknowledgements.markdown + sourceTree + <group> + + 573C8CC99C8641490B222C89 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MTLValueTransformer.m + path + Mantle/MTLValueTransformer.m + sourceTree + <group> + + 575254127992AC3095637C85 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + NSData+ImageContentType.h + path + SDWebImage/NSData+ImageContentType.h + sourceTree + <group> + + 57FA31C7342E4A8693201F60 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-MJRefresh-dummy.m + sourceTree + <group> + + 585F33F75FFBDB5A2D635BC5 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-AFNetworking-Private.xcconfig + sourceTree + <group> + + 58D5E10B6F509A4D289AC17C + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SWUtilityButtonView.h + path + SWTableViewCell/PodFiles/SWUtilityButtonView.h + sourceTree + <group> + + 595FC29ACF0D8E7894A124BF + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + FMDatabase.m + path + src/fmdb/FMDatabase.m + sourceTree + <group> + + 59C305ABE1A25B9CB62E5D80 + + buildActionMask + 2147483647 + files + + 7B339A4AB2229806F0376DB7 + BE9EDA04D687D70B682E1E0C + 69F567464F319FC63F2636E9 + 49C2583DD5BC008CD83F6071 + F02AEA09DBE0E12AF360F35D + 89DFAC3443DB77191DF2822E + C3A33DB3AF5947A220C22474 + 30C3BD86CBED0DC2975AE9C1 + 447B33241D6E8376ACAC2270 + D88A7258E9903DD9091947B3 + DB5A704B96D04FBF9549DA3B + FB392C3A7B8813F8724C2732 + EB394718051F19102CEA333B + 7CD1296E64395F26B193A132 + 8F938B6A800B85ACF6903654 + 29A714F97FEC7249C075FD1B + 615507F606D311E239F28363 + F78D23F252315D98B9BE3FA6 + 3E7E94589902454FD328B4FD + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 59DD36BD9A4D804D5A701ED2 + + buildActionMask + 2147483647 + files + + 1A404CF9215FA5CE825E6AE2 + 7DA715BA2498F3CB799A4431 + C885E60E6C8BD0A926570AF5 + 892235EA9B366AF2D9486607 + E4F17FDA9A2004644DE362D1 + 160D3E2EB45E710B513005B2 + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 5A89A95B50754A00C6F8883D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SVWebViewController.xcconfig + sourceTree + <group> + + 5C59B57AC630CD73AB5E2D1E + + fileRef + 35DE48B4FA6E51BD7D1BA6FC + isa + PBXBuildFile + + 5CDF5BD81D96D9F7921C8DC4 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIImageView+HighlightedWebCache.h + path + SDWebImage/UIImageView+HighlightedWebCache.h + sourceTree + <group> + + 5CEA9DDB4661A6FC3DC94DC6 + + containerPortal + 003A31C6AADD74836B88341F + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + 6736EF81F571346B01E63AAB + remoteInfo + Pods-SVProgressHUD + + 5DF09EA3510F7C19B9A4DA3C + + fileRef + 187C3AFF7CA47A0B29C75D89 + isa + PBXBuildFile + + 60142F5566216743E153E6C3 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SDWebImageDownloaderOperation.h + path + SDWebImage/SDWebImageDownloaderOperation.h + sourceTree + <group> + + 613007691409B9A6751D3737 + + fileRef + AD4009A3CA3371D1F8C780E5 + isa + PBXBuildFile + + 615507F606D311E239F28363 + + fileRef + 778D223C43915891DECBE645 + isa + PBXBuildFile + + 61E1D6F569824AE60EC953DC + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MTLManagedObjectAdapter.m + path + Mantle/MTLManagedObjectAdapter.m + sourceTree + <group> + + 62417097E44F7D3F8139F32F + + baseConfigurationReference + A1B208310F6C031CA9568682 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-SDWebImage/Pods-SDWebImage-prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + 62A6847E2C4950BA9C5A8A73 + + fileRef + 02E92DC83C62401C25C8913C + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 633433250CA4F0951A356573 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + EXTKeyPathCoding.h + path + Mantle/extobjc/EXTKeyPathCoding.h + sourceTree + <group> + + 635165301CE75B15CC16EE35 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIView+MJExtension.h + path + MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.h + sourceTree + <group> + + 6352CB3951039CAB104F5D32 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + FMDatabasePool.m + path + src/fmdb/FMDatabasePool.m + sourceTree + <group> + + 639C0E9A9E7ADF70C513571E + + fileRef + 9F59D37382C8481C4A3543E6 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 63B65631DCD63B55E53DCE03 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFHTTPRequestOperationManager.m + path + AFNetworking/AFHTTPRequestOperationManager.m + sourceTree + <group> + + 640D32B00E7CA013FAA9F891 + + fileRef + 2384225F66B601A470E03B2D + isa + PBXBuildFile + + 651297332C80103B10000DCA + + fileRef + BD9CA4ED0FDE48B5335FA601 + isa + PBXBuildFile + + 65D19C9FCE68CD267930EF33 + + fileRef + E9A68AA93E6B24526C1517E5 + isa + PBXBuildFile + + 662A98C63D4A25AEDD5B5EC8 + + fileRef + 69070D1F2DAD001B977D7FCD + isa + PBXBuildFile + + 662F6BC68D35264D3A2E14DF + + baseConfigurationReference + E0E9DDEE088E41C8CF4C003D + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + YES + DSTROOT + /tmp/xcodeproj.dst + GCC_PRECOMPILE_PREFIX_HEADER + YES + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + 666B1AFF5E73BE290468F5EC + + baseConfigurationReference + B9F5BA86ACFC81B344D15D30 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-Mantle/Pods-Mantle-prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + 6736EF81F571346B01E63AAB + + buildConfigurationList + 00184188B977DFF23A1F85C5 + buildPhases + + 4128868F2EF04420A1F35E0D + 7371E4E66A36022278C4AA90 + 73926FAB26BEDB4523776F71 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Pods-SVProgressHUD + productName + Pods-SVProgressHUD + productReference + C8409304ABBDB3DE6635DB18 + productType + com.apple.product-type.library.static + + 674480447F049BFA1C4EA514 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIImageView+AFNetworking.h + path + UIKit+AFNetworking/UIImageView+AFNetworking.h + sourceTree + <group> + + 67528D3EFE5A643ED1F3CCAA + + fileRef + 0BC85B368F05F28D8AC1E014 + isa + PBXBuildFile + + 69070D1F2DAD001B977D7FCD + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SDWebImagePrefetcher.h + path + SDWebImage/SDWebImagePrefetcher.h + sourceTree + <group> + + 6947C9D1C5EE33C1D2440E0C + + fileRef + F0DD19AA7C01867C1769DBE1 + isa + PBXBuildFile + + 69F567464F319FC63F2636E9 + + fileRef + D9CF805123DCF31BD815B4BB + isa + PBXBuildFile + + 6A082816851C55476BD99C06 + + children + + B3654B8D5A85FC44A7A6B1FE + 11292E3DE8EF40F9DCBCD526 + 57FA31C7342E4A8693201F60 + A7755A9FB17EA678C37DCD95 + + isa + PBXGroup + name + Support Files + path + ../Target Support Files/Pods-MJRefresh + sourceTree + <group> + + 6A38B085018671A0ABB83BE1 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MTLReflection.h + path + Mantle/MTLReflection.h + sourceTree + <group> + + 6AE46452959456D9CAA2648A + + fileRef + 3ED88041ED6DCCA7AB130669 + isa + PBXBuildFile + + 6B6B026C7F8F1376C998B055 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-Mantle-prefix.pch + sourceTree + <group> + + 6C469821D18CEA22E80ACA5E + + fileRef + CE4B7722CAC9ED8DD0114663 + isa + PBXBuildFile + + 6C883654D7A0A3023FD1840D + + fileRef + E96F46F8A984911D7538CA63 + isa + PBXBuildFile + + 6C91BBFD0AEB7230111657C4 + + children + + 2384225F66B601A470E03B2D + BF9582E6D1D11AAE4C82790C + CE4B7722CAC9ED8DD0114663 + D2AE7F8D94E0B80BFA8F603A + A32AD2139187CB1F5F2B6247 + FC45931EABC40836F3C02FDB + B2DFB8ABE3C361564605FC09 + D8F1FDF888DD2382AECC30C3 + C56F74D0AAB1C57653DA7F7A + 983F9AB5B982D654799AA2AC + 58D5E10B6F509A4D289AC17C + F3E77A78BED9A830D2670005 + 34257C1DD98D838891B765BC + + isa + PBXGroup + name + SWTableViewCell + path + SWTableViewCell + sourceTree + <group> + + 6D0FE93D2F53E6F9BE778A43 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + EXTRuntimeExtensions.h + path + Mantle/extobjc/EXTRuntimeExtensions.h + sourceTree + <group> + + 6D3B22115589829E7FEAC2D2 + + fileRef + 7EABDBD965900014161BECCC + isa + PBXBuildFile + + 6D6492CFDFC03E3EEED90937 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIActivityIndicatorView+AFNetworking.h + path + UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h + sourceTree + <group> + + 6DC5F2F2A80D898D1B9BA4E9 + + fileRef + 4D56B1E3005FDE505FCEF6C6 + isa + PBXBuildFile + + 6EE966C6726621AA9BA61694 + + fileRef + 16BE2A454A10A0FFBBFDD201 + isa + PBXBuildFile + + 70F7A8DB0E39B67802CA7A76 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SVWebViewController.h + path + SVWebViewController/SVWebViewController.h + sourceTree + <group> + + 7119A73FBB159384BD4FC17E + + fileRef + D8F1FDF888DD2382AECC30C3 + isa + PBXBuildFile + + 716C03D21AAED4A8DD5ED96E + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SDWebImageDecoder.m + path + SDWebImage/SDWebImageDecoder.m + sourceTree + <group> + + 720BC6CAA4ECD29F66CE897D + + fileRef + A32AD2139187CB1F5F2B6247 + isa + PBXBuildFile + + 72575C4414A386B75A1236C3 + + baseConfigurationReference + F20B4E0EAAA530D24685A4E2 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + YES + DSTROOT + /tmp/xcodeproj.dst + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-prefix.pch + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + 726EFC473FE50E3788EFFEEF + + fileRef + F0D0B8FA1F237AF39207A58C + isa + PBXBuildFile + + 72C660C537791274ABD52CB9 + + fileRef + AD4719C2919B562DF3C80502 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 72D8C02503DA06347455FDD9 + + containerPortal + 003A31C6AADD74836B88341F + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + D6558E03D7E8E7369D57D62A + remoteInfo + Pods-MJRefresh + + 730266F29F62BC3EB931952F + + fileRef + C32A44B3BB593CF09E391F55 + isa + PBXBuildFile + + 7371E4E66A36022278C4AA90 + + buildActionMask + 2147483647 + files + + B81737201F183B1D172A4B4D + BFA9BA48E845CDA5D016018D + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 73866FD56D89AA5A3F622874 + + buildActionMask + 2147483647 + files + + 4404E8E40C694424BA0B2EA2 + 91ACDD3A1590BBCBEDEBA6E4 + 8AFBA1F303183188ABA0AD0D + 4510BD0D82B5FD8633E82F6C + 2D77E6FB71644E503AB9ED42 + 9B92478EA76FF9303AFAE57A + EAABEB6BACA94FCEFBA11DFD + FB6C8948A46CF245ECD20949 + 436DFB9BEE3EAF06EAB25B0A + 3F40BF383E1E1834C0191BD5 + 62A6847E2C4950BA9C5A8A73 + C3756A16C38B7B1455914F49 + FDAFE1F6255ECC888D7503AB + 72C660C537791274ABD52CB9 + DFFAC01197AE918D4C9DFD66 + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 73926FAB26BEDB4523776F71 + + buildActionMask + 2147483647 + files + + CB6E38F58D69B7640B71B0D2 + 7EEF3E303A89EACE920C35DD + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 7398CA0C7FAD6B1A8E5B3A95 + + children + + 1BF5129F506CB75B0F1BC5FB + 80D1CC4C00005AC726EEF730 + E29DFA8F7F2E89354CECB6C3 + 057A36C64C16BAE9CBB65645 + 795E09B9C10CEEFC412F3BF1 + D2504912E25654781C939724 + 52D9636A49CE4EAB4B056599 + 019033947122D26DFF88E20C + 86C0AE129EAF30BD5988B84A + 475828FB9C2F29954582B1E4 + 30531E76C05F3BC19F4D8D31 + + isa + PBXGroup + name + Resources + sourceTree + <group> + + 749D67B382740B441A6C9985 + + fileRef + 292F5F1319A89AE506A962C2 + isa + PBXBuildFile + + 74B2111F4657AE8313673C8E + + isa + PBXTargetDependency + name + Pods-SWTableViewCell + target + 0E44B521E203EC4F111815E4 + targetProxy + A212E3E719279B15D99358D7 + + 74ED67273EBDF1D93351D598 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SVProgressHUD.xcconfig + sourceTree + <group> + + 752BB0BB115A89E3F4860E7E + + children + + 5737FC94B9492B6E6C616163 + 221E3FF2B9CDB1D4F3615F0D + 1F5410B3AD75104BB163C869 + C0ECB4C8D31A24B2C3CF9E1F + FC5FC75F692847F3591B34B3 + ECDFCA3A35CD6A95747B8E90 + E0E9DDEE088E41C8CF4C003D + + isa + PBXGroup + name + Pods + path + Target Support Files/Pods + sourceTree + <group> + + 7571161F8493E257141282E2 + + buildConfigurations + + 823C291B70653700AE069288 + 7DB2B870719E2167330488F5 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 75C7388F53F668992B97A813 + + isa + PBXTargetDependency + name + Pods-MJRefresh + target + D6558E03D7E8E7369D57D62A + targetProxy + 72D8C02503DA06347455FDD9 + + 76D0502FC1D6208D9E893050 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIWebView+AFNetworking.h + path + UIKit+AFNetworking/UIWebView+AFNetworking.h + sourceTree + <group> + + 76F2FB474F9C57ED0AB606BB + + children + + 2046088381816FB1A6115AE8 + D09A62E8A6854C6E80B36152 + 7E1CD1AAAE86E52A5E55A54C + EDA79BFF36ED8CC66472C4B4 + + isa + PBXGroup + name + Serialization + sourceTree + <group> + + 771F20504BB303BB62A88285 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + NSDictionary+MTLManipulationAdditions.m + path + Mantle/NSDictionary+MTLManipulationAdditions.m + sourceTree + <group> + + 778D223C43915891DECBE645 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIProgressView+AFNetworking.h + path + UIKit+AFNetworking/UIProgressView+AFNetworking.h + sourceTree + <group> + + 77B2205754BF87FD2229D9F2 + + fileRef + D2AE7F8D94E0B80BFA8F603A + isa + PBXBuildFile + + 77D44783F9EE017394DF2D6A + + children + + 2F252426DE161299AE05188D + + isa + PBXGroup + name + Resources + sourceTree + <group> + + 795E09B9C10CEEFC412F3BF1 + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerActivitySafari-iPad.png + path + SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad.png + sourceTree + <group> + + 79AE7927E2E34267BBB4EEFB + + fileRef + 11E705D1FBE2231D8B3FA30B + isa + PBXBuildFile + + 7A1CB4CAA83E0FC77E12607B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIButton+WebCache.m + path + SDWebImage/UIButton+WebCache.m + sourceTree + <group> + + 7A75EF39F7B6094E98E9D58F + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIRefreshControl+AFNetworking.h + path + UIKit+AFNetworking/UIRefreshControl+AFNetworking.h + sourceTree + <group> + + 7A9806F1FFB8C59E80CBFD08 + + children + + 3E47599B0E330499635F07EE + 47C11AD21FEAD8A5CAA86FC0 + 0398B69338481EC817F6F6EB + 3CF9B45DDE34993A3FD50533 + 0DDB7686E187F3FC19D520AC + 0371BF6A0BA2FCC5D93407F8 + C8409304ABBDB3DE6635DB18 + 8BF1A56862208AAE73DA9531 + 463D037C8D05265B93AA341F + + isa + PBXGroup + name + Products + sourceTree + <group> + + 7AF9843A5A131AAFDB93EA21 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-FMDB-prefix.pch + sourceTree + <group> + + 7B237DEB99E4A1EC780BD565 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFSecurityPolicy.m + path + AFNetworking/AFSecurityPolicy.m + sourceTree + <group> + + 7B339A4AB2229806F0376DB7 + + fileRef + 27A001025D8F6246D8E0D8D3 + isa + PBXBuildFile + + 7C9788498CCBBD0718711B7D + + fileRef + BD7A57AABDA83E720552763E + isa + PBXBuildFile + + 7CD1296E64395F26B193A132 + + fileRef + 90692384AE86654AF740CBA0 + isa + PBXBuildFile + + 7D4286C5720F98FA2A3F8A35 + + fileRef + 8ED9213EE55680C24F1EB677 + isa + PBXBuildFile + + 7DA715BA2498F3CB799A4431 + + fileRef + 2A7803167CE7616DAD6D45D8 + isa + PBXBuildFile + + 7DB2B870719E2167330488F5 + + baseConfigurationReference + 29C91E9A9A1FACD36088397D + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + YES + DSTROOT + /tmp/xcodeproj.dst + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-prefix.pch + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + 7E1CD1AAAE86E52A5E55A54C + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFURLResponseSerialization.h + path + AFNetworking/AFURLResponseSerialization.h + sourceTree + <group> + + 7E41E08A91865687803B6C82 + + baseConfigurationReference + A1B208310F6C031CA9568682 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + YES + DSTROOT + /tmp/xcodeproj.dst + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-SDWebImage/Pods-SDWebImage-prefix.pch + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + 7E4322D8FA302168CB5CFFB2 + + buildActionMask + 2147483647 + files + + 87A2F8DB244BEC5D78F28B8B + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 7E4DEC9F5579FF9E6012310D + + buildActionMask + 2147483647 + files + + 2FC003B95AA7F89F6830FF92 + ECFFA56C6B3F8AC988E09B43 + 6AE46452959456D9CAA2648A + 3C55B095805681785D374172 + D568513A73D383D812B92361 + 2170FBC10D2E8E490ECD303D + CCD59E2FDDA491F626635409 + 016D2ED5429A374F8D023442 + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 7EABDBD965900014161BECCC + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + ImageIO.framework + path + Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/ImageIO.framework + sourceTree + DEVELOPER_DIR + + 7EEF3E303A89EACE920C35DD + + fileRef + 47ED5B3E2E498FA972A1AC3B + isa + PBXBuildFile + + 7F117C1078DB1AD4F3B4FE11 + + fileRef + 928FEC03396D35D183A65963 + isa + PBXBuildFile + + 7F71FB5470A79B51285AB34E + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + NSObject+MTLComparisonAdditions.m + path + Mantle/NSObject+MTLComparisonAdditions.m + sourceTree + <group> + + 7FFBF073B63F5E27B5D0072F + + buildConfigurationList + 8EB04CFA656709317963A2B2 + buildPhases + + 27CC88179E549D8028BB3973 + B75F517882BF000A53EC59B3 + EBB725B945B1732ECF3A9006 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Pods-SDWebImage + productName + Pods-SDWebImage + productReference + 0371BF6A0BA2FCC5D93407F8 + productType + com.apple.product-type.library.static + + 80D1CC4C00005AC726EEF730 + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerActivityChrome-iPad.png + path + SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad.png + sourceTree + <group> + + 816C64CDAD58A599C6C8138B + + children + + CAC00BB41401121BDC44E7E5 + B9F5BA86ACFC81B344D15D30 + A95D82B9D1D2BEFE3D2DAB00 + 6B6B026C7F8F1376C998B055 + + isa + PBXGroup + name + Support Files + path + ../Target Support Files/Pods-Mantle + sourceTree + <group> + + 823C291B70653700AE069288 + + baseConfigurationReference + 29C91E9A9A1FACD36088397D + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + 82D7942CFFB4B5F9A8039B0E + + buildConfigurations + + FC51B49E4686DFD82E09DE0B + AF263AC92D39C068F246DF63 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 83C50DBF98466D8F993D6269 + + fileRef + 3D08731A2D8B7A9D2A860E1E + isa + PBXBuildFile + + 846C466F2240C4C93CD6C24C + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SVWebViewController.m + path + SVWebViewController/SVWebViewController.m + sourceTree + <group> + + 84E79296009B0C709F29B5C1 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SDWebImageDownloader.h + path + SDWebImage/SDWebImageDownloader.h + sourceTree + <group> + + 856BC697A0DE727D2365B4B7 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + NSError+MTLModelException.h + path + Mantle/NSError+MTLModelException.h + sourceTree + <group> + + 86C0AE129EAF30BD5988B84A + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerBack@2x.png + path + SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack@2x.png + sourceTree + <group> + + 86F73289E11C480C16D33BCB + + baseConfigurationReference + ECDFCA3A35CD6A95747B8E90 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + 87A2F8DB244BEC5D78F28B8B + + fileRef + F0D0B8FA1F237AF39207A58C + isa + PBXBuildFile + + 892235EA9B366AF2D9486607 + + fileRef + C684423B9F0BCABE69332621 + isa + PBXBuildFile + + 895426A01E6E4514960D5307 + + fileRef + 7A1CB4CAA83E0FC77E12607B + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 89DFAC3443DB77191DF2822E + + fileRef + 9AC054684C72878BFD1354BD + isa + PBXBuildFile + + 8A081DC2D78B0C22A3B1CDDE + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFNetworkActivityIndicatorManager.m + path + UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m + sourceTree + <group> + + 8A72EC2E5ADEFD1185ACE525 + + baseConfigurationReference + E8D5D18DAA535CA6B08AA393 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + YES + DSTROOT + /tmp/xcodeproj.dst + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-prefix.pch + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + 8A8E2AEA05C87BF2E72C7FCA + + baseConfigurationReference + B9F5BA86ACFC81B344D15D30 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + YES + DSTROOT + /tmp/xcodeproj.dst + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-Mantle/Pods-Mantle-prefix.pch + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + 8AFBA1F303183188ABA0AD0D + + fileRef + 1817BF46EC0C042C7D3CF340 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 8BF1A56862208AAE73DA9531 + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods-SVWebViewController.a + sourceTree + BUILT_PRODUCTS_DIR + + 8C11E60C3F243002B20ABAF7 + + fileRef + C8519CEEEF547AA9EE9D9271 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 8CCB2EE71B1282861778906D + + fileRef + 70F7A8DB0E39B67802CA7A76 + isa + PBXBuildFile + + 8D934380DB6CDDF6B1F43315 + + fileRef + BC949D87330F6EC5E34A3352 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 8DC0686ECBB745003C3651C3 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIView+WebCacheOperation.m + path + SDWebImage/UIView+WebCacheOperation.m + sourceTree + <group> + + 8DCB4D41A489D80F71A9D029 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SDImageCache.m + path + SDWebImage/SDImageCache.m + sourceTree + <group> + + 8E7746C93B5A382A8BFB31C8 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIImage+GIF.m + path + SDWebImage/UIImage+GIF.m + sourceTree + <group> + + 8EB04CFA656709317963A2B2 + + buildConfigurations + + 62417097E44F7D3F8139F32F + 7E41E08A91865687803B6C82 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + 8ED9213EE55680C24F1EB677 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIScrollView+MJRefresh.h + path + MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJRefresh.h + sourceTree + <group> + + 8F935F9ED6A55A5476D707C4 + + buildActionMask + 2147483647 + files + + 726EFC473FE50E3788EFFEEF + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 8F938B6A800B85ACF6903654 + + fileRef + 674480447F049BFA1C4EA514 + isa + PBXBuildFile + + 90692384AE86654AF740CBA0 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIButton+AFNetworking.h + path + UIKit+AFNetworking/UIButton+AFNetworking.h + sourceTree + <group> + + 90E53DFD34C1281914AAC149 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-SVWebViewController-dummy.m + sourceTree + <group> + + 912AE7405EF879CF2313E84E + + fileRef + 3A2FD88F529A99A655D5C439 + isa + PBXBuildFile + + 9165E3916BCF3741753508DC + + buildActionMask + 2147483647 + files + + 53C5A15AD63D3476D0CF1531 + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 91ACDD3A1590BBCBEDEBA6E4 + + fileRef + E62260C013619653C0C58B3D + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 928FEC03396D35D183A65963 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SDImageCache.h + path + SDWebImage/SDImageCache.h + sourceTree + <group> + + 92947A2B649AE65D923B7C2E + + fileRef + A2B106C048B78A5C6FBAA445 + isa + PBXBuildFile + + 92D1A0BBD0D2B1EA721B084C + + fileRef + 3C4B103B2DCE282C9C9EA571 + isa + PBXBuildFile + + 9449B700FD78B567CDCE349E + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFURLSessionManager.m + path + AFNetworking/AFURLSessionManager.m + sourceTree + <group> + + 94AC0364478A39DA51322B7F + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-SWTableViewCell-prefix.pch + sourceTree + <group> + + 94D197FD4192DB667B6E9A51 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFNetworkReachabilityManager.h + path + AFNetworking/AFNetworkReachabilityManager.h + sourceTree + <group> + + 968006EA8109A263FDFD3965 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-SDWebImage-dummy.m + sourceTree + <group> + + 96B82497505EF98401B50E1D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + FMDatabaseAdditions.m + path + src/fmdb/FMDatabaseAdditions.m + sourceTree + <group> + + 96E033AF44F3F21FB871FC01 + + fileRef + 48558FEAC015CC0EFC37FD0A + isa + PBXBuildFile + + 971BBE7FBC532FD0C3684E99 + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + MobileCoreServices.framework + path + Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/MobileCoreServices.framework + sourceTree + DEVELOPER_DIR + + 97959B6C405A6219826BAFBE + + fileRef + 13A1A364A5506D8A8B3CB81E + isa + PBXBuildFile + + 983F9AB5B982D654799AA2AC + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SWUtilityButtonTapGestureRecognizer.m + path + SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.m + sourceTree + <group> + + 9878234455241C9D71D7D974 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIImageView+HighlightedWebCache.m + path + SDWebImage/UIImageView+HighlightedWebCache.m + sourceTree + <group> + + 98D565C31B4E1BA8DEC0CD71 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIKit+AFNetworking.h + path + UIKit+AFNetworking/UIKit+AFNetworking.h + sourceTree + <group> + + 9AAAE1957C330405FAFB9600 + + buildActionMask + 2147483647 + files + + C1DE7C20F35B97860D706B66 + 92947A2B649AE65D923B7C2E + 77B2205754BF87FD2229D9F2 + F49B17CD5DB7BF511AD95FE0 + 7119A73FBB159384BD4FC17E + 4AC5FA018B13C92FA6D66B86 + B58F93C474B2E8430B05D256 + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 9AC054684C72878BFD1354BD + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFNetworking.h + path + AFNetworking/AFNetworking.h + sourceTree + <group> + + 9B92478EA76FF9303AFAE57A + + fileRef + 283AD6CF440DCA9B38B0B53C + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + 9C079AF4CCEEC69481F2BF10 + + fileRef + CA15D003C21CFCA2294BE5DB + isa + PBXBuildFile + + 9E3CADF4D34242891C1E4725 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + FMDatabaseAdditions.h + path + src/fmdb/FMDatabaseAdditions.h + sourceTree + <group> + + 9E99E930712393BD264CF051 + + children + + A6D689B150BE62B7DB1AC767 + 1817BF46EC0C042C7D3CF340 + 5453F743BF1ED5091106B499 + 61E1D6F569824AE60EC953DC + C834791111C32E19511470D4 + 283AD6CF440DCA9B38B0B53C + 532E5B4150ED4F50E11BF0C7 + 23A7B732974BAA16EF4D4F5A + 6A38B085018671A0ABB83BE1 + A8C971E5B6D1D6B34B5C9A1B + E7926F44F6DD7675C4CAB292 + 573C8CC99C8641490B222C89 + AF131B236DD5AB2E742ADEF2 + F0DD19AA7C01867C1769DBE1 + 1DFAEC12DD2639335AF49ACE + 2366FECF46A2354EC3AC77D5 + 771F20504BB303BB62A88285 + 856BC697A0DE727D2365B4B7 + 02E92DC83C62401C25C8913C + BFCFD346B7D3A14BA3BA069B + 7F71FB5470A79B51285AB34E + AC1C5B4CE91F11AE998D64F6 + AADE27D38FBFB33465D0DA5F + D0C3135DA2BA3C019BAF2DCF + AD4719C2919B562DF3C80502 + 816C64CDAD58A599C6C8138B + C932222C6328C3C84A162E3B + + isa + PBXGroup + name + Mantle + path + Mantle + sourceTree + <group> + + 9E9A3CEB47FB55E4697B447A + + fileRef + 532E5B4150ED4F50E11BF0C7 + isa + PBXBuildFile + + 9EC42BD6CC05E3F9835DEB3C + + children + + EA98CE819CDC3A1C462DA862 + A1B208310F6C031CA9568682 + 968006EA8109A263FDFD3965 + AA553D7A3D3565A545F3AD41 + + isa + PBXGroup + name + Support Files + path + ../Target Support Files/Pods-SDWebImage + sourceTree + <group> + + 9EDC843AF94153F5B29AD001 + + fileRef + 58D5E10B6F509A4D289AC17C + isa + PBXBuildFile + + 9EFF5CE823942564335B0542 + + fileRef + 60142F5566216743E153E6C3 + isa + PBXBuildFile + + 9F4821AF45F02268E44D0C1D + + fileRef + 84E79296009B0C709F29B5C1 + isa + PBXBuildFile + + 9F59D37382C8481C4A3543E6 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SDWebImageDownloaderOperation.m + path + SDWebImage/SDWebImageDownloaderOperation.m + sourceTree + <group> + + 9F745963084D8E9E216392E2 + + buildActionMask + 2147483647 + files + + A361D7EB87257BFB39CD297F + 24EDA1E60FA28D25D59006F1 + 67528D3EFE5A643ED1F3CCAA + FC77BBB341E0605E8ED130FB + B668271A16D47AF44F9BBCDA + 9E9A3CEB47FB55E4697B447A + 46F1E537458316428EEE009F + 1AF9F27A2984FABBCD8BB35F + 0BD156919664C48A35EEDBFE + FED8EC57D00423F3832AA2A9 + 6947C9D1C5EE33C1D2440E0C + 9FF9F40002ADF22BEF8BE069 + ABDDECC9891EA588DA2A5FF8 + E45958CE3CBD11F1707F441C + 10BE1219154FDDC59F7E91E8 + 25CE073DBCD2584B257B39DA + D79E955756AA01C364E52FE8 + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + 9F77207596AAC05C2F57FD7F + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SDWebImagePrefetcher.m + path + SDWebImage/SDWebImagePrefetcher.m + sourceTree + <group> + + 9F9C79DFE629562CA77CD2CA + + fileRef + D09A62E8A6854C6E80B36152 + isa + PBXBuildFile + + 9FA315080E627AB06418F4B4 + + fileRef + 8A081DC2D78B0C22A3B1CDDE + isa + PBXBuildFile + + 9FB2FE90C5104F065B94608B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SVIndefiniteAnimatedView.h + path + SVProgressHUD/SVIndefiniteAnimatedView.h + sourceTree + <group> + + 9FF9F40002ADF22BEF8BE069 + + fileRef + 2366FECF46A2354EC3AC77D5 + isa + PBXBuildFile + + A0BC09B6CD44A3EC41327140 + + fileRef + 7B237DEB99E4A1EC780BD565 + isa + PBXBuildFile + + A0EB66A861D7F9BE99167595 + + fileRef + 595FC29ACF0D8E7894A124BF + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + A110D8DB17AB6647C7795EBD + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIButton+AFNetworking.m + path + UIKit+AFNetworking/UIButton+AFNetworking.m + sourceTree + <group> + + A19B2B715041A76AD22B7BB7 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MJRefreshConst.m + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshConst.m + sourceTree + <group> + + A19CDB887CB102ECC06C0723 + + baseConfigurationReference + 11292E3DE8EF40F9DCBCD526 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + YES + DSTROOT + /tmp/xcodeproj.dst + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-MJRefresh/Pods-MJRefresh-prefix.pch + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + A1B208310F6C031CA9568682 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SDWebImage-Private.xcconfig + sourceTree + <group> + + A212E3E719279B15D99358D7 + + containerPortal + 003A31C6AADD74836B88341F + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + 0E44B521E203EC4F111815E4 + remoteInfo + Pods-SWTableViewCell + + A25EAE9D801AB760A4747E4B + + baseConfigurationReference + E8D5D18DAA535CA6B08AA393 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + A2B106C048B78A5C6FBAA445 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-SWTableViewCell-dummy.m + sourceTree + <group> + + A2EBB8311F6F713C23AA9103 + + fileRef + F19082954117D5EC4CBF111A + isa + PBXBuildFile + + A32AD2139187CB1F5F2B6247 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SWLongPressGestureRecognizer.h + path + SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.h + sourceTree + <group> + + A3516881B3D6F981B73AC538 + + children + + FA9D9250626EDCE049F74048 + 13A1A364A5506D8A8B3CB81E + 70F7A8DB0E39B67802CA7A76 + 846C466F2240C4C93CD6C24C + AC6F1AA84590ACFF61BAAD60 + 48558FEAC015CC0EFC37FD0A + D9813C4AEDC5894EE1B3451F + C32A44B3BB593CF09E391F55 + BD9CA4ED0FDE48B5335FA601 + CA15D003C21CFCA2294BE5DB + 7398CA0C7FAD6B1A8E5B3A95 + AE42B8105AFFE0B288D61B38 + + isa + PBXGroup + name + SVWebViewController + path + SVWebViewController + sourceTree + <group> + + A361D7EB87257BFB39CD297F + + fileRef + 633433250CA4F0951A356573 + isa + PBXBuildFile + + A3A92429628C08F12D3FC1CD + + fileRef + E32EAF52CDE8541AAA86F6A0 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + A3E886CEC48C491886768370 + + fileRef + 968006EA8109A263FDFD3965 + isa + PBXBuildFile + + A566AAD0BC4F7B6641A8C759 + + fileRef + 10D51B68691D31108009BE93 + isa + PBXBuildFile + + A6D689B150BE62B7DB1AC767 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MTLJSONAdapter.h + path + Mantle/MTLJSONAdapter.h + sourceTree + <group> + + A6EA95925C726D0A8F6D6DA1 + + containerPortal + 003A31C6AADD74836B88341F + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + F5AD41E8F4E3CBFFE9D0A6AD + remoteInfo + Pods-FMDB + + A735B515C1DCF4D2370CAF9A + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-SVWebViewController-prefix.pch + sourceTree + <group> + + A7755A9FB17EA678C37DCD95 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-MJRefresh-prefix.pch + sourceTree + <group> + + A8C971E5B6D1D6B34B5C9A1B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MTLReflection.m + path + Mantle/MTLReflection.m + sourceTree + <group> + + A95D82B9D1D2BEFE3D2DAB00 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-Mantle-dummy.m + sourceTree + <group> + + A9649B3D73F213DD8CAF3844 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-FMDB.xcconfig + sourceTree + <group> + + A98547DB16A7BA47C179FA8D + + children + + 292F5F1319A89AE506A962C2 + F0D0B8FA1F237AF39207A58C + 7EABDBD965900014161BECCC + 971BBE7FBC532FD0C3684E99 + F5FB40E1554F5686F97998FA + D2F8B867A02B15A8D833E6E7 + 15C57B0A0D754AA9967330DF + + isa + PBXGroup + name + iOS + sourceTree + <group> + + AA553D7A3D3565A545F3AD41 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-SDWebImage-prefix.pch + sourceTree + <group> + + AADD81544137DB9F341D6ED3 + + isa + PBXTargetDependency + name + Pods-SVProgressHUD + target + 6736EF81F571346B01E63AAB + targetProxy + 5CEA9DDB4661A6FC3DC94DC6 + + AADE27D38FBFB33465D0DA5F + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + NSValueTransformer+MTLInversionAdditions.m + path + Mantle/NSValueTransformer+MTLInversionAdditions.m + sourceTree + <group> + + AB1DEC2C8FBB36DEECEF04E0 + + fileRef + FA9D9250626EDCE049F74048 + isa + PBXBuildFile + + ABDDECC9891EA588DA2A5FF8 + + fileRef + 856BC697A0DE727D2365B4B7 + isa + PBXBuildFile + + AC1C5B4CE91F11AE998D64F6 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + NSValueTransformer+MTLInversionAdditions.h + path + Mantle/NSValueTransformer+MTLInversionAdditions.h + sourceTree + <group> + + AC6F1AA84590ACFF61BAAD60 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SVWebViewControllerActivity.h + path + SVWebViewController/UIActivities/SVWebViewControllerActivity.h + sourceTree + <group> + + AD4009A3CA3371D1F8C780E5 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + path + Pods-FMDB-dummy.m + sourceTree + <group> + + AD4719C2919B562DF3C80502 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + NSValueTransformer+MTLPredefinedTransformerAdditions.m + path + Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.m + sourceTree + <group> + + AD73A79FDD2F245D4F40C14B + + isa + PBXTargetDependency + name + Pods-FMDB + target + F5AD41E8F4E3CBFFE9D0A6AD + targetProxy + A6EA95925C726D0A8F6D6DA1 + + ADC6D3BD671FB020D4E165E1 + + fileRef + D9813C4AEDC5894EE1B3451F + isa + PBXBuildFile + + AE42B8105AFFE0B288D61B38 + + children + + 5A89A95B50754A00C6F8883D + E8D5D18DAA535CA6B08AA393 + 90E53DFD34C1281914AAC149 + A735B515C1DCF4D2370CAF9A + + isa + PBXGroup + name + Support Files + path + ../Target Support Files/Pods-SVWebViewController + sourceTree + <group> + + AF131B236DD5AB2E742ADEF2 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + Mantle.h + path + Mantle/Mantle.h + sourceTree + <group> + + AF263AC92D39C068F246DF63 + + baseConfigurationReference + E3C180F70C4829EC3E7C8741 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + YES + DSTROOT + /tmp/xcodeproj.dst + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-FMDB/Pods-FMDB-prefix.pch + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + B0F31E9D675CDD8EF475F4A7 + + fileRef + 43B8A0C73CAAAADDEBCE7C0C + isa + PBXBuildFile + + B2DFB8ABE3C361564605FC09 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SWTableViewCell.h + path + SWTableViewCell/PodFiles/SWTableViewCell.h + sourceTree + <group> + + B2FE89B302D990CFC2393FFB + + children + + 322D65FFB3319CBE9B35DD56 + 9EC42BD6CC05E3F9835DEB3C + + isa + PBXGroup + name + SDWebImage + path + SDWebImage + sourceTree + <group> + + B3654B8D5A85FC44A7A6B1FE + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-MJRefresh.xcconfig + sourceTree + <group> + + B37092B574E47123FA62F48A + + baseConfigurationReference + 585F33F75FFBDB5A2D635BC5 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + YES + DSTROOT + /tmp/xcodeproj.dst + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-AFNetworking/Pods-AFNetworking-prefix.pch + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_CFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_CPLUSPLUSFLAGS + + -DNS_BLOCK_ASSERTIONS=1 + $(inherited) + + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + VALIDATE_PRODUCT + YES + + isa + XCBuildConfiguration + name + Release + + B3C85AC9AFD3294AE7C56106 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SDWebImageDecoder.h + path + SDWebImage/SDWebImageDecoder.h + sourceTree + <group> + + B49FB948DC12B27713617596 + + children + + D9CF805123DCF31BD815B4BB + 290221507373808ABAA4054B + 2D3A6D4FA7D703DF6C8A7450 + 9449B700FD78B567CDCE349E + + isa + PBXGroup + name + NSURLSession + sourceTree + <group> + + B58F93C474B2E8430B05D256 + + fileRef + F3E77A78BED9A830D2670005 + isa + PBXBuildFile + + B5CE0321A8AEFC3F5FA0DF70 + + fileRef + 1890A9018AFB550869401948 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + B668271A16D47AF44F9BBCDA + + fileRef + 5453F743BF1ED5091106B499 + isa + PBXBuildFile + + B75F517882BF000A53EC59B3 + + buildActionMask + 2147483647 + files + + DDA12FA0A07A90423DAC2DAF + 6D3B22115589829E7FEAC2D2 + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + B7B2983751AA2DB871BE4F87 + + buildActionMask + 2147483647 + files + + 83C50DBF98466D8F993D6269 + 5DF09EA3510F7C19B9A4DA3C + FE4113033936F46AED1AC492 + E047647F1042A54423864302 + 245A7D5B09274802299A5413 + 0BD65AA041B8332119344140 + 7D4286C5720F98FA2A3F8A35 + D059787EBF44D5A0BC02F87F + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + B81737201F183B1D172A4B4D + + fileRef + F0D0B8FA1F237AF39207A58C + isa + PBXBuildFile + + B9011D79C925C7A071C4D24A + + baseConfigurationReference + 585F33F75FFBDB5A2D635BC5 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-AFNetworking/Pods-AFNetworking-prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + B9F5BA86ACFC81B344D15D30 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-Mantle-Private.xcconfig + sourceTree + <group> + + BB46AB577CB11E2DEC496B53 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIAlertView+AFNetworking.h + path + UIKit+AFNetworking/UIAlertView+AFNetworking.h + sourceTree + <group> + + BB9E6E4F4B05385705EB97C0 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIWebView+AFNetworking.m + path + UIKit+AFNetworking/UIWebView+AFNetworking.m + sourceTree + <group> + + BC949D87330F6EC5E34A3352 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIImageView+WebCache.m + path + SDWebImage/UIImageView+WebCache.m + sourceTree + <group> + + BD7A57AABDA83E720552763E + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFURLConnectionOperation.m + path + AFNetworking/AFURLConnectionOperation.m + sourceTree + <group> + + BD9CA4ED0FDE48B5335FA601 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SVWebViewControllerActivitySafari.h + path + SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.h + sourceTree + <group> + + BDD171D88E04245FF41CFF78 + + buildActionMask + 2147483647 + files + + 640D32B00E7CA013FAA9F891 + 6C469821D18CEA22E80ACA5E + 720BC6CAA4ECD29F66CE897D + 015D98E4D31C2E29C4FB9DBA + D0A9652EBFFEC41C2F239263 + 9EDC843AF94153F5B29AD001 + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + BDD54D59F9F168C7CDC3C286 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIImage+MultiFormat.m + path + SDWebImage/UIImage+MultiFormat.m + sourceTree + <group> + + BE940E795DD463ACED5B538C + + fileRef + A110D8DB17AB6647C7795EBD + isa + PBXBuildFile + + BE9EDA04D687D70B682E1E0C + + fileRef + 0E0B9761485C54F60690139C + isa + PBXBuildFile + + BEC66FA7BE915660404F69F2 + + buildConfigurations + + 86F73289E11C480C16D33BCB + 662F6BC68D35264D3A2E14DF + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + BF9582E6D1D11AAE4C82790C + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + NSMutableArray+SWUtilityButtons.m + path + SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.m + sourceTree + <group> + + BFA9BA48E845CDA5D016018D + + fileRef + F5FB40E1554F5686F97998FA + isa + PBXBuildFile + + BFCFD346B7D3A14BA3BA069B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + NSObject+MTLComparisonAdditions.h + path + Mantle/NSObject+MTLComparisonAdditions.h + sourceTree + <group> + + C0ECB4C8D31A24B2C3CF9E1F + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-environment.h + sourceTree + <group> + + C1DE7C20F35B97860D706B66 + + fileRef + BF9582E6D1D11AAE4C82790C + isa + PBXBuildFile + + C2F2F561C27931B0CFA6A5AD + + fileRef + 34A0A9B27EF8487D6B85D039 + isa + PBXBuildFile + + C32A44B3BB593CF09E391F55 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SVWebViewControllerActivityChrome.m + path + SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m + sourceTree + <group> + + C3756A16C38B7B1455914F49 + + fileRef + 7F71FB5470A79B51285AB34E + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + C3A33DB3AF5947A220C22474 + + fileRef + E1AD240F7028E1A092DCBEDC + isa + PBXBuildFile + + C50CBBB3320CBFC5FA8EA34D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFNetworkActivityIndicatorManager.h + path + UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h + sourceTree + <group> + + C55BDF5794C4C27E7A69A131 + + fileRef + 575254127992AC3095637C85 + isa + PBXBuildFile + + C56F74D0AAB1C57653DA7F7A + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SWUtilityButtonTapGestureRecognizer.h + path + SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.h + sourceTree + <group> + + C5B29E7C81D4C77334248AA5 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MJRefreshFooterView.h + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshFooterView.h + sourceTree + <group> + + C684423B9F0BCABE69332621 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + FMDatabasePool.h + path + src/fmdb/FMDatabasePool.h + sourceTree + <group> + + C7236453AB69F2D92E70EC3B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + path + Pods-AFNetworking-prefix.pch + sourceTree + <group> + + C834791111C32E19511470D4 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MTLModel.h + path + Mantle/MTLModel.h + sourceTree + <group> + + C8409304ABBDB3DE6635DB18 + + explicitFileType + archive.ar + includeInIndex + 0 + isa + PBXFileReference + path + libPods-SVProgressHUD.a + sourceTree + BUILT_PRODUCTS_DIR + + C8519CEEEF547AA9EE9D9271 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + NSData+ImageContentType.m + path + SDWebImage/NSData+ImageContentType.m + sourceTree + <group> + + C885E60E6C8BD0A926570AF5 + + fileRef + 9E3CADF4D34242891C1E4725 + isa + PBXBuildFile + + C932222C6328C3C84A162E3B + + children + + 633433250CA4F0951A356573 + 6D0FE93D2F53E6F9BE778A43 + 514D95EC1DE6E7F84DFD7077 + 0BC85B368F05F28D8AC1E014 + E62260C013619653C0C58B3D + 379D3CCD2FFBB2698E6A788E + + isa + PBXGroup + name + extobjc + sourceTree + <group> + + CA15D003C21CFCA2294BE5DB + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SVWebViewControllerActivitySafari.m + path + SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.m + sourceTree + <group> + + CAC00BB41401121BDC44E7E5 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-Mantle.xcconfig + sourceTree + <group> + + CB6E38F58D69B7640B71B0D2 + + fileRef + 9FB2FE90C5104F065B94608B + isa + PBXBuildFile + + CC2EB1431A8BBB896B00A972 + + fileRef + F0D0B8FA1F237AF39207A58C + isa + PBXBuildFile + + CCD36D89B4623217A9BB4F11 + + containerPortal + 003A31C6AADD74836B88341F + isa + PBXContainerItemProxy + proxyType + 1 + remoteGlobalIDString + 0D2F41CC755DC941A9D3282F + remoteInfo + Pods-SVWebViewController + + CCD59E2FDDA491F626635409 + + fileRef + 25BC2970B45A7D905D5F19BB + isa + PBXBuildFile + + CE4B7722CAC9ED8DD0114663 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SWCellScrollView.h + path + SWTableViewCell/PodFiles/SWCellScrollView.h + sourceTree + <group> + + D003F4EA52D0953E6AF73AF6 + + fileRef + F0D0B8FA1F237AF39207A58C + isa + PBXBuildFile + + D059787EBF44D5A0BC02F87F + + fileRef + 635165301CE75B15CC16EE35 + isa + PBXBuildFile + + D09A62E8A6854C6E80B36152 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFURLRequestSerialization.m + path + AFNetworking/AFURLRequestSerialization.m + sourceTree + <group> + + D0A9652EBFFEC41C2F239263 + + fileRef + C56F74D0AAB1C57653DA7F7A + isa + PBXBuildFile + + D0C3135DA2BA3C019BAF2DCF + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + NSValueTransformer+MTLPredefinedTransformerAdditions.h + path + Mantle/NSValueTransformer+MTLPredefinedTransformerAdditions.h + sourceTree + <group> + + D0C6BE4F0F08EEF1AD4759BF + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + MJRefreshHeaderView.m + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.m + sourceTree + <group> + + D139BE864E7331A490A31F83 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIProgressView+AFNetworking.m + path + UIKit+AFNetworking/UIProgressView+AFNetworking.m + sourceTree + <group> + + D2504912E25654781C939724 + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerActivitySafari-iPad@2x.png + path + SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad@2x.png + sourceTree + <group> + + D2AE7F8D94E0B80BFA8F603A + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SWCellScrollView.m + path + SWTableViewCell/PodFiles/SWCellScrollView.m + sourceTree + <group> + + D2F8B867A02B15A8D833E6E7 + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + Security.framework + path + Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/Security.framework + sourceTree + DEVELOPER_DIR + + D405E1711A624A1719E082D2 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIView+MJExtension.m + path + MJRefreshExample/MJRefreshExample/MJRefresh/UIView+MJExtension.m + sourceTree + <group> + + D568513A73D383D812B92361 + + fileRef + 57FA31C7342E4A8693201F60 + isa + PBXBuildFile + + D6558E03D7E8E7369D57D62A + + buildConfigurationList + FB388FD7B6E8D0EC4EFA5D58 + buildPhases + + 7E4DEC9F5579FF9E6012310D + 7E4322D8FA302168CB5CFFB2 + B7B2983751AA2DB871BE4F87 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Pods-MJRefresh + productName + Pods-MJRefresh + productReference + 3CF9B45DDE34993A3FD50533 + productType + com.apple.product-type.library.static + + D6D6D28D37442BAAA468A18D + + fileRef + 8DCB4D41A489D80F71A9D029 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + D76DB4316F4A2BBC29B6E2E7 + + fileRef + 222F9FE85B6C3B610407F404 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + D79E955756AA01C364E52FE8 + + fileRef + 379D3CCD2FFBB2698E6A788E + isa + PBXBuildFile + + D88A7258E9903DD9091947B3 + + fileRef + 7E1CD1AAAE86E52A5E55A54C + isa + PBXBuildFile + + D8F1FDF888DD2382AECC30C3 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SWTableViewCell.m + path + SWTableViewCell/PodFiles/SWTableViewCell.m + sourceTree + <group> + + D9813C4AEDC5894EE1B3451F + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SVWebViewControllerActivityChrome.h + path + SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.h + sourceTree + <group> + + D9CF805123DCF31BD815B4BB + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFHTTPSessionManager.h + path + AFNetworking/AFHTTPSessionManager.h + sourceTree + <group> + + DB34CB5D53D03543A81CD43D + + buildConfigurations + + B9011D79C925C7A071C4D24A + B37092B574E47123FA62F48A + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + DB5A704B96D04FBF9549DA3B + + fileRef + 2D3A6D4FA7D703DF6C8A7450 + isa + PBXBuildFile + + DC332F6A26805C987939E79B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + FMDatabaseQueue.h + path + src/fmdb/FMDatabaseQueue.h + sourceTree + <group> + + DC50FB9ACAC3D68AE360BF5F + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + UIScrollView+MJExtension.m + path + MJRefreshExample/MJRefreshExample/MJRefresh/UIScrollView+MJExtension.m + sourceTree + <group> + + DC6959F6B0389433A846F09B + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MJRefreshHeaderView.h + path + MJRefreshExample/MJRefreshExample/MJRefresh/MJRefreshHeaderView.h + sourceTree + <group> + + DCFD647287A6F3DEE53059EB + + isa + PBXTargetDependency + name + Pods-Mantle + target + EA053313AC9B201518E824AF + targetProxy + 2C5859609EFA12DBF8041624 + + DD72EA41B8BD0DC998006611 + + children + + A98547DB16A7BA47C179FA8D + + isa + PBXGroup + name + Frameworks + sourceTree + <group> + + DD8F1007201AC5D9E168DE32 + + fileRef + AC6F1AA84590ACFF61BAAD60 + isa + PBXBuildFile + + DDA12FA0A07A90423DAC2DAF + + fileRef + F0D0B8FA1F237AF39207A58C + isa + PBXBuildFile + + DDCF5122548DF51242583A68 + + fileRef + D2F8B867A02B15A8D833E6E7 + isa + PBXBuildFile + + DE2CEF2D7F7D4D643900FCE5 + + fileRef + 846C466F2240C4C93CD6C24C + isa + PBXBuildFile + + DF3027E5A4AB1DC95FB5EA9D + + fileRef + B3C85AC9AFD3294AE7C56106 + isa + PBXBuildFile + + DFFAC01197AE918D4C9DFD66 + + fileRef + A95D82B9D1D2BEFE3D2DAB00 + isa + PBXBuildFile + + E047647F1042A54423864302 + + fileRef + C5B29E7C81D4C77334248AA5 + isa + PBXBuildFile + + E0E9DDEE088E41C8CF4C003D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods.release.xcconfig + sourceTree + <group> + + E0F50EA1905F2A7094812973 + + buildConfigurationList + DB34CB5D53D03543A81CD43D + buildPhases + + 273E8CC1B7A1DF52553B76D7 + 26D05A8A28DCD60C1CA8EC7E + 59C305ABE1A25B9CB62E5D80 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Pods-AFNetworking + productName + Pods-AFNetworking + productReference + 47C11AD21FEAD8A5CAA86FC0 + productType + com.apple.product-type.library.static + + E11A8E6E65928AF83EDA8DEF + + children + + 404F813C33EA2B5B22382ED6 + 585F33F75FFBDB5A2D635BC5 + 16BE2A454A10A0FFBBFDD201 + C7236453AB69F2D92E70EC3B + + isa + PBXGroup + name + Support Files + path + ../Target Support Files/Pods-AFNetworking + sourceTree + <group> + + E1AD240F7028E1A092DCBEDC + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + AFSecurityPolicy.h + path + AFNetworking/AFSecurityPolicy.h + sourceTree + <group> + + E29DFA8F7F2E89354CECB6C3 + + includeInIndex + 1 + isa + PBXFileReference + name + SVWebViewControllerActivityChrome-iPad@2x.png + path + SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad@2x.png + sourceTree + <group> + + E2D8E0AC81FFF45B5643EB4C + + buildActionMask + 2147483647 + files + + A0EB66A861D7F9BE99167595 + F8219A50BB91E25BFDDAA0AD + 37B990D486EB877EA36E8C25 + F6E91A553C49F4862B78C4F1 + D76DB4316F4A2BBC29B6E2E7 + 613007691409B9A6751D3737 + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + E32EAF52CDE8541AAA86F6A0 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SDWebImageCompat.m + path + SDWebImage/SDWebImageCompat.m + sourceTree + <group> + + E3C180F70C4829EC3E7C8741 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-FMDB-Private.xcconfig + sourceTree + <group> + + E45958CE3CBD11F1707F441C + + fileRef + BFCFD346B7D3A14BA3BA069B + isa + PBXBuildFile + + E4F17FDA9A2004644DE362D1 + + fileRef + DC332F6A26805C987939E79B + isa + PBXBuildFile + + E62260C013619653C0C58B3D + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + EXTScope.m + path + Mantle/extobjc/EXTScope.m + sourceTree + <group> + + E6D38302A5F37DB5658C41BB + + buildActionMask + 2147483647 + files + + 21E3949570212F296A98F3C3 + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + E7926F44F6DD7675C4CAB292 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + MTLValueTransformer.h + path + Mantle/MTLValueTransformer.h + sourceTree + <group> + + E8D5D18DAA535CA6B08AA393 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SVWebViewController-Private.xcconfig + sourceTree + <group> + + E96F46F8A984911D7538CA63 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIImageView+WebCache.h + path + SDWebImage/UIImageView+WebCache.h + sourceTree + <group> + + E9A68AA93E6B24526C1517E5 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SDWebImageOperation.h + path + SDWebImage/SDWebImageOperation.h + sourceTree + <group> + + EA053313AC9B201518E824AF + + buildConfigurationList + 31ED12F5CEA9A23F5663038A + buildPhases + + 73866FD56D89AA5A3F622874 + 06B18C667B34A3836288B3E6 + 9F745963084D8E9E216392E2 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Pods-Mantle + productName + Pods-Mantle + productReference + 0DDB7686E187F3FC19D520AC + productType + com.apple.product-type.library.static + + EA063A5FA969AA2475F21918 + + children + + 94D197FD4192DB667B6E9A51 + 34A0A9B27EF8487D6B85D039 + + isa + PBXGroup + name + Reachability + sourceTree + <group> + + EA98CE819CDC3A1C462DA862 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SDWebImage.xcconfig + sourceTree + <group> + + EAABEB6BACA94FCEFBA11DFD + + fileRef + A8C971E5B6D1D6B34B5C9A1B + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + EB111D63CDEEB43E08195847 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + wrapper.plug-in + name + SVProgressHUD.bundle + path + SVProgressHUD/SVProgressHUD.bundle + sourceTree + <group> + + EB394718051F19102CEA333B + + fileRef + BB46AB577CB11E2DEC496B53 + isa + PBXBuildFile + + EBB725B945B1732ECF3A9006 + + buildActionMask + 2147483647 + files + + C55BDF5794C4C27E7A69A131 + 7F117C1078DB1AD4F3B4FE11 + A2EBB8311F6F713C23AA9103 + DF3027E5A4AB1DC95FB5EA9D + 9F4821AF45F02268E44D0C1D + 9EFF5CE823942564335B0542 + 92D1A0BBD0D2B1EA721B084C + 65D19C9FCE68CD267930EF33 + 662A98C63D4A25AEDD5B5EC8 + 379C4A4E6343D5622A38206E + B0F31E9D675CDD8EF475F4A7 + 4639EC1DFC9BDEE03FCECD28 + 2E82A19ADA9D6FA582DFA1B8 + 6C883654D7A0A3023FD1840D + 5C59B57AC630CD73AB5E2D1E + + isa + PBXHeadersBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + ECDFCA3A35CD6A95747B8E90 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods.debug.xcconfig + sourceTree + <group> + + ECFFA56C6B3F8AC988E09B43 + + fileRef + A19B2B715041A76AD22B7BB7 + isa + PBXBuildFile + + EDA79BFF36ED8CC66472C4B4 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + AFURLResponseSerialization.m + path + AFNetworking/AFURLResponseSerialization.m + sourceTree + <group> + + EDCDF1F1A409A8EF63058261 + + fileRef + FD93687F5220E28F92C0D41E + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + EF04ADF8DBB1227D34EBBEEA + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text + name + Podfile + path + ../Podfile + sourceTree + SOURCE_ROOT + xcLanguageSpecificationIdentifier + xcode.lang.ruby + + EF1605A5BAD020789C0D6DCD + + buildConfigurations + + 24200E9BAE5616D614E3BA14 + 3886D77C2964260BA24AC311 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + F02AEA09DBE0E12AF360F35D + + fileRef + 94D197FD4192DB667B6E9A51 + isa + PBXBuildFile + + F0D0B8FA1F237AF39207A58C + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + Foundation.framework + path + Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/Foundation.framework + sourceTree + DEVELOPER_DIR + + F0DD19AA7C01867C1769DBE1 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + NSArray+MTLManipulationAdditions.h + path + Mantle/NSArray+MTLManipulationAdditions.h + sourceTree + <group> + + F19082954117D5EC4CBF111A + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SDWebImageCompat.h + path + SDWebImage/SDWebImageCompat.h + sourceTree + <group> + + F20B4E0EAAA530D24685A4E2 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.xcconfig + path + Pods-SVProgressHUD-Private.xcconfig + sourceTree + <group> + + F38473E10FE10739CC22000B + + fileRef + 8E7746C93B5A382A8BFB31C8 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + F3B157F0A7C5AE48DEF99006 + + fileRef + 290221507373808ABAA4054B + isa + PBXBuildFile + + F3B7C44428DC09B4933F043E + + buildActionMask + 2147483647 + files + + 531197FDF80BC84527CCAF02 + + isa + PBXFrameworksBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + F3E77A78BED9A830D2670005 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SWUtilityButtonView.m + path + SWTableViewCell/PodFiles/SWUtilityButtonView.m + sourceTree + <group> + + F44EDFC44AEF1BC95DB7FA7D + + fileRef + 15C57B0A0D754AA9967330DF + isa + PBXBuildFile + + F49B17CD5DB7BF511AD95FE0 + + fileRef + FC45931EABC40836F3C02FDB + isa + PBXBuildFile + + F5336FA18F2792224B01F5AD + + fileRef + 971BBE7FBC532FD0C3684E99 + isa + PBXBuildFile + + F5AD41E8F4E3CBFFE9D0A6AD + + buildConfigurationList + 82D7942CFFB4B5F9A8039B0E + buildPhases + + E2D8E0AC81FFF45B5643EB4C + 0E941574580314BABC46EF00 + 59DD36BD9A4D804D5A701ED2 + + buildRules + + dependencies + + isa + PBXNativeTarget + name + Pods-FMDB + productName + Pods-FMDB + productReference + 0398B69338481EC817F6F6EB + productType + com.apple.product-type.library.static + + F5FB40E1554F5686F97998FA + + isa + PBXFileReference + lastKnownFileType + wrapper.framework + name + QuartzCore.framework + path + Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/QuartzCore.framework + sourceTree + DEVELOPER_DIR + + F6CDC7E60CF17930F7262034 + + baseConfigurationReference + F20B4E0EAAA530D24685A4E2 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + F6E91A553C49F4862B78C4F1 + + fileRef + FFF0E1F586F1C9698F168012 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + F7446765000306425A8653CB + + children + + 9AC054684C72878BFD1354BD + 54AF66B17C0AEFF7AE1E5828 + B49FB948DC12B27713617596 + EA063A5FA969AA2475F21918 + 060110539E4022EC7547DC8A + 76F2FB474F9C57ED0AB606BB + E11A8E6E65928AF83EDA8DEF + 071305CB59F3D8E013288619 + + isa + PBXGroup + name + AFNetworking + path + AFNetworking + sourceTree + <group> + + F78D23F252315D98B9BE3FA6 + + fileRef + 7A75EF39F7B6094E98E9D58F + isa + PBXBuildFile + + F8219A50BB91E25BFDDAA0AD + + fileRef + 96B82497505EF98401B50E1D + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + F85DB5D3718ADE63303C06E7 + + children + + 74ED67273EBDF1D93351D598 + F20B4E0EAAA530D24685A4E2 + 3FE2CB4E3BF724BF9DADD804 + 5161C757881F6F6873559967 + + isa + PBXGroup + name + Support Files + path + ../Target Support Files/Pods-SVProgressHUD + sourceTree + <group> + + FA2858642D021A2940D97851 + + fileRef + 63B65631DCD63B55E53DCE03 + isa + PBXBuildFile + + FA9D9250626EDCE049F74048 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + SVModalWebViewController.h + path + SVWebViewController/SVModalWebViewController.h + sourceTree + <group> + + FAFFA27183B7E1544DC2D54D + + buildActionMask + 2147483647 + files + + 3396072C759A0E898549D6E7 + 97959B6C405A6219826BAFBE + DE2CEF2D7F7D4D643900FCE5 + 96E033AF44F3F21FB871FC01 + 730266F29F62BC3EB931952F + 9C079AF4CCEEC69481F2BF10 + + isa + PBXSourcesBuildPhase + runOnlyForDeploymentPostprocessing + 0 + + FB388FD7B6E8D0EC4EFA5D58 + + buildConfigurations + + 47BC372C33FCDDB0603FF870 + A19CDB887CB102ECC06C0723 + + defaultConfigurationIsVisible + 0 + defaultConfigurationName + Release + isa + XCConfigurationList + + FB392C3A7B8813F8724C2732 + + fileRef + 6D6492CFDFC03E3EEED90937 + isa + PBXBuildFile + + FB6C8948A46CF245ECD20949 + + fileRef + 573C8CC99C8641490B222C89 + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + FC45931EABC40836F3C02FDB + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SWLongPressGestureRecognizer.m + path + SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.m + sourceTree + <group> + + FC51B49E4686DFD82E09DE0B + + baseConfigurationReference + E3C180F70C4829EC3E7C8741 + buildSettings + + ALWAYS_SEARCH_USER_PATHS + NO + COPY_PHASE_STRIP + NO + DSTROOT + /tmp/xcodeproj.dst + GCC_DYNAMIC_NO_PIC + NO + GCC_OPTIMIZATION_LEVEL + 0 + GCC_PRECOMPILE_PREFIX_HEADER + YES + GCC_PREFIX_HEADER + Target Support Files/Pods-FMDB/Pods-FMDB-prefix.pch + GCC_PREPROCESSOR_DEFINITIONS + + DEBUG=1 + $(inherited) + + GCC_SYMBOLS_PRIVATE_EXTERN + NO + INSTALL_PATH + $(BUILT_PRODUCTS_DIR) + IPHONEOS_DEPLOYMENT_TARGET + 7.0 + OTHER_LDFLAGS + + OTHER_LIBTOOLFLAGS + + PRODUCT_NAME + $(TARGET_NAME) + PUBLIC_HEADERS_FOLDER_PATH + $(TARGET_NAME) + SDKROOT + iphoneos + SKIP_INSTALL + YES + + isa + XCBuildConfiguration + name + Debug + + FC5FC75F692847F3591B34B3 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + text.script.sh + path + Pods-resources.sh + sourceTree + <group> + + FC77BBB341E0605E8ED130FB + + fileRef + A6D689B150BE62B7DB1AC767 + isa + PBXBuildFile + + FD317A4CDFFEF6932C841E62 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.h + name + UIImage+MultiFormat.h + path + SDWebImage/UIImage+MultiFormat.h + sourceTree + <group> + + FD93687F5220E28F92C0D41E + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + SDWebImageManager.m + path + SDWebImage/SDWebImageManager.m + sourceTree + <group> + + FDAFE1F6255ECC888D7503AB + + fileRef + AADE27D38FBFB33465D0DA5F + isa + PBXBuildFile + settings + + COMPILER_FLAGS + -DOS_OBJECT_USE_OBJC=0 + + + FE4113033936F46AED1AC492 + + fileRef + 217FA4FB15D4EDE83A84233D + isa + PBXBuildFile + + FED8EC57D00423F3832AA2A9 + + fileRef + AF131B236DD5AB2E742ADEF2 + isa + PBXBuildFile + + FFF0E1F586F1C9698F168012 + + includeInIndex + 1 + isa + PBXFileReference + lastKnownFileType + sourcecode.c.objc + name + FMDatabaseQueue.m + path + src/fmdb/FMDatabaseQueue.m + sourceTree + <group> + + + rootObject + 003A31C6AADD74836B88341F + + diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/LICENSE b/iOSStudy/iOSStudy/Pods/SDWebImage/LICENSE new file mode 100644 index 0000000..ae783e1 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2009 Olivier Poitrey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/README.md b/iOSStudy/iOSStudy/Pods/SDWebImage/README.md new file mode 100644 index 0000000..9bbcca5 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/README.md @@ -0,0 +1,280 @@ +Web Image +========= +[![Build Status](http://img.shields.io/travis/rs/SDWebImage/master.svg?style=flat)](https://travis-ci.org/rs/SDWebImage) +[![Pod Version](http://img.shields.io/cocoapods/v/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) +[![Pod Platform](http://img.shields.io/cocoapods/p/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) +[![Pod License](http://img.shields.io/cocoapods/l/SDWebImage.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html) + +This library provides a category for UIImageView with support for remote images coming from the web. + +It provides: + +- An UIImageView category adding web image and cache management to the Cocoa Touch framework +- An asynchronous image downloader +- An asynchronous memory + disk image caching with automatic cache expiration handling +- Animated GIF support +- WebP format support +- A background image decompression +- A guarantee that the same URL won't be downloaded several times +- A guarantee that bogus URLs won't be retried again and again +- A guarantee that main thread will never be blocked +- Performances! +- Use GCD and ARC +- Arm64 support + +NOTE: The version 3.0 of SDWebImage isn't fully backward compatible with 2.0 and requires iOS 5.1.1 +minimum deployement version. If you need iOS < 5.0 support, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). + +[How is SDWebImage better than X?](https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F) + +Who Use It +---------- + +Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. + +How To Use +---------- + +API documentation is available at [http://hackemist.com/SDWebImage/doc/](http://hackemist.com/SDWebImage/doc/) + +### Using UIImageView+WebCache category with UITableView + +Just #import the UIImageView+WebCache.h header, and call the setImageWithURL:placeholderImage: +method from the tableView:cellForRowAtIndexPath: UITableViewDataSource method. Everything will be +handled for you, from async downloads to caching management. + +```objective-c +#import + +... + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *MyIdentifier = @"MyIdentifier"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; + + if (cell == nil) + { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:MyIdentifier] autorelease]; + } + + // Here we use the new provided setImageWithURL: method to load the web image + [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] + placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; + + cell.textLabel.text = @"My Text"; + return cell; +} +``` + +### Using blocks + +With blocks, you can be notified about the image download progress and whenever the image retrival +has completed with success or not: + +```objective-c +// Here we use the new provided setImageWithURL: method to load the web image +[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] + placeholderImage:[UIImage imageNamed:@"placeholder.png"] + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {... completion code here ...}]; +``` + +Note: neither your success nor failure block will be call if your image request is canceled before completion. + +### Using SDWebImageManager + +The SDWebImageManager is the class behind the UIImageView+WebCache category. It ties the +asynchronous downloader with the image cache store. You can use this class directly to benefit +from web image downloading with caching in another context than a UIView (ie: with Cocoa). + +Here is a simple example of how to use SDWebImageManager: + +```objective-c +SDWebImageManager *manager = [SDWebImageManager sharedManager]; +[manager downloadWithURL:imageURL + options:0 + progress:^(NSInteger receivedSize, NSInteger expectedSize) + { + // progression tracking code + } + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) + { + if (image) + { + // do something with image + } + }]; +``` + +### Using Asynchronous Image Downloader Independently + +It's also possible to use the async image downloader independently: + +```objective-c +[SDWebImageDownloader.sharedDownloader downloadImageWithURL:imageURL + options:0 + progress:^(NSInteger receivedSize, NSInteger expectedSize) + { + // progression tracking code + } + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) + { + if (image && finished) + { + // do something with image + } + }]; +``` + +### Using Asynchronous Image Caching Independently + +It is also possible to use the aync based image cache store independently. SDImageCache +maintains a memory cache and an optional disk cache. Disk cache write operations are performed +asynchronous so it doesn't add unnecessary latency to the UI. + +The SDImageCache class provides a singleton instance for convenience but you can create your own +instance if you want to create separated cache namespace. + +To lookup the cache, you use the `queryDiskCacheForKey:done:` method. If the method returns nil, it means the cache +doesn't currently own the image. You are thus responsible for generating and caching it. The cache +key is an application unique identifier for the image to cache. It is generally the absolute URL of +the image. + +```objective-c +SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"]; +[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) +{ + // image is not nil if image was found +}]; +``` + +By default SDImageCache will lookup the disk cache if an image can't be found in the memory cache. +You can prevent this from happening by calling the alternative method `imageFromMemoryCacheForKey:`. + +To store an image into the cache, you use the storeImage:forKey: method: + +```objective-c +[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey]; +``` + +By default, the image will be stored in memory cache as well as on disk cache (asynchronously). If +you want only the memory cache, use the alternative method storeImage:forKey:toDisk: with a negative +third argument. + +### Using cache key filter + +Sometime, you may not want to use the image URL as cache key because part of the URL is dynamic +(i.e.: for access control purpose). SDWebImageManager provides a way to set a cache key filter that +takes the NSURL as input, and output a cache key NSString. + +The following example sets a filter in the application delegate that will remove any query-string from +the URL before to use it as a cache key: + +```objective-c +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + SDWebImageManager.sharedManager.cacheKeyFilter:^(NSURL *url) + { + url = [[[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path] autorelease]; + return [url absoluteString]; + }; + + // Your app init code... + return YES; +} +``` + + +Common Problems +--------------- + +### Using dynamic image size with UITableViewCell + +UITableView determins the size of the image by the first image set for a cell. If your remote images +don't have the same size as your placeholder image, you may experience strange anamorphic scaling issue. +The following article gives a way to workaround this issue: + +[http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/](http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/) + + +### Handle image refresh + +SDWebImage does very aggressive caching by default. It ignores all kind of caching control header returned by the HTTP server and cache the returned images with no time restriction. It implies your images URLs are static URLs pointing to images that never change. If the pointed image happen to change, some parts of the URL should change accordingly. + +If you don't control the image server you're using, you may not be able to change the URL when its content is updated. This is the case for Facebook avatar URLs for instance. In such case, you may use the `SDWebImageRefreshCached` flag. This will slightly degrade the performance but will respect the HTTP caching control headers: + +``` objective-c +[imageView setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"] + placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] + options:SDWebImageRefreshCached]; +``` + +### Add a progress indicator + +See this category: https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage + +Installation +------------ + +There are three ways to use SDWebImage in your project: +- using Cocoapods +- copying all the files into your project +- importing the project as a static library + +### Installation with CocoaPods + +[CocoaPods](http://cocoapods.org/) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries in your projects. See the [Get Started](http://cocoapods.org/#get_started) section for more details. + +#### Podfile +``` +platform :ios, '6.1' +pod 'SDWebImage', '~>3.6' +``` + +### Add the SDWebImage project to your project + +- Download and unzip the last version of the framework from the [download page](https://github.com/rs/SDWebImage/releases) +- Right-click on the project navigator and select "Add Files to "Your Project": +- In the dialog, select SDWebImage.framework: +- Check the "Copy items into destination group's folder (if needed)" checkbox + +### Add dependencies + +- In you application project app’s target settings, find the "Build Phases" section and open the "Link Binary With Libraries" block: +- Click the "+" button again and select the "ImageIO.framework", this is needed by the progressive download feature: + +### Add Linker Flag + +Open the "Build Settings" tab, in the "Linking" section, locate the "Other Linker Flags" setting and add the "-ObjC" flag: + +![Other Linker Flags](http://dl.dropbox.com/u/123346/SDWebImage/10_other_linker_flags.jpg) + +Alternatively, if this causes compilation problems with frameworks that extend optional libraries, such as Parse, RestKit or opencv2, instead of the -ObjC flag use: + +``` +-force_load SDWebImage.framework/Versions/Current/SDWebImage +``` + +### Import headers in your source files + +In the source files where you need to use the library, import the header file: + +```objective-c +#import +``` + +### Build Project + +At this point your workspace should build without error. If you are having problem, post to the Issue and the +community can help you solve it. + +Future Enhancements +------------------- + +- LRU memory cache cleanup instead of reset on memory warning + +## Licenses + +All source code is licensed under the [MIT License](https://raw.github.com/rs/SDWebImage/master/LICENSE). diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h new file mode 100644 index 0000000..69c76dc --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h @@ -0,0 +1,26 @@ +// +// Created by Fabrice Aneche on 06/01/14. +// Copyright (c) 2014 Dailymotion. All rights reserved. +// + +#import + +@interface NSData (ImageContentType) + +/** + * Compute the content type for an image data + * + * @param data the input data + * + * @return the content type as string (i.e. image/jpeg, image/gif) + */ ++ (NSString *)sd_contentTypeForImageData:(NSData *)data; + +@end + + +@interface NSData (ImageContentTypeDeprecated) + ++ (NSString *)contentTypeForImageData:(NSData *)data __deprecated_msg("Use `sd_contentTypeForImageData:`"); + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m new file mode 100644 index 0000000..0941cfa --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m @@ -0,0 +1,49 @@ +// +// Created by Fabrice Aneche on 06/01/14. +// Copyright (c) 2014 Dailymotion. All rights reserved. +// + +#import "NSData+ImageContentType.h" + + +@implementation NSData (ImageContentType) + ++ (NSString *)sd_contentTypeForImageData:(NSData *)data { + uint8_t c; + [data getBytes:&c length:1]; + switch (c) { + case 0xFF: + return @"image/jpeg"; + case 0x89: + return @"image/png"; + case 0x47: + return @"image/gif"; + case 0x49: + case 0x4D: + return @"image/tiff"; + case 0x52: + // R as RIFF for WEBP + if ([data length] < 12) { + return nil; + } + + NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; + if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { + return @"image/webp"; + } + + return nil; + } + return nil; +} + +@end + + +@implementation NSData (ImageContentTypeDeprecated) + ++ (NSString *)contentTypeForImageData:(NSData *)data { + return [self sd_contentTypeForImageData:data]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDImageCache.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDImageCache.h new file mode 100644 index 0000000..bde9d5d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDImageCache.h @@ -0,0 +1,241 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCompat.h" + +typedef NS_ENUM(NSInteger, SDImageCacheType) { + /** + * The image wasn't available the SDWebImage caches, but was downloaded from the web. + */ + SDImageCacheTypeNone, + /** + * The image was obtained from the disk cache. + */ + SDImageCacheTypeDisk, + /** + * The image was obtained from the memory cache. + */ + SDImageCacheTypeMemory +}; + +typedef void(^SDWebImageQueryCompletedBlock)(UIImage *image, SDImageCacheType cacheType); + +typedef void(^SDWebImageCheckCacheCompletionBlock)(BOOL isInCache); + +typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger totalSize); + +/** + * SDImageCache maintains a memory cache and an optional disk cache. Disk cache write operations are performed + * asynchronous so it doesn’t add unnecessary latency to the UI. + */ +@interface SDImageCache : NSObject + +/** + * The maximum "total cost" of the in-memory image cache. The cost function is the number of pixels held in memory. + */ +@property (assign, nonatomic) NSUInteger maxMemoryCost; + +/** + * The maximum length of time to keep an image in the cache, in seconds + */ +@property (assign, nonatomic) NSInteger maxCacheAge; + +/** + * The maximum size of the cache, in bytes. + */ +@property (assign, nonatomic) NSUInteger maxCacheSize; + +/** + * Returns global shared cache instance + * + * @return SDImageCache global instance + */ ++ (SDImageCache *)sharedImageCache; + +/** + * Init a new cache store with a specific namespace + * + * @param ns The namespace to use for this cache store + */ +- (id)initWithNamespace:(NSString *)ns; + +/** + * Add a read-only cache path to search for images pre-cached by SDImageCache + * Useful if you want to bundle pre-loaded images with your app + * + * @param path The path to use for this read-only cache path + */ +- (void)addReadOnlyCachePath:(NSString *)path; + +/** + * Store an image into memory and disk cache at the given key. + * + * @param image The image to store + * @param key The unique image cache key, usually it's image absolute URL + */ +- (void)storeImage:(UIImage *)image forKey:(NSString *)key; + +/** + * Store an image into memory and optionally disk cache at the given key. + * + * @param image The image to store + * @param key The unique image cache key, usually it's image absolute URL + * @param toDisk Store the image to disk cache if YES + */ +- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk; + +/** + * Store an image into memory and optionally disk cache at the given key. + * + * @param image The image to store + * @param recalculate BOOL indicates if imageData can be used or a new data should be constructed from the UIImage + * @param imageData The image data as returned by the server, this representation will be used for disk storage + * instead of converting the given image object into a storable/compressed image format in order + * to save quality and CPU + * @param key The unique image cache key, usually it's image absolute URL + * @param toDisk Store the image to disk cache if YES + */ +- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk; + +/** + * Query the disk cache asynchronously. + * + * @param key The unique key used to store the wanted image + */ +- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock; + +/** + * Query the memory cache synchronously. + * + * @param key The unique key used to store the wanted image + */ +- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key; + +/** + * Query the disk cache synchronously after checking the memory cache. + * + * @param key The unique key used to store the wanted image + */ +- (UIImage *)imageFromDiskCacheForKey:(NSString *)key; + +/** + * Remove the image from memory and disk cache synchronously + * + * @param key The unique image cache key + */ +- (void)removeImageForKey:(NSString *)key; + + +/** + * Remove the image from memory and disk cache synchronously + * + * @param key The unique image cache key + * @param completionBlock An block that should be executed after the image has been removed (optional) + */ +- (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion; + +/** + * Remove the image from memory and optionally disk cache synchronously + * + * @param key The unique image cache key + * @param fromDisk Also remove cache entry from disk if YES + */ +- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk; + +/** + * Remove the image from memory and optionally disk cache synchronously + * + * @param key The unique image cache key + * @param fromDisk Also remove cache entry from disk if YES + * @param completionBlock An block that should be executed after the image has been removed (optional) + */ +- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion; + +/** + * Clear all memory cached images + */ +- (void)clearMemory; + +/** + * Clear all disk cached images. Non-blocking method - returns immediately. + * @param completionBlock An block that should be executed after cache expiration completes (optional) + */ +- (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion; + +/** + * Clear all disk cached images + * @see clearDiskOnCompletion: + */ +- (void)clearDisk; + +/** + * Remove all expired cached image from disk. Non-blocking method - returns immediately. + * @param completionBlock An block that should be executed after cache expiration completes (optional) + */ +- (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock; + +/** + * Remove all expired cached image from disk + * @see cleanDiskWithCompletionBlock: + */ +- (void)cleanDisk; + +/** + * Get the size used by the disk cache + */ +- (NSUInteger)getSize; + +/** + * Get the number of images in the disk cache + */ +- (NSUInteger)getDiskCount; + +/** + * Asynchronously calculate the disk cache's size. + */ +- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock; + +/** + * Async check if image exists in disk cache already (does not load the image) + * + * @param key the key describing the url + * @param completionBlock the block to be executed when the check is done. + * @note the completion block will be always executed on the main queue + */ +- (void)diskImageExistsWithKey:(NSString *)key completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; + +/** + * Check if image exists in disk cache already (does not load the image) + * + * @param key the key describing the url + * + * @return YES if an image exists for the given key + */ +- (BOOL)diskImageExistsWithKey:(NSString *)key; + +/** + * Get the cache path for a certain key (needs the cache path root folder) + * + * @param key the key (can be obtained from url using cacheKeyForURL) + * @param path the cach path root folder + * + * @return the cache path + */ +- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path; + +/** + * Get the default cache path for a certain key + * + * @param key the key (can be obtained from url using cacheKeyForURL) + * + * @return the default cache path + */ +- (NSString *)defaultCachePathForKey:(NSString *)key; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDImageCache.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDImageCache.m new file mode 100644 index 0000000..59c3471 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDImageCache.m @@ -0,0 +1,534 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDImageCache.h" +#import "SDWebImageDecoder.h" +#import "UIImage+MultiFormat.h" +#import + +static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week +// PNG signature bytes and data (below) +static unsigned char kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; +static NSData *kPNGSignatureData = nil; + +BOOL ImageDataHasPNGPreffix(NSData *data); + +BOOL ImageDataHasPNGPreffix(NSData *data) { + NSUInteger pngSignatureLength = [kPNGSignatureData length]; + if ([data length] >= pngSignatureLength) { + if ([[data subdataWithRange:NSMakeRange(0, pngSignatureLength)] isEqualToData:kPNGSignatureData]) { + return YES; + } + } + + return NO; +} + +@interface SDImageCache () + +@property (strong, nonatomic) NSCache *memCache; +@property (strong, nonatomic) NSString *diskCachePath; +@property (strong, nonatomic) NSMutableArray *customPaths; +@property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t ioQueue; + +@end + + +@implementation SDImageCache { + NSFileManager *_fileManager; +} + ++ (SDImageCache *)sharedImageCache { + static dispatch_once_t once; + static id instance; + dispatch_once(&once, ^{ + instance = [self new]; + kPNGSignatureData = [NSData dataWithBytes:kPNGSignatureBytes length:8]; + }); + return instance; +} + +- (id)init { + return [self initWithNamespace:@"default"]; +} + +- (id)initWithNamespace:(NSString *)ns { + if ((self = [super init])) { + NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns]; + + // Create IO serial queue + _ioQueue = dispatch_queue_create("com.hackemist.SDWebImageCache", DISPATCH_QUEUE_SERIAL); + + // Init default values + _maxCacheAge = kDefaultCacheMaxCacheAge; + + // Init the memory cache + _memCache = [[NSCache alloc] init]; + _memCache.name = fullNamespace; + + // Init the disk cache + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); + _diskCachePath = [paths[0] stringByAppendingPathComponent:fullNamespace]; + + dispatch_sync(_ioQueue, ^{ + _fileManager = [NSFileManager new]; + }); + +#if TARGET_OS_IPHONE + // Subscribe to app events + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(clearMemory) + name:UIApplicationDidReceiveMemoryWarningNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(cleanDisk) + name:UIApplicationWillTerminateNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(backgroundCleanDisk) + name:UIApplicationDidEnterBackgroundNotification + object:nil]; +#endif + } + + return self; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + SDDispatchQueueRelease(_ioQueue); +} + +- (void)addReadOnlyCachePath:(NSString *)path { + if (!self.customPaths) { + self.customPaths = [NSMutableArray new]; + } + + if (![self.customPaths containsObject:path]) { + [self.customPaths addObject:path]; + } +} + +- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path { + NSString *filename = [self cachedFileNameForKey:key]; + return [path stringByAppendingPathComponent:filename]; +} + +- (NSString *)defaultCachePathForKey:(NSString *)key { + return [self cachePathForKey:key inPath:self.diskCachePath]; +} + +#pragma mark SDImageCache (private) + +- (NSString *)cachedFileNameForKey:(NSString *)key { + const char *str = [key UTF8String]; + if (str == NULL) { + str = ""; + } + unsigned char r[CC_MD5_DIGEST_LENGTH]; + CC_MD5(str, (CC_LONG)strlen(str), r); + NSString *filename = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], r[11], r[12], r[13], r[14], r[15]]; + + return filename; +} + +#pragma mark ImageCache + +- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk { + if (!image || !key) { + return; + } + + [self.memCache setObject:image forKey:key cost:image.size.height * image.size.width * image.scale]; + + if (toDisk) { + dispatch_async(self.ioQueue, ^{ + NSData *data = imageData; + + if (image && (recalculate || !data)) { +#if TARGET_OS_IPHONE + // We need to determine if the image is a PNG or a JPEG + // PNGs are easier to detect because they have a unique signature (http://www.w3.org/TR/PNG-Structure.html) + // The first eight bytes of a PNG file always contain the following (decimal) values: + // 137 80 78 71 13 10 26 10 + + // We assume the image is PNG, in case the imageData is nil (i.e. if trying to save a UIImage directly), + // we will consider it PNG to avoid loosing the transparency + BOOL imageIsPng = YES; + + // But if we have an image data, we will look at the preffix + if ([imageData length] >= [kPNGSignatureData length]) { + imageIsPng = ImageDataHasPNGPreffix(imageData); + } + + if (imageIsPng) { + data = UIImagePNGRepresentation(image); + } + else { + data = UIImageJPEGRepresentation(image, (CGFloat)1.0); + } +#else + data = [NSBitmapImageRep representationOfImageRepsInArray:image.representations usingType: NSJPEGFileType properties:nil]; +#endif + } + + if (data) { + if (![_fileManager fileExistsAtPath:_diskCachePath]) { + [_fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; + } + + [_fileManager createFileAtPath:[self defaultCachePathForKey:key] contents:data attributes:nil]; + } + }); + } +} + +- (void)storeImage:(UIImage *)image forKey:(NSString *)key { + [self storeImage:image recalculateFromImage:YES imageData:nil forKey:key toDisk:YES]; +} + +- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk { + [self storeImage:image recalculateFromImage:YES imageData:nil forKey:key toDisk:toDisk]; +} + +- (BOOL)diskImageExistsWithKey:(NSString *)key { + BOOL exists = NO; + + // this is an exception to access the filemanager on another queue than ioQueue, but we are using the shared instance + // from apple docs on NSFileManager: The methods of the shared NSFileManager object can be called from multiple threads safely. + exists = [[NSFileManager defaultManager] fileExistsAtPath:[self defaultCachePathForKey:key]]; + + return exists; +} + +- (void)diskImageExistsWithKey:(NSString *)key completion:(SDWebImageCheckCacheCompletionBlock)completionBlock { + dispatch_async(_ioQueue, ^{ + BOOL exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; + if (completionBlock) { + dispatch_async(dispatch_get_main_queue(), ^{ + completionBlock(exists); + }); + } + }); +} + +- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key { + return [self.memCache objectForKey:key]; +} + +- (UIImage *)imageFromDiskCacheForKey:(NSString *)key { + // First check the in-memory cache... + UIImage *image = [self imageFromMemoryCacheForKey:key]; + if (image) { + return image; + } + + // Second check the disk cache... + UIImage *diskImage = [self diskImageForKey:key]; + if (diskImage) { + CGFloat cost = diskImage.size.height * diskImage.size.width * diskImage.scale; + [self.memCache setObject:diskImage forKey:key cost:cost]; + } + + return diskImage; +} + +- (NSData *)diskImageDataBySearchingAllPathsForKey:(NSString *)key { + NSString *defaultPath = [self defaultCachePathForKey:key]; + NSData *data = [NSData dataWithContentsOfFile:defaultPath]; + if (data) { + return data; + } + + for (NSString *path in self.customPaths) { + NSString *filePath = [self cachePathForKey:key inPath:path]; + NSData *imageData = [NSData dataWithContentsOfFile:filePath]; + if (imageData) { + return imageData; + } + } + + return nil; +} + +- (UIImage *)diskImageForKey:(NSString *)key { + NSData *data = [self diskImageDataBySearchingAllPathsForKey:key]; + if (data) { + UIImage *image = [UIImage sd_imageWithData:data]; + image = [self scaledImageForKey:key image:image]; + image = [UIImage decodedImageWithImage:image]; + return image; + } + else { + return nil; + } +} + +- (UIImage *)scaledImageForKey:(NSString *)key image:(UIImage *)image { + return SDScaledImageForKey(key, image); +} + +- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock { + if (!doneBlock) { + return nil; + } + + if (!key) { + doneBlock(nil, SDImageCacheTypeNone); + return nil; + } + + // First check the in-memory cache... + UIImage *image = [self imageFromMemoryCacheForKey:key]; + if (image) { + doneBlock(image, SDImageCacheTypeMemory); + return nil; + } + + NSOperation *operation = [NSOperation new]; + dispatch_async(self.ioQueue, ^{ + if (operation.isCancelled) { + return; + } + + @autoreleasepool { + UIImage *diskImage = [self diskImageForKey:key]; + if (diskImage) { + CGFloat cost = diskImage.size.height * diskImage.size.width * diskImage.scale; + [self.memCache setObject:diskImage forKey:key cost:cost]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + doneBlock(diskImage, SDImageCacheTypeDisk); + }); + } + }); + + return operation; +} + +- (void)removeImageForKey:(NSString *)key { + [self removeImageForKey:key withCompletion:nil]; +} + +- (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion { + [self removeImageForKey:key fromDisk:YES withCompletion:completion]; +} + +- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk { + [self removeImageForKey:key fromDisk:fromDisk withCompletion:nil]; +} + +- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion { + + if (key == nil) { + return; + } + + [self.memCache removeObjectForKey:key]; + + if (fromDisk) { + dispatch_async(self.ioQueue, ^{ + [_fileManager removeItemAtPath:[self defaultCachePathForKey:key] error:nil]; + + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(); + }); + } + }); + } else if (completion){ + completion(); + } + +} + +- (void)setMaxMemoryCost:(NSUInteger)maxMemoryCost { + self.memCache.totalCostLimit = maxMemoryCost; +} + +- (NSUInteger)maxMemoryCost { + return self.memCache.totalCostLimit; +} + +- (void)clearMemory { + [self.memCache removeAllObjects]; +} + +- (void)clearDisk { + [self clearDiskOnCompletion:nil]; +} + +- (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion +{ + dispatch_async(self.ioQueue, ^{ + [_fileManager removeItemAtPath:self.diskCachePath error:nil]; + [_fileManager createDirectoryAtPath:self.diskCachePath + withIntermediateDirectories:YES + attributes:nil + error:NULL]; + + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(); + }); + } + }); +} + +- (void)cleanDisk { + [self cleanDiskWithCompletionBlock:nil]; +} + +- (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock { + dispatch_async(self.ioQueue, ^{ + NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; + NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey]; + + // This enumerator prefetches useful properties for our cache files. + NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtURL:diskCacheURL + includingPropertiesForKeys:resourceKeys + options:NSDirectoryEnumerationSkipsHiddenFiles + errorHandler:NULL]; + + NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:-self.maxCacheAge]; + NSMutableDictionary *cacheFiles = [NSMutableDictionary dictionary]; + NSUInteger currentCacheSize = 0; + + // Enumerate all of the files in the cache directory. This loop has two purposes: + // + // 1. Removing files that are older than the expiration date. + // 2. Storing file attributes for the size-based cleanup pass. + NSMutableArray *urlsToDelete = [[NSMutableArray alloc] init]; + for (NSURL *fileURL in fileEnumerator) { + NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:NULL]; + + // Skip directories. + if ([resourceValues[NSURLIsDirectoryKey] boolValue]) { + continue; + } + + // Remove files that are older than the expiration date; + NSDate *modificationDate = resourceValues[NSURLContentModificationDateKey]; + if ([[modificationDate laterDate:expirationDate] isEqualToDate:expirationDate]) { + [urlsToDelete addObject:fileURL]; + continue; + } + + // Store a reference to this file and account for its total size. + NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; + currentCacheSize += [totalAllocatedSize unsignedIntegerValue]; + [cacheFiles setObject:resourceValues forKey:fileURL]; + } + + for (NSURL *fileURL in urlsToDelete) { + [_fileManager removeItemAtURL:fileURL error:nil]; + } + + // If our remaining disk cache exceeds a configured maximum size, perform a second + // size-based cleanup pass. We delete the oldest files first. + if (self.maxCacheSize > 0 && currentCacheSize > self.maxCacheSize) { + // Target half of our maximum cache size for this cleanup pass. + const NSUInteger desiredCacheSize = self.maxCacheSize / 2; + + // Sort the remaining cache files by their last modification time (oldest first). + NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent + usingComparator:^NSComparisonResult(id obj1, id obj2) { + return [obj1[NSURLContentModificationDateKey] compare:obj2[NSURLContentModificationDateKey]]; + }]; + + // Delete files until we fall below our desired cache size. + for (NSURL *fileURL in sortedFiles) { + if ([_fileManager removeItemAtURL:fileURL error:nil]) { + NSDictionary *resourceValues = cacheFiles[fileURL]; + NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; + currentCacheSize -= [totalAllocatedSize unsignedIntegerValue]; + + if (currentCacheSize < desiredCacheSize) { + break; + } + } + } + } + if (completionBlock) { + dispatch_async(dispatch_get_main_queue(), ^{ + completionBlock(); + }); + } + }); +} + +- (void)backgroundCleanDisk { + UIApplication *application = [UIApplication sharedApplication]; + __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ + // Clean up any unfinished task business by marking where you + // stopped or ending the task outright. + [application endBackgroundTask:bgTask]; + bgTask = UIBackgroundTaskInvalid; + }]; + + // Start the long-running task and return immediately. + [self cleanDiskWithCompletionBlock:^{ + [application endBackgroundTask:bgTask]; + bgTask = UIBackgroundTaskInvalid; + }]; +} + +- (NSUInteger)getSize { + __block NSUInteger size = 0; + dispatch_sync(self.ioQueue, ^{ + NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; + for (NSString *fileName in fileEnumerator) { + NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName]; + NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; + size += [attrs fileSize]; + } + }); + return size; +} + +- (NSUInteger)getDiskCount { + __block NSUInteger count = 0; + dispatch_sync(self.ioQueue, ^{ + NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; + count = [[fileEnumerator allObjects] count]; + }); + return count; +} + +- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock { + NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; + + dispatch_async(self.ioQueue, ^{ + NSUInteger fileCount = 0; + NSUInteger totalSize = 0; + + NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtURL:diskCacheURL + includingPropertiesForKeys:@[NSFileSize] + options:NSDirectoryEnumerationSkipsHiddenFiles + errorHandler:NULL]; + + for (NSURL *fileURL in fileEnumerator) { + NSNumber *fileSize; + [fileURL getResourceValue:&fileSize forKey:NSURLFileSizeKey error:NULL]; + totalSize += [fileSize unsignedIntegerValue]; + fileCount += 1; + } + + if (completionBlock) { + dispatch_async(dispatch_get_main_queue(), ^{ + completionBlock(fileCount, totalSize); + }); + } + }); +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h new file mode 100644 index 0000000..a0555fd --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h @@ -0,0 +1,70 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Jamie Pinkham + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import + +#ifdef __OBJC_GC__ +#error SDWebImage does not support Objective-C Garbage Collection +#endif + +#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 +#error SDWebImage doesn't support Deployement Target version < 5.0 +#endif + +#if !TARGET_OS_IPHONE +#import +#ifndef UIImage +#define UIImage NSImage +#endif +#ifndef UIImageView +#define UIImageView NSImageView +#endif +#else + +#import + +#endif + +#ifndef NS_ENUM +#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type +#endif + +#ifndef NS_OPTIONS +#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type +#endif + +#if OS_OBJECT_USE_OBJC + #undef SDDispatchQueueRelease + #undef SDDispatchQueueSetterSementics + #define SDDispatchQueueRelease(q) + #define SDDispatchQueueSetterSementics strong +#else +#undef SDDispatchQueueRelease +#undef SDDispatchQueueSetterSementics +#define SDDispatchQueueRelease(q) (dispatch_release(q)) +#define SDDispatchQueueSetterSementics assign +#endif + +extern UIImage *SDScaledImageForKey(NSString *key, UIImage *image); + +typedef void(^SDWebImageNoParamsBlock)(); + +#define dispatch_main_sync_safe(block)\ + if ([NSThread isMainThread]) {\ + block();\ + } else {\ + dispatch_sync(dispatch_get_main_queue(), block);\ + } + +#define dispatch_main_async_safe(block)\ + if ([NSThread isMainThread]) {\ + block();\ + } else {\ + dispatch_async(dispatch_get_main_queue(), block);\ + } diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m new file mode 100644 index 0000000..8c7d345 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m @@ -0,0 +1,45 @@ +// +// SDWebImageCompat.m +// SDWebImage +// +// Created by Olivier Poitrey on 11/12/12. +// Copyright (c) 2012 Dailymotion. All rights reserved. +// + +#import "SDWebImageCompat.h" + +#if !__has_feature(objc_arc) +#error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag +#endif + +inline UIImage *SDScaledImageForKey(NSString *key, UIImage *image) { + if (!image) { + return nil; + } + + if ([image.images count] > 0) { + NSMutableArray *scaledImages = [NSMutableArray array]; + + for (UIImage *tempImage in image.images) { + [scaledImages addObject:SDScaledImageForKey(key, tempImage)]; + } + + return [UIImage animatedImageWithImages:scaledImages duration:image.duration]; + } + else { + if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { + CGFloat scale = 1.0; + if (key.length >= 8) { + // Search @2x. at the end of the string, before a 3 to 4 extension length (only if key len is 8 or more @2x. + 4 len ext) + NSRange range = [key rangeOfString:@"@2x." options:0 range:NSMakeRange(key.length - 8, 5)]; + if (range.location != NSNotFound) { + scale = 2.0; + } + } + + UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation]; + image = scaledImage; + } + return image; + } +} diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h new file mode 100644 index 0000000..0176a7b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h @@ -0,0 +1,18 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * Created by james on 9/28/11. + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCompat.h" + +@interface UIImage (ForceDecode) + ++ (UIImage *)decodedImageWithImage:(UIImage *)image; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m new file mode 100644 index 0000000..79ddb30 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m @@ -0,0 +1,72 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * Created by james on 9/28/11. + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageDecoder.h" + +@implementation UIImage (ForceDecode) + ++ (UIImage *)decodedImageWithImage:(UIImage *)image { + if (image.images) { + // Do not decode animated images + return image; + } + + CGImageRef imageRef = image.CGImage; + CGSize imageSize = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)); + CGRect imageRect = (CGRect){.origin = CGPointZero, .size = imageSize}; + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); + + int infoMask = (bitmapInfo & kCGBitmapAlphaInfoMask); + BOOL anyNonAlpha = (infoMask == kCGImageAlphaNone || + infoMask == kCGImageAlphaNoneSkipFirst || + infoMask == kCGImageAlphaNoneSkipLast); + + // CGBitmapContextCreate doesn't support kCGImageAlphaNone with RGB. + // https://developer.apple.com/library/mac/#qa/qa1037/_index.html + if (infoMask == kCGImageAlphaNone && CGColorSpaceGetNumberOfComponents(colorSpace) > 1) { + // Unset the old alpha info. + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + + // Set noneSkipFirst. + bitmapInfo |= kCGImageAlphaNoneSkipFirst; + } + // Some PNGs tell us they have alpha but only 3 components. Odd. + else if (!anyNonAlpha && CGColorSpaceGetNumberOfComponents(colorSpace) == 3) { + // Unset the old alpha info. + bitmapInfo &= ~kCGBitmapAlphaInfoMask; + bitmapInfo |= kCGImageAlphaPremultipliedFirst; + } + + // It calculates the bytes-per-row based on the bitsPerComponent and width arguments. + CGContextRef context = CGBitmapContextCreate(NULL, + imageSize.width, + imageSize.height, + CGImageGetBitsPerComponent(imageRef), + 0, + colorSpace, + bitmapInfo); + CGColorSpaceRelease(colorSpace); + + // If failed, return undecompressed image + if (!context) return image; + + CGContextDrawImage(context, imageRect, imageRef); + CGImageRef decompressedImageRef = CGBitmapContextCreateImage(context); + + CGContextRelease(context); + + UIImage *decompressedImage = [UIImage imageWithCGImage:decompressedImageRef scale:image.scale orientation:image.imageOrientation]; + CGImageRelease(decompressedImageRef); + return decompressedImage; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h new file mode 100644 index 0000000..008231a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h @@ -0,0 +1,173 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCompat.h" +#import "SDWebImageOperation.h" + +typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { + SDWebImageDownloaderLowPriority = 1 << 0, + SDWebImageDownloaderProgressiveDownload = 1 << 1, + + /** + * By default, request prevent the of NSURLCache. With this flag, NSURLCache + * is used with default policies. + */ + SDWebImageDownloaderUseNSURLCache = 1 << 2, + + /** + * Call completion block with nil image/imageData if the image was read from NSURLCache + * (to be combined with `SDWebImageDownloaderUseNSURLCache`). + */ + + SDWebImageDownloaderIgnoreCachedResponse = 1 << 3, + /** + * In iOS 4+, continue the download of the image if the app goes to background. This is achieved by asking the system for + * extra time in background to let the request finish. If the background task expires the operation will be cancelled. + */ + + SDWebImageDownloaderContinueInBackground = 1 << 4, + + /** + * Handles cookies stored in NSHTTPCookieStore by setting + * NSMutableURLRequest.HTTPShouldHandleCookies = YES; + */ + SDWebImageDownloaderHandleCookies = 1 << 5, + + /** + * Enable to allow untrusted SSL ceriticates. + * Useful for testing purposes. Use with caution in production. + */ + SDWebImageDownloaderAllowInvalidSSLCertificates = 1 << 6, + + /** + * Put the image in the high priority queue. + */ + SDWebImageDownloaderHighPriority = 1 << 7, + + +}; + +typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { + /** + * Default value. All download operations will execute in queue style (first-in-first-out). + */ + SDWebImageDownloaderFIFOExecutionOrder, + + /** + * All download operations will execute in stack style (last-in-first-out). + */ + SDWebImageDownloaderLIFOExecutionOrder +}; + +extern NSString *const SDWebImageDownloadStartNotification; +extern NSString *const SDWebImageDownloadStopNotification; + +typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize); + +typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage *image, NSData *data, NSError *error, BOOL finished); + +typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDictionary *headers); + +/** + * Asynchronous downloader dedicated and optimized for image loading. + */ +@interface SDWebImageDownloader : NSObject + +@property (assign, nonatomic) NSInteger maxConcurrentDownloads; + +/** + * Shows the current amount of downloads that still need to be downloaded + */ + +@property (readonly, nonatomic) NSUInteger currentDownloadCount; + + +/** + * The timeout value (in seconds) for the download operation. Default: 15.0. + */ +@property (assign, nonatomic) NSTimeInterval downloadTimeout; + + +/** + * Changes download operations execution order. Default value is `SDWebImageDownloaderFIFOExecutionOrder`. + */ +@property (assign, nonatomic) SDWebImageDownloaderExecutionOrder executionOrder; + +/** + * Singleton method, returns the shared instance + * + * @return global shared instance of downloader class + */ ++ (SDWebImageDownloader *)sharedDownloader; + +/** + * Set username + */ +@property (strong, nonatomic) NSString *username; + +/** + * Set password + */ +@property (strong, nonatomic) NSString *password; + +/** + * Set filter to pick headers for downloading image HTTP request. + * + * This block will be invoked for each downloading image request, returned + * NSDictionary will be used as headers in corresponding HTTP request. + */ +@property (nonatomic, copy) SDWebImageDownloaderHeadersFilterBlock headersFilter; + +/** + * Set a value for a HTTP header to be appended to each download HTTP request. + * + * @param value The value for the header field. Use `nil` value to remove the header. + * @param field The name of the header field to set. + */ +- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field; + +/** + * Returns the value of the specified HTTP header field. + * + * @return The value associated with the header field field, or `nil` if there is no corresponding header field. + */ +- (NSString *)valueForHTTPHeaderField:(NSString *)field; + +/** + * Creates a SDWebImageDownloader async downloader instance with a given URL + * + * The delegate will be informed when the image is finish downloaded or an error has happen. + * + * @see SDWebImageDownloaderDelegate + * + * @param url The URL to the image to download + * @param options The options to be used for this download + * @param progressBlock A block called repeatedly while the image is downloading + * @param completedBlock A block called once the download is completed. + * If the download succeeded, the image parameter is set, in case of error, + * error parameter is set with the error. The last parameter is always YES + * if SDWebImageDownloaderProgressiveDownload isn't use. With the + * SDWebImageDownloaderProgressiveDownload option, this block is called + * repeatedly with the partial image object and the finished argument set to NO + * before to be called a last time with the full image and finished argument + * set to YES. In case of error, the finished argument is always YES. + * + * @return A cancellable SDWebImageOperation + */ +- (id )downloadImageWithURL:(NSURL *)url + options:(SDWebImageDownloaderOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageDownloaderCompletedBlock)completedBlock; + +/** + * Sets the download queue suspension state + */ +- (void)setSuspended:(BOOL)suspended; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m new file mode 100644 index 0000000..60914db --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m @@ -0,0 +1,225 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageDownloader.h" +#import "SDWebImageDownloaderOperation.h" +#import + +NSString *const SDWebImageDownloadStartNotification = @"SDWebImageDownloadStartNotification"; +NSString *const SDWebImageDownloadStopNotification = @"SDWebImageDownloadStopNotification"; + +static NSString *const kProgressCallbackKey = @"progress"; +static NSString *const kCompletedCallbackKey = @"completed"; + +@interface SDWebImageDownloader () + +@property (strong, nonatomic) NSOperationQueue *downloadQueue; +@property (weak, nonatomic) NSOperation *lastAddedOperation; +@property (strong, nonatomic) NSMutableDictionary *URLCallbacks; +@property (strong, nonatomic) NSMutableDictionary *HTTPHeaders; +// This queue is used to serialize the handling of the network responses of all the download operation in a single queue +@property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t barrierQueue; + +@end + +@implementation SDWebImageDownloader + ++ (void)initialize { + // Bind SDNetworkActivityIndicator if available (download it here: http://github.com/rs/SDNetworkActivityIndicator ) + // To use it, just add #import "SDNetworkActivityIndicator.h" in addition to the SDWebImage import + if (NSClassFromString(@"SDNetworkActivityIndicator")) { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + id activityIndicator = [NSClassFromString(@"SDNetworkActivityIndicator") performSelector:NSSelectorFromString(@"sharedActivityIndicator")]; +#pragma clang diagnostic pop + + // Remove observer in case it was previously added. + [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStartNotification object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStopNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:activityIndicator + selector:NSSelectorFromString(@"startActivity") + name:SDWebImageDownloadStartNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:activityIndicator + selector:NSSelectorFromString(@"stopActivity") + name:SDWebImageDownloadStopNotification object:nil]; + } +} + ++ (SDWebImageDownloader *)sharedDownloader { + static dispatch_once_t once; + static id instance; + dispatch_once(&once, ^{ + instance = [self new]; + }); + return instance; +} + +- (id)init { + if ((self = [super init])) { + _executionOrder = SDWebImageDownloaderFIFOExecutionOrder; + _downloadQueue = [NSOperationQueue new]; + _downloadQueue.maxConcurrentOperationCount = 2; + _URLCallbacks = [NSMutableDictionary new]; + _HTTPHeaders = [NSMutableDictionary dictionaryWithObject:@"image/webp,image/*;q=0.8" forKey:@"Accept"]; + _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue", DISPATCH_QUEUE_CONCURRENT); + _downloadTimeout = 15.0; + } + return self; +} + +- (void)dealloc { + [self.downloadQueue cancelAllOperations]; + SDDispatchQueueRelease(_barrierQueue); +} + +- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field { + if (value) { + self.HTTPHeaders[field] = value; + } + else { + [self.HTTPHeaders removeObjectForKey:field]; + } +} + +- (NSString *)valueForHTTPHeaderField:(NSString *)field { + return self.HTTPHeaders[field]; +} + +- (void)setMaxConcurrentDownloads:(NSInteger)maxConcurrentDownloads { + _downloadQueue.maxConcurrentOperationCount = maxConcurrentDownloads; +} + +- (NSUInteger)currentDownloadCount { + return _downloadQueue.operationCount; +} + +- (NSInteger)maxConcurrentDownloads { + return _downloadQueue.maxConcurrentOperationCount; +} + +- (id )downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock { + __block SDWebImageDownloaderOperation *operation; + __weak SDWebImageDownloader *wself = self; + + [self addProgressCallback:progressBlock andCompletedBlock:completedBlock forURL:url createCallback:^{ + NSTimeInterval timeoutInterval = wself.downloadTimeout; + if (timeoutInterval == 0.0) { + timeoutInterval = 15.0; + } + + // In order to prevent from potential duplicate caching (NSURLCache + SDImageCache) we disable the cache for image requests if told otherwise + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:(options & SDWebImageDownloaderUseNSURLCache ? NSURLRequestUseProtocolCachePolicy : NSURLRequestReloadIgnoringLocalCacheData) timeoutInterval:timeoutInterval]; + request.HTTPShouldHandleCookies = (options & SDWebImageDownloaderHandleCookies); + request.HTTPShouldUsePipelining = YES; + if (wself.headersFilter) { + request.allHTTPHeaderFields = wself.headersFilter(url, [wself.HTTPHeaders copy]); + } + else { + request.allHTTPHeaderFields = wself.HTTPHeaders; + } + operation = [[SDWebImageDownloaderOperation alloc] initWithRequest:request + options:options + progress:^(NSInteger receivedSize, NSInteger expectedSize) { + SDWebImageDownloader *sself = wself; + if (!sself) return; + NSArray *callbacksForURL = [sself callbacksForURL:url]; + for (NSDictionary *callbacks in callbacksForURL) { + SDWebImageDownloaderProgressBlock callback = callbacks[kProgressCallbackKey]; + if (callback) callback(receivedSize, expectedSize); + } + } + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { + SDWebImageDownloader *sself = wself; + if (!sself) return; + NSArray *callbacksForURL = [sself callbacksForURL:url]; + if (finished) { + [sself removeCallbacksForURL:url]; + } + for (NSDictionary *callbacks in callbacksForURL) { + SDWebImageDownloaderCompletedBlock callback = callbacks[kCompletedCallbackKey]; + if (callback) callback(image, data, error, finished); + } + } + cancelled:^{ + SDWebImageDownloader *sself = wself; + if (!sself) return; + [sself removeCallbacksForURL:url]; + }]; + + if (wself.username && wself.password) { + operation.credential = [NSURLCredential credentialWithUser:wself.username password:wself.password persistence:NSURLCredentialPersistenceForSession]; + } + + if (options & SDWebImageDownloaderHighPriority) { + operation.queuePriority = NSOperationQueuePriorityHigh; + } else if (options & SDWebImageDownloaderLowPriority) { + operation.queuePriority = NSOperationQueuePriorityLow; + } + + [wself.downloadQueue addOperation:operation]; + if (wself.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) { + // Emulate LIFO execution order by systematically adding new operations as last operation's dependency + [wself.lastAddedOperation addDependency:operation]; + wself.lastAddedOperation = operation; + } + }]; + + return operation; +} + +- (void)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock andCompletedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageNoParamsBlock)createCallback { + // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data. + if (url == nil) { + if (completedBlock != nil) { + completedBlock(nil, nil, nil, NO); + } + return; + } + + dispatch_barrier_sync(self.barrierQueue, ^{ + BOOL first = NO; + if (!self.URLCallbacks[url]) { + self.URLCallbacks[url] = [NSMutableArray new]; + first = YES; + } + + // Handle single download of simultaneous download request for the same URL + NSMutableArray *callbacksForURL = self.URLCallbacks[url]; + NSMutableDictionary *callbacks = [NSMutableDictionary new]; + if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; + if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; + [callbacksForURL addObject:callbacks]; + self.URLCallbacks[url] = callbacksForURL; + + if (first) { + createCallback(); + } + }); +} + +- (NSArray *)callbacksForURL:(NSURL *)url { + __block NSArray *callbacksForURL; + dispatch_sync(self.barrierQueue, ^{ + callbacksForURL = self.URLCallbacks[url]; + }); + return [callbacksForURL copy]; +} + +- (void)removeCallbacksForURL:(NSURL *)url { + dispatch_barrier_async(self.barrierQueue, ^{ + [self.URLCallbacks removeObjectForKey:url]; + }); +} + +- (void)setSuspended:(BOOL)suspended { + [self.downloadQueue setSuspended:suspended]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h new file mode 100644 index 0000000..21a3106 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h @@ -0,0 +1,60 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageDownloader.h" +#import "SDWebImageOperation.h" + +@interface SDWebImageDownloaderOperation : NSOperation + +/** + * The request used by the operation's connection. + */ +@property (strong, nonatomic, readonly) NSURLRequest *request; + +/** + * Whether the URL connection should consult the credential storage for authenticating the connection. `YES` by default. + * + * This is the value that is returned in the `NSURLConnectionDelegate` method `-connectionShouldUseCredentialStorage:`. + */ +@property (nonatomic, assign) BOOL shouldUseCredentialStorage; + +/** + * The credential used for authentication challenges in `-connection:didReceiveAuthenticationChallenge:`. + * + * This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. + */ +@property (nonatomic, strong) NSURLCredential *credential; + +/** + * The SDWebImageDownloaderOptions for the receiver. + */ +@property (assign, nonatomic, readonly) SDWebImageDownloaderOptions options; + +/** + * Initializes a `SDWebImageDownloaderOperation` object + * + * @see SDWebImageDownloaderOperation + * + * @param request the URL request + * @param options downloader options + * @param progressBlock the block executed when a new chunk of data arrives. + * @note the progress block is executed on a background queue + * @param completedBlock the block executed when the download is done. + * @note the completed block is executed on the main queue for success. If errors are found, there is a chance the block will be executed on a background queue + * @param cancelBlock the block executed if the download (operation) is cancelled + * + * @return the initialized instance + */ +- (id)initWithRequest:(NSURLRequest *)request + options:(SDWebImageDownloaderOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageDownloaderCompletedBlock)completedBlock + cancelled:(SDWebImageNoParamsBlock)cancelBlock; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m new file mode 100644 index 0000000..333e316 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m @@ -0,0 +1,414 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageDownloaderOperation.h" +#import "SDWebImageDecoder.h" +#import "UIImage+MultiFormat.h" +#import +#import "SDWebImageManager.h" + +@interface SDWebImageDownloaderOperation () + +@property (copy, nonatomic) SDWebImageDownloaderProgressBlock progressBlock; +@property (copy, nonatomic) SDWebImageDownloaderCompletedBlock completedBlock; +@property (copy, nonatomic) SDWebImageNoParamsBlock cancelBlock; + +@property (assign, nonatomic, getter = isExecuting) BOOL executing; +@property (assign, nonatomic, getter = isFinished) BOOL finished; +@property (assign, nonatomic) NSInteger expectedSize; +@property (strong, nonatomic) NSMutableData *imageData; +@property (strong, nonatomic) NSURLConnection *connection; +@property (strong, atomic) NSThread *thread; + +#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 +@property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId; +#endif + +@end + +@implementation SDWebImageDownloaderOperation { + size_t width, height; + UIImageOrientation orientation; + BOOL responseFromCached; +} + +@synthesize executing = _executing; +@synthesize finished = _finished; + +- (id)initWithRequest:(NSURLRequest *)request + options:(SDWebImageDownloaderOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageDownloaderCompletedBlock)completedBlock + cancelled:(SDWebImageNoParamsBlock)cancelBlock { + if ((self = [super init])) { + _request = request; + _shouldUseCredentialStorage = YES; + _options = options; + _progressBlock = [progressBlock copy]; + _completedBlock = [completedBlock copy]; + _cancelBlock = [cancelBlock copy]; + _executing = NO; + _finished = NO; + _expectedSize = 0; + responseFromCached = YES; // Initially wrong until `connection:willCacheResponse:` is called or not called + } + return self; +} + +- (void)start { + @synchronized (self) { + if (self.isCancelled) { + self.finished = YES; + [self reset]; + return; + } + +#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 + if ([self shouldContinueWhenAppEntersBackground]) { + __weak __typeof__ (self) wself = self; + self.backgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ + __strong __typeof (wself) sself = wself; + + if (sself) { + [sself cancel]; + + [[UIApplication sharedApplication] endBackgroundTask:sself.backgroundTaskId]; + sself.backgroundTaskId = UIBackgroundTaskInvalid; + } + }]; + } +#endif + + self.executing = YES; + self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO]; + self.thread = [NSThread currentThread]; + } + + [self.connection start]; + + if (self.connection) { + if (self.progressBlock) { + self.progressBlock(0, NSURLResponseUnknownLength); + } + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:self]; + + if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_5_1) { + // Make sure to run the runloop in our background thread so it can process downloaded data + // Note: we use a timeout to work around an issue with NSURLConnection cancel under iOS 5 + // not waking up the runloop, leading to dead threads (see https://github.com/rs/SDWebImage/issues/466) + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, false); + } + else { + CFRunLoopRun(); + } + + if (!self.isFinished) { + [self.connection cancel]; + [self connection:self.connection didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorTimedOut userInfo:@{NSURLErrorFailingURLErrorKey : self.request.URL}]]; + } + } + else { + if (self.completedBlock) { + self.completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}], YES); + } + } + +#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 + if (self.backgroundTaskId != UIBackgroundTaskInvalid) { + [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskId]; + self.backgroundTaskId = UIBackgroundTaskInvalid; + } +#endif +} + +- (void)cancel { + @synchronized (self) { + if (self.thread) { + [self performSelector:@selector(cancelInternalAndStop) onThread:self.thread withObject:nil waitUntilDone:NO]; + } + else { + [self cancelInternal]; + } + } +} + +- (void)cancelInternalAndStop { + if (self.isFinished) return; + [self cancelInternal]; + CFRunLoopStop(CFRunLoopGetCurrent()); +} + +- (void)cancelInternal { + if (self.isFinished) return; + [super cancel]; + if (self.cancelBlock) self.cancelBlock(); + + if (self.connection) { + [self.connection cancel]; + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; + + // As we cancelled the connection, its callback won't be called and thus won't + // maintain the isFinished and isExecuting flags. + if (self.isExecuting) self.executing = NO; + if (!self.isFinished) self.finished = YES; + } + + [self reset]; +} + +- (void)done { + self.finished = YES; + self.executing = NO; + [self reset]; +} + +- (void)reset { + self.cancelBlock = nil; + self.completedBlock = nil; + self.progressBlock = nil; + self.connection = nil; + self.imageData = nil; + self.thread = nil; +} + +- (void)setFinished:(BOOL)finished { + [self willChangeValueForKey:@"isFinished"]; + _finished = finished; + [self didChangeValueForKey:@"isFinished"]; +} + +- (void)setExecuting:(BOOL)executing { + [self willChangeValueForKey:@"isExecuting"]; + _executing = executing; + [self didChangeValueForKey:@"isExecuting"]; +} + +- (BOOL)isConcurrent { + return YES; +} + +#pragma mark NSURLConnection (delegate) + +- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { + if (![response respondsToSelector:@selector(statusCode)] || [((NSHTTPURLResponse *)response) statusCode] < 400) { + NSInteger expected = response.expectedContentLength > 0 ? (NSInteger)response.expectedContentLength : 0; + self.expectedSize = expected; + if (self.progressBlock) { + self.progressBlock(0, expected); + } + + self.imageData = [[NSMutableData alloc] initWithCapacity:expected]; + } + else { + [self.connection cancel]; + + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:nil]; + + if (self.completedBlock) { + self.completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:[((NSHTTPURLResponse *)response) statusCode] userInfo:nil], YES); + } + CFRunLoopStop(CFRunLoopGetCurrent()); + [self done]; + } +} + +- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { + [self.imageData appendData:data]; + + if ((self.options & SDWebImageDownloaderProgressiveDownload) && self.expectedSize > 0 && self.completedBlock) { + // The following code is from http://www.cocoaintheshell.com/2011/05/progressive-images-download-imageio/ + // Thanks to the author @Nyx0uf + + // Get the total bytes downloaded + const NSInteger totalSize = self.imageData.length; + + // Update the data source, we must pass ALL the data, not just the new bytes + CGImageSourceRef imageSource = CGImageSourceCreateIncremental(NULL); + CGImageSourceUpdateData(imageSource, (__bridge CFDataRef)self.imageData, totalSize == self.expectedSize); + + if (width + height == 0) { + CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL); + if (properties) { + NSInteger orientationValue = -1; + CFTypeRef val = CFDictionaryGetValue(properties, kCGImagePropertyPixelHeight); + if (val) CFNumberGetValue(val, kCFNumberLongType, &height); + val = CFDictionaryGetValue(properties, kCGImagePropertyPixelWidth); + if (val) CFNumberGetValue(val, kCFNumberLongType, &width); + val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation); + if (val) CFNumberGetValue(val, kCFNumberNSIntegerType, &orientationValue); + CFRelease(properties); + + // When we draw to Core Graphics, we lose orientation information, + // which means the image below born of initWithCGIImage will be + // oriented incorrectly sometimes. (Unlike the image born of initWithData + // in connectionDidFinishLoading.) So save it here and pass it on later. + orientation = [[self class] orientationFromPropertyValue:(orientationValue == -1 ? 1 : orientationValue)]; + } + + } + + if (width + height > 0 && totalSize < self.expectedSize) { + // Create the image + CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); + +#ifdef TARGET_OS_IPHONE + // Workaround for iOS anamorphic image + if (partialImageRef) { + const size_t partialHeight = CGImageGetHeight(partialImageRef); + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef bmContext = CGBitmapContextCreate(NULL, width, height, 8, width * 4, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst); + CGColorSpaceRelease(colorSpace); + if (bmContext) { + CGContextDrawImage(bmContext, (CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = width, .size.height = partialHeight}, partialImageRef); + CGImageRelease(partialImageRef); + partialImageRef = CGBitmapContextCreateImage(bmContext); + CGContextRelease(bmContext); + } + else { + CGImageRelease(partialImageRef); + partialImageRef = nil; + } + } +#endif + + if (partialImageRef) { + UIImage *image = [UIImage imageWithCGImage:partialImageRef scale:1 orientation:orientation]; + NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; + UIImage *scaledImage = [self scaledImageForKey:key image:image]; + image = [UIImage decodedImageWithImage:scaledImage]; + CGImageRelease(partialImageRef); + dispatch_main_sync_safe(^{ + if (self.completedBlock) { + self.completedBlock(image, nil, nil, NO); + } + }); + } + } + + CFRelease(imageSource); + } + + if (self.progressBlock) { + self.progressBlock(self.imageData.length, self.expectedSize); + } +} + ++ (UIImageOrientation)orientationFromPropertyValue:(NSInteger)value { + switch (value) { + case 1: + return UIImageOrientationUp; + case 3: + return UIImageOrientationDown; + case 8: + return UIImageOrientationLeft; + case 6: + return UIImageOrientationRight; + case 2: + return UIImageOrientationUpMirrored; + case 4: + return UIImageOrientationDownMirrored; + case 5: + return UIImageOrientationLeftMirrored; + case 7: + return UIImageOrientationRightMirrored; + default: + return UIImageOrientationUp; + } +} + +- (UIImage *)scaledImageForKey:(NSString *)key image:(UIImage *)image { + return SDScaledImageForKey(key, image); +} + +- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection { + SDWebImageDownloaderCompletedBlock completionBlock = self.completedBlock; + @synchronized(self) { + CFRunLoopStop(CFRunLoopGetCurrent()); + self.thread = nil; + self.connection = nil; + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:nil]; + } + + if (![[NSURLCache sharedURLCache] cachedResponseForRequest:_request]) { + responseFromCached = NO; + } + + if (completionBlock) + { + if (self.options & SDWebImageDownloaderIgnoreCachedResponse && responseFromCached) { + completionBlock(nil, nil, nil, YES); + } + else { + UIImage *image = [UIImage sd_imageWithData:self.imageData]; + NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; + image = [self scaledImageForKey:key image:image]; + + // Do not force decoding animated GIFs + if (!image.images) { + image = [UIImage decodedImageWithImage:image]; + } + if (CGSizeEqualToSize(image.size, CGSizeZero)) { + completionBlock(nil, nil, [NSError errorWithDomain:@"SDWebImageErrorDomain" code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}], YES); + } + else { + completionBlock(image, self.imageData, nil, YES); + } + } + } + self.completionBlock = nil; + [self done]; +} + +- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { + CFRunLoopStop(CFRunLoopGetCurrent()); + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:nil]; + + if (self.completedBlock) { + self.completedBlock(nil, nil, error, YES); + } + + [self done]; +} + +- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { + responseFromCached = NO; // If this method is called, it means the response wasn't read from cache + if (self.request.cachePolicy == NSURLRequestReloadIgnoringLocalCacheData) { + // Prevents caching of responses + return nil; + } + else { + return cachedResponse; + } +} + +- (BOOL)shouldContinueWhenAppEntersBackground { + return self.options & SDWebImageDownloaderContinueInBackground; +} + +- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection __unused *)connection { + return self.shouldUseCredentialStorage; +} + +- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{ + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; + } else { + if ([challenge previousFailureCount] == 0) { + if (self.credential) { + [[challenge sender] useCredential:self.credential forAuthenticationChallenge:challenge]; + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } else { + [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; + } + } +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageManager.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageManager.h new file mode 100644 index 0000000..6bb0dcf --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageManager.h @@ -0,0 +1,285 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" +#import "SDWebImageOperation.h" +#import "SDWebImageDownloader.h" +#import "SDImageCache.h" + +typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { + /** + * By default, when a URL fail to be downloaded, the URL is blacklisted so the library won't keep trying. + * This flag disable this blacklisting. + */ + SDWebImageRetryFailed = 1 << 0, + + /** + * By default, image downloads are started during UI interactions, this flags disable this feature, + * leading to delayed download on UIScrollView deceleration for instance. + */ + SDWebImageLowPriority = 1 << 1, + + /** + * This flag disables on-disk caching + */ + SDWebImageCacheMemoryOnly = 1 << 2, + + /** + * This flag enables progressive download, the image is displayed progressively during download as a browser would do. + * By default, the image is only displayed once completely downloaded. + */ + SDWebImageProgressiveDownload = 1 << 3, + + /** + * Even if the image is cached, respect the HTTP response cache control, and refresh the image from remote location if needed. + * The disk caching will be handled by NSURLCache instead of SDWebImage leading to slight performance degradation. + * This option helps deal with images changing behind the same request URL, e.g. Facebook graph api profile pics. + * If a cached image is refreshed, the completion block is called once with the cached image and again with the final image. + * + * Use this flag only if you can't make your URLs static with embeded cache busting parameter. + */ + SDWebImageRefreshCached = 1 << 4, + + /** + * In iOS 4+, continue the download of the image if the app goes to background. This is achieved by asking the system for + * extra time in background to let the request finish. If the background task expires the operation will be cancelled. + */ + SDWebImageContinueInBackground = 1 << 5, + + /** + * Handles cookies stored in NSHTTPCookieStore by setting + * NSMutableURLRequest.HTTPShouldHandleCookies = YES; + */ + SDWebImageHandleCookies = 1 << 6, + + /** + * Enable to allow untrusted SSL ceriticates. + * Useful for testing purposes. Use with caution in production. + */ + SDWebImageAllowInvalidSSLCertificates = 1 << 7, + + /** + * By default, image are loaded in the order they were queued. This flag move them to + * the front of the queue and is loaded immediately instead of waiting for the current queue to be loaded (which + * could take a while). + */ + SDWebImageHighPriority = 1 << 8, + + /** + * By default, placeholder images are loaded while the image is loading. This flag will delay the loading + * of the placeholder image until after the image has finished loading. + */ + SDWebImageDelayPlaceholder = 1 << 9 +}; + +typedef void(^SDWebImageCompletionBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL); + +typedef void(^SDWebImageCompletionWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL); + +typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); + + +@class SDWebImageManager; + +@protocol SDWebImageManagerDelegate + +@optional + +/** + * Controls which image should be downloaded when the image is not found in the cache. + * + * @param imageManager The current `SDWebImageManager` + * @param imageURL The url of the image to be downloaded + * + * @return Return NO to prevent the downloading of the image on cache misses. If not implemented, YES is implied. + */ +- (BOOL)imageManager:(SDWebImageManager *)imageManager shouldDownloadImageForURL:(NSURL *)imageURL; + +/** + * Allows to transform the image immediately after it has been downloaded and just before to cache it on disk and memory. + * NOTE: This method is called from a global queue in order to not to block the main thread. + * + * @param imageManager The current `SDWebImageManager` + * @param image The image to transform + * @param imageURL The url of the image to transform + * + * @return The transformed image object. + */ +- (UIImage *)imageManager:(SDWebImageManager *)imageManager transformDownloadedImage:(UIImage *)image withURL:(NSURL *)imageURL; + +@end + +/** + * The SDWebImageManager is the class behind the UIImageView+WebCache category and likes. + * It ties the asynchronous downloader (SDWebImageDownloader) with the image cache store (SDImageCache). + * You can use this class directly to benefit from web image downloading with caching in another context than + * a UIView. + * + * Here is a simple example of how to use SDWebImageManager: + * + * @code + +SDWebImageManager *manager = [SDWebImageManager sharedManager]; +[manager downloadWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (image) { + // do something with image + } + }]; + + * @endcode + */ +@interface SDWebImageManager : NSObject + +@property (weak, nonatomic) id delegate; + +@property (strong, nonatomic, readonly) SDImageCache *imageCache; +@property (strong, nonatomic, readonly) SDWebImageDownloader *imageDownloader; + +/** + * The cache filter is a block used each time SDWebImageManager need to convert an URL into a cache key. This can + * be used to remove dynamic part of an image URL. + * + * The following example sets a filter in the application delegate that will remove any query-string from the + * URL before to use it as a cache key: + * + * @code + +[[SDWebImageManager sharedManager] setCacheKeyFilter:^(NSURL *url) { + url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; + return [url absoluteString]; +}]; + + * @endcode + */ +@property (copy) SDWebImageCacheKeyFilterBlock cacheKeyFilter; + +/** + * Returns global SDWebImageManager instance. + * + * @return SDWebImageManager shared instance + */ ++ (SDWebImageManager *)sharedManager; + +/** + * Downloads the image at the given URL if not present in cache or return the cached version otherwise. + * + * @param url The URL to the image + * @param options A mask to specify options to use for this request + * @param progressBlock A block called while image is downloading + * @param completedBlock A block called when operation has been completed. + * + * This parameter is required. + * + * This block has no return value and takes the requested UIImage as first parameter. + * In case of error the image parameter is nil and the second parameter may contain an NSError. + * + * The third parameter is an `SDImageCacheType` enum indicating if the image was retrived from the local cache + * or from the memory cache or from the network. + * + * The last parameter is set to NO when the SDWebImageProgressiveDownload option is used and the image is + * downloading. This block is thus called repetidly with a partial image. When image is fully downloaded, the + * block is called a last time with the full image and the last parameter set to YES. + * + * @return Returns an NSObject conforming to SDWebImageOperation. Should be an instance of SDWebImageDownloaderOperation + */ +- (id )downloadImageWithURL:(NSURL *)url + options:(SDWebImageOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageCompletionWithFinishedBlock)completedBlock; + +/** + * Saves image to cache for given URL + * + * @param image The image to cache + * @param url The URL to the image + * + */ + +- (void)saveImageToCache:(UIImage *)image forURL:(NSURL *)url; + +/** + * Cancel all current opreations + */ +- (void)cancelAll; + +/** + * Check one or more operations running + */ +- (BOOL)isRunning; + +/** + * Check if image has already been cached + * + * @param url image url + * + * @return if the image was already cached + */ +- (BOOL)cachedImageExistsForURL:(NSURL *)url; + +/** + * Check if image has already been cached on disk only + * + * @param url image url + * + * @return if the image was already cached (disk only) + */ +- (BOOL)diskImageExistsForURL:(NSURL *)url; + +/** + * Async check if image has already been cached + * + * @param url image url + * @param completionBlock the block to be executed when the check is finished + * + * @note the completion block is always executed on the main queue + */ +- (void)cachedImageExistsForURL:(NSURL *)url + completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; + +/** + * Async check if image has already been cached on disk only + * + * @param url image url + * @param completionBlock the block to be executed when the check is finished + * + * @note the completion block is always executed on the main queue + */ +- (void)diskImageExistsForURL:(NSURL *)url + completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; + + +/** + *Return the cache key for a given URL + */ +- (NSString *)cacheKeyForURL:(NSURL *)url; + +@end + + +#pragma mark - Deprecated + +typedef void(^SDWebImageCompletedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType) __deprecated_msg("Block type deprecated. Use `SDWebImageCompletionBlock`"); +typedef void(^SDWebImageCompletedWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) __deprecated_msg("Block type deprecated. Use `SDWebImageCompletionWithFinishedBlock`"); + + +@interface SDWebImageManager (Deprecated) + +/** + * Downloads the image at the given URL if not present in cache or return the cached version otherwise. + * + * @deprecated This method has been deprecated. Use `downloadImageWithURL:options:progress:completed:` + */ +- (id )downloadWithURL:(NSURL *)url + options:(SDWebImageOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageCompletedWithFinishedBlock)completedBlock __deprecated_msg("Method deprecated. Use `downloadImageWithURL:options:progress:completed:`"); + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageManager.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageManager.m new file mode 100644 index 0000000..2781ec8 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageManager.m @@ -0,0 +1,346 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageManager.h" +#import + +@interface SDWebImageCombinedOperation : NSObject + +@property (assign, nonatomic, getter = isCancelled) BOOL cancelled; +@property (copy, nonatomic) SDWebImageNoParamsBlock cancelBlock; +@property (strong, nonatomic) NSOperation *cacheOperation; + +@end + +@interface SDWebImageManager () + +@property (strong, nonatomic, readwrite) SDImageCache *imageCache; +@property (strong, nonatomic, readwrite) SDWebImageDownloader *imageDownloader; +@property (strong, nonatomic) NSMutableArray *failedURLs; +@property (strong, nonatomic) NSMutableArray *runningOperations; + +@end + +@implementation SDWebImageManager + ++ (id)sharedManager { + static dispatch_once_t once; + static id instance; + dispatch_once(&once, ^{ + instance = [self new]; + }); + return instance; +} + +- (id)init { + if ((self = [super init])) { + _imageCache = [self createCache]; + _imageDownloader = [SDWebImageDownloader sharedDownloader]; + _failedURLs = [NSMutableArray new]; + _runningOperations = [NSMutableArray new]; + } + return self; +} + +- (SDImageCache *)createCache { + return [SDImageCache sharedImageCache]; +} + +- (NSString *)cacheKeyForURL:(NSURL *)url { + if (self.cacheKeyFilter) { + return self.cacheKeyFilter(url); + } + else { + return [url absoluteString]; + } +} + +- (BOOL)cachedImageExistsForURL:(NSURL *)url { + NSString *key = [self cacheKeyForURL:url]; + if ([self.imageCache imageFromMemoryCacheForKey:key] != nil) return YES; + return [self.imageCache diskImageExistsWithKey:key]; +} + +- (BOOL)diskImageExistsForURL:(NSURL *)url { + NSString *key = [self cacheKeyForURL:url]; + return [self.imageCache diskImageExistsWithKey:key]; +} + +- (void)cachedImageExistsForURL:(NSURL *)url + completion:(SDWebImageCheckCacheCompletionBlock)completionBlock { + NSString *key = [self cacheKeyForURL:url]; + + BOOL isInMemoryCache = ([self.imageCache imageFromMemoryCacheForKey:key] != nil); + + if (isInMemoryCache) { + // making sure we call the completion block on the main queue + dispatch_async(dispatch_get_main_queue(), ^{ + if (completionBlock) { + completionBlock(YES); + } + }); + return; + } + + [self.imageCache diskImageExistsWithKey:key completion:^(BOOL isInDiskCache) { + // the completion block of checkDiskCacheForImageWithKey:completion: is always called on the main queue, no need to further dispatch + if (completionBlock) { + completionBlock(isInDiskCache); + } + }]; +} + +- (void)diskImageExistsForURL:(NSURL *)url + completion:(SDWebImageCheckCacheCompletionBlock)completionBlock { + NSString *key = [self cacheKeyForURL:url]; + + [self.imageCache diskImageExistsWithKey:key completion:^(BOOL isInDiskCache) { + // the completion block of checkDiskCacheForImageWithKey:completion: is always called on the main queue, no need to further dispatch + if (completionBlock) { + completionBlock(isInDiskCache); + } + }]; +} + +- (id )downloadImageWithURL:(NSURL *)url + options:(SDWebImageOptions)options + progress:(SDWebImageDownloaderProgressBlock)progressBlock + completed:(SDWebImageCompletionWithFinishedBlock)completedBlock { + // Invoking this method without a completedBlock is pointless + NSParameterAssert(completedBlock); + + // Very common mistake is to send the URL using NSString object instead of NSURL. For some strange reason, XCode won't + // throw any warning for this type mismatch. Here we failsafe this error by allowing URLs to be passed as NSString. + if ([url isKindOfClass:NSString.class]) { + url = [NSURL URLWithString:(NSString *)url]; + } + + // Prevents app crashing on argument type error like sending NSNull instead of NSURL + if (![url isKindOfClass:NSURL.class]) { + url = nil; + } + + __block SDWebImageCombinedOperation *operation = [SDWebImageCombinedOperation new]; + __weak SDWebImageCombinedOperation *weakOperation = operation; + + BOOL isFailedUrl = NO; + @synchronized (self.failedURLs) { + isFailedUrl = [self.failedURLs containsObject:url]; + } + + if (!url || (!(options & SDWebImageRetryFailed) && isFailedUrl)) { + dispatch_main_sync_safe(^{ + NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]; + completedBlock(nil, error, SDImageCacheTypeNone, YES, url); + }); + return operation; + } + + @synchronized (self.runningOperations) { + [self.runningOperations addObject:operation]; + } + NSString *key = [self cacheKeyForURL:url]; + + operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *image, SDImageCacheType cacheType) { + if (operation.isCancelled) { + @synchronized (self.runningOperations) { + [self.runningOperations removeObject:operation]; + } + + return; + } + + if ((!image || options & SDWebImageRefreshCached) && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url])) { + if (image && options & SDWebImageRefreshCached) { + dispatch_main_sync_safe(^{ + // If image was found in the cache bug SDWebImageRefreshCached is provided, notify about the cached image + // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. + completedBlock(image, nil, cacheType, YES, url); + }); + } + + // download if no image or requested to refresh anyway, and download allowed by delegate + SDWebImageDownloaderOptions downloaderOptions = 0; + if (options & SDWebImageLowPriority) downloaderOptions |= SDWebImageDownloaderLowPriority; + if (options & SDWebImageProgressiveDownload) downloaderOptions |= SDWebImageDownloaderProgressiveDownload; + if (options & SDWebImageRefreshCached) downloaderOptions |= SDWebImageDownloaderUseNSURLCache; + if (options & SDWebImageContinueInBackground) downloaderOptions |= SDWebImageDownloaderContinueInBackground; + if (options & SDWebImageHandleCookies) downloaderOptions |= SDWebImageDownloaderHandleCookies; + if (options & SDWebImageAllowInvalidSSLCertificates) downloaderOptions |= SDWebImageDownloaderAllowInvalidSSLCertificates; + if (options & SDWebImageHighPriority) downloaderOptions |= SDWebImageDownloaderHighPriority; + if (image && options & SDWebImageRefreshCached) { + // force progressive off if image already cached but forced refreshing + downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload; + // ignore image read from NSURLCache if image if cached but force refreshing + downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; + } + id subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *data, NSError *error, BOOL finished) { + if (weakOperation.isCancelled) { + // Do nothing if the operation was cancelled + // See #699 for more details + // if we would call the completedBlock, there could be a race condition between this block and another completedBlock for the same object, so if this one is called second, we will overwrite the new data + } + else if (error) { + dispatch_main_sync_safe(^{ + if (!weakOperation.isCancelled) { + completedBlock(nil, error, SDImageCacheTypeNone, finished, url); + } + }); + + if (error.code != NSURLErrorNotConnectedToInternet && error.code != NSURLErrorCancelled && error.code != NSURLErrorTimedOut) { + @synchronized (self.failedURLs) { + [self.failedURLs addObject:url]; + } + } + } + else { + BOOL cacheOnDisk = !(options & SDWebImageCacheMemoryOnly); + + if (options & SDWebImageRefreshCached && image && !downloadedImage) { + // Image refresh hit the NSURLCache cache, do not call the completion block + } + // NOTE: We don't call transformDownloadedImage delegate method on animated images as most transformation code would mangle it + else if (downloadedImage && !downloadedImage.images && [self.delegate respondsToSelector:@selector(imageManager:transformDownloadedImage:withURL:)]) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + UIImage *transformedImage = [self.delegate imageManager:self transformDownloadedImage:downloadedImage withURL:url]; + + if (transformedImage && finished) { + BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; + [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:data forKey:key toDisk:cacheOnDisk]; + } + + dispatch_main_sync_safe(^{ + if (!weakOperation.isCancelled) { + completedBlock(transformedImage, nil, SDImageCacheTypeNone, finished, url); + } + }); + }); + } + else { + if (downloadedImage && finished) { + [self.imageCache storeImage:downloadedImage recalculateFromImage:NO imageData:data forKey:key toDisk:cacheOnDisk]; + } + + dispatch_main_sync_safe(^{ + if (!weakOperation.isCancelled) { + completedBlock(downloadedImage, nil, SDImageCacheTypeNone, finished, url); + } + }); + } + } + + if (finished) { + @synchronized (self.runningOperations) { + [self.runningOperations removeObject:operation]; + } + } + }]; + operation.cancelBlock = ^{ + [subOperation cancel]; + + @synchronized (self.runningOperations) { + [self.runningOperations removeObject:weakOperation]; + } + }; + } + else if (image) { + dispatch_main_sync_safe(^{ + if (!weakOperation.isCancelled) { + completedBlock(image, nil, cacheType, YES, url); + } + }); + @synchronized (self.runningOperations) { + [self.runningOperations removeObject:operation]; + } + } + else { + // Image not in cache and download disallowed by delegate + dispatch_main_sync_safe(^{ + if (!weakOperation.isCancelled) { + completedBlock(nil, nil, SDImageCacheTypeNone, YES, url); + } + }); + @synchronized (self.runningOperations) { + [self.runningOperations removeObject:operation]; + } + } + }]; + + return operation; +} + +- (void)saveImageToCache:(UIImage *)image forURL:(NSURL *)url { + if (image && url) { + NSString *key = [self cacheKeyForURL:url]; + [self.imageCache storeImage:image forKey:key toDisk:YES]; + } +} + +- (void)cancelAll { + @synchronized (self.runningOperations) { + [self.runningOperations makeObjectsPerformSelector:@selector(cancel)]; + [self.runningOperations removeAllObjects]; + } +} + +- (BOOL)isRunning { + return self.runningOperations.count > 0; +} + +@end + + +@implementation SDWebImageCombinedOperation + +- (void)setCancelBlock:(SDWebImageNoParamsBlock)cancelBlock { + // check if the operation is already cancelled, then we just call the cancelBlock + if (self.isCancelled) { + if (cancelBlock) { + cancelBlock(); + } + _cancelBlock = nil; // don't forget to nil the cancelBlock, otherwise we will get crashes + } else { + _cancelBlock = [cancelBlock copy]; + } +} + +- (void)cancel { + self.cancelled = YES; + if (self.cacheOperation) { + [self.cacheOperation cancel]; + self.cacheOperation = nil; + } + if (self.cancelBlock) { + self.cancelBlock(); + + // TODO: this is a temporary fix to #809. + // Until we can figure the exact cause of the crash, going with the ivar instead of the setter +// self.cancelBlock = nil; + _cancelBlock = nil; + } +} + +@end + + +@implementation SDWebImageManager (Deprecated) + +// deprecated method, uses the non deprecated method +// adapter for the completion block +- (id )downloadWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedWithFinishedBlock)completedBlock { + return [self downloadImageWithURL:url + options:options + progress:progressBlock + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType, finished); + } + }]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h new file mode 100644 index 0000000..71094ee --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImageOperation.h @@ -0,0 +1,15 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import + +@protocol SDWebImageOperation + +- (void)cancel; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h new file mode 100644 index 0000000..4f14fa2 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h @@ -0,0 +1,98 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageManager.h" + +@class SDWebImagePrefetcher; + +@protocol SDWebImagePrefetcherDelegate + +@optional + +/** + * Called when an image was prefetched. + * + * @param imagePrefetcher The current image prefetcher + * @param imageURL The image url that was prefetched + * @param finishedCount The total number of images that were prefetched (successful or not) + * @param totalCount The total number of images that were to be prefetched + */ +- (void)imagePrefetcher:(SDWebImagePrefetcher *)imagePrefetcher didPrefetchURL:(NSURL *)imageURL finishedCount:(NSUInteger)finishedCount totalCount:(NSUInteger)totalCount; + +/** + * Called when all images are prefetched. + * @param imagePrefetcher The current image prefetcher + * @param totalCount The total number of images that were prefetched (whether successful or not) + * @param skippedCount The total number of images that were skipped + */ +- (void)imagePrefetcher:(SDWebImagePrefetcher *)imagePrefetcher didFinishWithTotalCount:(NSUInteger)totalCount skippedCount:(NSUInteger)skippedCount; + +@end + +typedef void(^SDWebImagePrefetcherProgressBlock)(NSUInteger noOfFinishedUrls, NSUInteger noOfTotalUrls); +typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, NSUInteger noOfSkippedUrls); + +/** + * Prefetch some URLs in the cache for future use. Images are downloaded in low priority. + */ +@interface SDWebImagePrefetcher : NSObject + +/** + * The web image manager + */ +@property (strong, nonatomic, readonly) SDWebImageManager *manager; + +/** + * Maximum number of URLs to prefetch at the same time. Defaults to 3. + */ +@property (nonatomic, assign) NSUInteger maxConcurrentDownloads; + +/** + * SDWebImageOptions for prefetcher. Defaults to SDWebImageLowPriority. + */ +@property (nonatomic, assign) SDWebImageOptions options; + +@property (weak, nonatomic) id delegate; + +/** + * Return the global image prefetcher instance. + */ ++ (SDWebImagePrefetcher *)sharedImagePrefetcher; + +/** + * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, + * currently one image is downloaded at a time, + * and skips images for failed downloads and proceed to the next image in the list + * + * @param urls list of URLs to prefetch + */ +- (void)prefetchURLs:(NSArray *)urls; + +/** + * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, + * currently one image is downloaded at a time, + * and skips images for failed downloads and proceed to the next image in the list + * + * @param urls list of URLs to prefetch + * @param progressBlock block to be called when progress updates; + * first parameter is the number of completed (successful or not) requests, + * second parameter is the total number of images originally requested to be prefetched + * @param completionBlock block to be called when prefetching is completed + * first param is the number of completed (successful or not) requests, + * second parameter is the number of skipped requests + */ +- (void)prefetchURLs:(NSArray *)urls progress:(SDWebImagePrefetcherProgressBlock)progressBlock completed:(SDWebImagePrefetcherCompletionBlock)completionBlock; + +/** + * Remove and cancel queued list + */ +- (void)cancelPrefetching; + + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m new file mode 100644 index 0000000..4087e4a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m @@ -0,0 +1,138 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImagePrefetcher.h" + +#if !defined(DEBUG) && !defined (SD_VERBOSE) +#define NSLog(...) +#endif + +@interface SDWebImagePrefetcher () + +@property (strong, nonatomic) SDWebImageManager *manager; +@property (strong, nonatomic) NSArray *prefetchURLs; +@property (assign, nonatomic) NSUInteger requestedCount; +@property (assign, nonatomic) NSUInteger skippedCount; +@property (assign, nonatomic) NSUInteger finishedCount; +@property (assign, nonatomic) NSTimeInterval startedTime; +@property (copy, nonatomic) SDWebImagePrefetcherCompletionBlock completionBlock; +@property (copy, nonatomic) SDWebImagePrefetcherProgressBlock progressBlock; + +@end + +@implementation SDWebImagePrefetcher + ++ (SDWebImagePrefetcher *)sharedImagePrefetcher { + static dispatch_once_t once; + static id instance; + dispatch_once(&once, ^{ + instance = [self new]; + }); + return instance; +} + +- (id)init { + if ((self = [super init])) { + _manager = [SDWebImageManager new]; + _options = SDWebImageLowPriority; + self.maxConcurrentDownloads = 3; + } + return self; +} + +- (void)setMaxConcurrentDownloads:(NSUInteger)maxConcurrentDownloads { + self.manager.imageDownloader.maxConcurrentDownloads = maxConcurrentDownloads; +} + +- (NSUInteger)maxConcurrentDownloads { + return self.manager.imageDownloader.maxConcurrentDownloads; +} + +- (void)startPrefetchingAtIndex:(NSUInteger)index { + if (index >= self.prefetchURLs.count) return; + self.requestedCount++; + [self.manager downloadImageWithURL:self.prefetchURLs[index] options:self.options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (!finished) return; + self.finishedCount++; + + if (image) { + if (self.progressBlock) { + self.progressBlock(self.finishedCount,[self.prefetchURLs count]); + } + NSLog(@"Prefetched %@ out of %@", @(self.finishedCount), @(self.prefetchURLs.count)); + } + else { + if (self.progressBlock) { + self.progressBlock(self.finishedCount,[self.prefetchURLs count]); + } + NSLog(@"Prefetched %@ out of %@ (Failed)", @(self.finishedCount), @(self.prefetchURLs.count)); + + // Add last failed + self.skippedCount++; + } + if ([self.delegate respondsToSelector:@selector(imagePrefetcher:didPrefetchURL:finishedCount:totalCount:)]) { + [self.delegate imagePrefetcher:self + didPrefetchURL:self.prefetchURLs[index] + finishedCount:self.finishedCount + totalCount:self.prefetchURLs.count + ]; + } + + if (self.prefetchURLs.count > self.requestedCount) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self startPrefetchingAtIndex:self.requestedCount]; + }); + } + else if (self.finishedCount == self.requestedCount) { + [self reportStatus]; + if (self.completionBlock) { + self.completionBlock(self.finishedCount, self.skippedCount); + self.completionBlock = nil; + } + } + }]; +} + +- (void)reportStatus { + NSUInteger total = [self.prefetchURLs count]; + NSLog(@"Finished prefetching (%@ successful, %@ skipped, timeElasped %.2f)", @(total - self.skippedCount), @(self.skippedCount), CFAbsoluteTimeGetCurrent() - self.startedTime); + if ([self.delegate respondsToSelector:@selector(imagePrefetcher:didFinishWithTotalCount:skippedCount:)]) { + [self.delegate imagePrefetcher:self + didFinishWithTotalCount:(total - self.skippedCount) + skippedCount:self.skippedCount + ]; + } +} + +- (void)prefetchURLs:(NSArray *)urls { + [self prefetchURLs:urls progress:nil completed:nil]; +} + +- (void)prefetchURLs:(NSArray *)urls progress:(SDWebImagePrefetcherProgressBlock)progressBlock completed:(SDWebImagePrefetcherCompletionBlock)completionBlock { + [self cancelPrefetching]; // Prevent duplicate prefetch request + self.startedTime = CFAbsoluteTimeGetCurrent(); + self.prefetchURLs = urls; + self.completionBlock = completionBlock; + self.progressBlock = progressBlock; + + // Starts prefetching from the very first image on the list with the max allowed concurrency + NSUInteger listCount = self.prefetchURLs.count; + for (NSUInteger i = 0; i < self.maxConcurrentDownloads && self.requestedCount < listCount; i++) { + [self startPrefetchingAtIndex:i]; + } +} + +- (void)cancelPrefetching { + self.prefetchURLs = nil; + self.skippedCount = 0; + self.requestedCount = 0; + self.finishedCount = 0; + [self.manager cancelAll]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h new file mode 100644 index 0000000..7a6e867 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h @@ -0,0 +1,229 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" +#import "SDWebImageManager.h" + +/** + * Integrates SDWebImage async downloading and caching of remote images with UIButtonView. + */ +@interface UIButton (WebCache) + +/** + * Get the current image URL. + */ +- (NSURL *)sd_currentImageURL; + +/** + * Get the image URL for a control state. + * + * @param state Which state you want to know the URL for. The values are described in UIControlState. + */ +- (NSURL *)sd_imageURLForState:(UIControlState)state; + +/** + * Set the imageView `image` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + */ +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state; + +/** + * Set the imageView `image` with an `url` and a placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + * @param placeholder The image to be set initially, until the image request finishes. + * @see sd_setImageWithURL:placeholderImage:options: + */ +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder; + +/** + * Set the imageView `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + */ +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; + +/** + * Set the imageView `image` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the imageView `image` with an `url`, placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + * @param placeholder The image to be set initially, until the image request finishes. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the imageView `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the backgroundImageView `image` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + */ +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state; + +/** + * Set the backgroundImageView `image` with an `url` and a placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + * @param placeholder The image to be set initially, until the image request finishes. + * @see sd_setImageWithURL:placeholderImage:options: + */ +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder; + +/** + * Set the backgroundImageView `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + */ +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; + +/** + * Set the backgroundImageView `image` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the backgroundImageView `image` with an `url`, placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param state The state that uses the specified title. The values are described in UIControlState. + * @param placeholder The image to be set initially, until the image request finishes. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the backgroundImageView `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Cancel the current image download + */ +- (void)sd_cancelImageLoadForState:(UIControlState)state; + +/** + * Cancel the current backgroundImage download + */ +- (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state; + +@end + + +@interface UIButton (WebCacheDeprecated) + +- (NSURL *)currentImageURL __deprecated_msg("Use `sd_currentImageURL`"); +- (NSURL *)imageURLForState:(UIControlState)state __deprecated_msg("Use `sd_imageURLForState:`"); + +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:`"); +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:`"); +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:options:`"); + +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:completed:`"); +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:completed:`"); +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:options:completed:`"); + +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:`"); +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:`"); +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:options:`"); + +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:completed:`"); +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:completed:`"); +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:options:completed:`"); + +- (void)cancelCurrentImageLoad __deprecated_msg("Use `sd_cancelImageLoadForState:`"); +- (void)cancelBackgroundImageLoadForState:(UIControlState)state __deprecated_msg("Use `sd_cancelBackgroundImageLoadForState:`"); + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m new file mode 100644 index 0000000..8e076ae --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m @@ -0,0 +1,260 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIButton+WebCache.h" +#import "objc/runtime.h" +#import "UIView+WebCacheOperation.h" + +static char imageURLStorageKey; + +@implementation UIButton (WebCache) + +- (NSURL *)sd_currentImageURL { + NSURL *url = self.imageURLStorage[@(self.state)]; + + if (!url) { + url = self.imageURLStorage[@(UIControlStateNormal)]; + } + + return url; +} + +- (NSURL *)sd_imageURLForState:(UIControlState)state { + return self.imageURLStorage[@(state)]; +} + +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state { + [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; +} + +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { + [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; +} + +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; +} + +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { + + [self setImage:placeholder forState:state]; + [self sd_cancelImageLoadForState:state]; + + if (!url) { + [self.imageURLStorage removeObjectForKey:@(state)]; + + dispatch_main_async_safe(^{ + NSError *error = [NSError errorWithDomain:@"SDWebImageErrorDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + if (completedBlock) { + completedBlock(nil, error, SDImageCacheTypeNone, url); + } + }); + + return; + } + + self.imageURLStorage[@(state)] = url; + + __weak UIButton *wself = self; + id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (!wself) return; + dispatch_main_sync_safe(^{ + __strong UIButton *sself = wself; + if (!sself) return; + if (image) { + [sself setImage:image forState:state]; + } + if (completedBlock && finished) { + completedBlock(image, error, cacheType, url); + } + }); + }]; + [self sd_setImageLoadOperation:operation forState:state]; +} + +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; +} + +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; +} + +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; +} + +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; +} + +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; +} + +- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_cancelImageLoadForState:state]; + + [self setBackgroundImage:placeholder forState:state]; + + if (url) { + __weak UIButton *wself = self; + id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (!wself) return; + dispatch_main_sync_safe(^{ + __strong UIButton *sself = wself; + if (!sself) return; + if (image) { + [sself setBackgroundImage:image forState:state]; + } + if (completedBlock && finished) { + completedBlock(image, error, cacheType, url); + } + }); + }]; + [self sd_setBackgroundImageLoadOperation:operation forState:state]; + } else { + dispatch_main_async_safe(^{ + NSError *error = [NSError errorWithDomain:@"SDWebImageErrorDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + if (completedBlock) { + completedBlock(nil, error, SDImageCacheTypeNone, url); + } + }); + } +} + +- (void)sd_setImageLoadOperation:(id)operation forState:(UIControlState)state { + [self sd_setImageLoadOperation:operation forKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)]]; +} + +- (void)sd_cancelImageLoadForState:(UIControlState)state { + [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)]]; +} + +- (void)sd_setBackgroundImageLoadOperation:(id)operation forState:(UIControlState)state { + [self sd_setImageLoadOperation:operation forKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)]]; +} + +- (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state { + [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)]]; +} + +- (NSMutableDictionary *)imageURLStorage { + NSMutableDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey); + if (!storage) + { + storage = [NSMutableDictionary dictionary]; + objc_setAssociatedObject(self, &imageURLStorageKey, storage, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + + return storage; +} + +@end + + +@implementation UIButton (WebCacheDeprecated) + +- (NSURL *)currentImageURL { + return [self sd_currentImageURL]; +} + +- (NSURL *)imageURLForState:(UIControlState)state { + return [self sd_imageURLForState:state]; +} + +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state { + [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; +} + +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { + [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; +} + +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; +} + +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; +} + +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; +} + +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; +} + +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)cancelCurrentImageLoad { + // in a backwards compatible manner, cancel for current state + [self sd_cancelImageLoadForState:self.state]; +} + +- (void)cancelBackgroundImageLoadForState:(UIControlState)state { + [self sd_cancelBackgroundImageLoadForState:state]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+GIF.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+GIF.h new file mode 100755 index 0000000..084f424 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+GIF.h @@ -0,0 +1,19 @@ +// +// UIImage+GIF.h +// LBGIFImage +// +// Created by Laurin Brandner on 06.01.12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import + +@interface UIImage (GIF) + ++ (UIImage *)sd_animatedGIFNamed:(NSString *)name; + ++ (UIImage *)sd_animatedGIFWithData:(NSData *)data; + +- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+GIF.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+GIF.m new file mode 100755 index 0000000..a703637 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+GIF.m @@ -0,0 +1,158 @@ +// +// UIImage+GIF.m +// LBGIFImage +// +// Created by Laurin Brandner on 06.01.12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import "UIImage+GIF.h" +#import + +@implementation UIImage (GIF) + ++ (UIImage *)sd_animatedGIFWithData:(NSData *)data { + if (!data) { + return nil; + } + + CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); + + size_t count = CGImageSourceGetCount(source); + + UIImage *animatedImage; + + if (count <= 1) { + animatedImage = [[UIImage alloc] initWithData:data]; + } + else { + NSMutableArray *images = [NSMutableArray array]; + + NSTimeInterval duration = 0.0f; + + for (size_t i = 0; i < count; i++) { + CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL); + + duration += [self sd_frameDurationAtIndex:i source:source]; + + [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]]; + + CGImageRelease(image); + } + + if (!duration) { + duration = (1.0f / 10.0f) * count; + } + + animatedImage = [UIImage animatedImageWithImages:images duration:duration]; + } + + CFRelease(source); + + return animatedImage; +} + ++ (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source { + float frameDuration = 0.1f; + CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil); + NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties; + NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary]; + + NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; + if (delayTimeUnclampedProp) { + frameDuration = [delayTimeUnclampedProp floatValue]; + } + else { + + NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime]; + if (delayTimeProp) { + frameDuration = [delayTimeProp floatValue]; + } + } + + // Many annoying ads specify a 0 duration to make an image flash as quickly as possible. + // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify + // a duration of <= 10 ms. See and + // for more information. + + if (frameDuration < 0.011f) { + frameDuration = 0.100f; + } + + CFRelease(cfFrameProperties); + return frameDuration; +} + ++ (UIImage *)sd_animatedGIFNamed:(NSString *)name { + CGFloat scale = [UIScreen mainScreen].scale; + + if (scale > 1.0f) { + NSString *retinaPath = [[NSBundle mainBundle] pathForResource:[name stringByAppendingString:@"@2x"] ofType:@"gif"]; + + NSData *data = [NSData dataWithContentsOfFile:retinaPath]; + + if (data) { + return [UIImage sd_animatedGIFWithData:data]; + } + + NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"]; + + data = [NSData dataWithContentsOfFile:path]; + + if (data) { + return [UIImage sd_animatedGIFWithData:data]; + } + + return [UIImage imageNamed:name]; + } + else { + NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"]; + + NSData *data = [NSData dataWithContentsOfFile:path]; + + if (data) { + return [UIImage sd_animatedGIFWithData:data]; + } + + return [UIImage imageNamed:name]; + } +} + +- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size { + if (CGSizeEqualToSize(self.size, size) || CGSizeEqualToSize(size, CGSizeZero)) { + return self; + } + + CGSize scaledSize = size; + CGPoint thumbnailPoint = CGPointZero; + + CGFloat widthFactor = size.width / self.size.width; + CGFloat heightFactor = size.height / self.size.height; + CGFloat scaleFactor = (widthFactor > heightFactor) ? widthFactor : heightFactor; + scaledSize.width = self.size.width * scaleFactor; + scaledSize.height = self.size.height * scaleFactor; + + if (widthFactor > heightFactor) { + thumbnailPoint.y = (size.height - scaledSize.height) * 0.5; + } + else if (widthFactor < heightFactor) { + thumbnailPoint.x = (size.width - scaledSize.width) * 0.5; + } + + NSMutableArray *scaledImages = [NSMutableArray array]; + + UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); + + for (UIImage *image in self.images) { + [image drawInRect:CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledSize.width, scaledSize.height)]; + UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); + + [scaledImages addObject:newImage]; + } + + UIGraphicsEndImageContext(); + + return [UIImage animatedImageWithImages:scaledImages duration:self.duration]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h new file mode 100644 index 0000000..186ebc0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h @@ -0,0 +1,15 @@ +// +// UIImage+MultiFormat.h +// SDWebImage +// +// Created by Olivier Poitrey on 07/06/13. +// Copyright (c) 2013 Dailymotion. All rights reserved. +// + +#import + +@interface UIImage (MultiFormat) + ++ (UIImage *)sd_imageWithData:(NSData *)data; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m new file mode 100644 index 0000000..5395280 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m @@ -0,0 +1,114 @@ +// +// UIImage+MultiFormat.m +// SDWebImage +// +// Created by Olivier Poitrey on 07/06/13. +// Copyright (c) 2013 Dailymotion. All rights reserved. +// + +#import "UIImage+MultiFormat.h" +#import "UIImage+GIF.h" +#import "NSData+ImageContentType.h" +#import + +#ifdef SD_WEBP +#import "UIImage+WebP.h" +#endif + +@implementation UIImage (MultiFormat) + ++ (UIImage *)sd_imageWithData:(NSData *)data { + UIImage *image; + NSString *imageContentType = [NSData sd_contentTypeForImageData:data]; + if ([imageContentType isEqualToString:@"image/gif"]) { + image = [UIImage sd_animatedGIFWithData:data]; + } +#ifdef SD_WEBP + else if ([imageContentType isEqualToString:@"image/webp"]) + { + image = [UIImage sd_imageWithWebPData:data]; + } +#endif + else { + image = [[UIImage alloc] initWithData:data]; + UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data]; + if (orientation != UIImageOrientationUp) { + image = [UIImage imageWithCGImage:image.CGImage + scale:image.scale + orientation:orientation]; + } + } + + + return image; +} + + ++(UIImageOrientation)sd_imageOrientationFromImageData:(NSData *)imageData { + UIImageOrientation result = UIImageOrientationUp; + CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); + if (imageSource) { + CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL); + if (properties) { + CFTypeRef val; + int exifOrientation; + val = CFDictionaryGetValue(properties, kCGImagePropertyOrientation); + if (val) { + CFNumberGetValue(val, kCFNumberIntType, &exifOrientation); + result = [self sd_exifOrientationToiOSOrientation:exifOrientation]; + } // else - if it's not set it remains at up + CFRelease((CFTypeRef) properties); + } else { + //NSLog(@"NO PROPERTIES, FAIL"); + } + CFRelease(imageSource); + } + return result; +} + +#pragma mark EXIF orientation tag converter +// Convert an EXIF image orientation to an iOS one. +// reference see here: http://sylvana.net/jpegcrop/exif_orientation.html ++ (UIImageOrientation) sd_exifOrientationToiOSOrientation:(int)exifOrientation { + UIImageOrientation orientation = UIImageOrientationUp; + switch (exifOrientation) { + case 1: + orientation = UIImageOrientationUp; + break; + + case 3: + orientation = UIImageOrientationDown; + break; + + case 8: + orientation = UIImageOrientationLeft; + break; + + case 6: + orientation = UIImageOrientationRight; + break; + + case 2: + orientation = UIImageOrientationUpMirrored; + break; + + case 4: + orientation = UIImageOrientationDownMirrored; + break; + + case 5: + orientation = UIImageOrientationLeftMirrored; + break; + + case 7: + orientation = UIImageOrientationRightMirrored; + break; + default: + break; + } + return orientation; +} + + + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h new file mode 100644 index 0000000..6b00366 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h @@ -0,0 +1,100 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageCompat.h" +#import "SDWebImageManager.h" + +/** + * Integrates SDWebImage async downloading and caching of remote images with UIImageView for highlighted state. + */ +@interface UIImageView (HighlightedWebCache) + +/** + * Set the imageView `highlightedImage` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + */ +- (void)sd_setHighlightedImageWithURL:(NSURL *)url; + +/** + * Set the imageView `highlightedImage` with an `url` and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + */ +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options; + +/** + * Set the imageView `highlightedImage` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the imageView `highlightedImage` with an `url` and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the imageView `highlightedImage` with an `url` and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param progressBlock A block called while image is downloading + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Cancel the current download + */ +- (void)sd_cancelCurrentHighlightedImageLoad; + +@end + + +@interface UIImageView (HighlightedWebCacheDeprecated) + +- (void)setHighlightedImageWithURL:(NSURL *)url __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:`"); +- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:options:`"); +- (void)setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:completed:`"); +- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:options:completed:`"); +- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:options:progress:completed:`"); + +- (void)cancelCurrentHighlightedImageLoad __deprecated_msg("Use `sd_cancelCurrentHighlightedImageLoad`"); + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m new file mode 100644 index 0000000..ae73610 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m @@ -0,0 +1,107 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIImageView+HighlightedWebCache.h" +#import "UIView+WebCacheOperation.h" + +#define UIImageViewHighlightedWebCacheOperationKey @"highlightedImage" + +@implementation UIImageView (HighlightedWebCache) + +- (void)sd_setHighlightedImageWithURL:(NSURL *)url { + [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:nil]; +} + +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options { + [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:nil]; +} + +- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:completedBlock]; +} + +- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_cancelCurrentHighlightedImageLoad]; + + if (url) { + __weak UIImageView *wself = self; + id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (!wself) return; + dispatch_main_sync_safe (^ + { + if (!wself) return; + if (image) { + wself.highlightedImage = image; + [wself setNeedsLayout]; + } + if (completedBlock && finished) { + completedBlock(image, error, cacheType, url); + } + }); + }]; + [self sd_setImageLoadOperation:operation forKey:UIImageViewHighlightedWebCacheOperationKey]; + } else { + dispatch_main_async_safe(^{ + NSError *error = [NSError errorWithDomain:@"SDWebImageErrorDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + if (completedBlock) { + completedBlock(nil, error, SDImageCacheTypeNone, url); + } + }); + } +} + +- (void)sd_cancelCurrentHighlightedImageLoad { + [self sd_cancelImageLoadOperationWithKey:UIImageViewHighlightedWebCacheOperationKey]; +} + +@end + + +@implementation UIImageView (HighlightedWebCacheDeprecated) + +- (void)setHighlightedImageWithURL:(NSURL *)url { + [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:nil]; +} + +- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options { + [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:nil]; +} + +- (void)setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setHighlightedImageWithURL:url options:0 progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)cancelCurrentHighlightedImageLoad { + [self sd_cancelCurrentHighlightedImageLoad]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h new file mode 100644 index 0000000..717d393 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h @@ -0,0 +1,201 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" +#import "SDWebImageManager.h" + +/** + * Integrates SDWebImage async downloading and caching of remote images with UIImageView. + * + * Usage with a UITableViewCell sub-class: + * + * @code + +#import + +... + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *MyIdentifier = @"MyIdentifier"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; + + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] + autorelease]; + } + + // Here we use the provided sd_setImageWithURL: method to load the web image + // Ensure you use a placeholder image otherwise cells will be initialized with no image + [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://example.com/image.jpg"] + placeholderImage:[UIImage imageNamed:@"placeholder"]]; + + cell.textLabel.text = @"My Text"; + return cell; +} + + * @endcode + */ +@interface UIImageView (WebCache) + +/** + * Get the current image URL. + * + * Note that because of the limitations of categories this property can get out of sync + * if you use sd_setImage: directly. + */ +- (NSURL *)sd_imageURL; + +/** + * Set the imageView `image` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + */ +- (void)sd_setImageWithURL:(NSURL *)url; + +/** + * Set the imageView `image` with an `url` and a placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @see sd_setImageWithURL:placeholderImage:options: + */ +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; + +/** + * Set the imageView `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + */ +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; + +/** + * Set the imageView `image` with an `url`. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the imageView `image` with an `url`, placeholder. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the imageView `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the imageView `image` with an `url`, placeholder and custom options. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param progressBlock A block called while image is downloading + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Set the imageView `image` with an `url` and a optionaly placeholder image. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param progressBlock A block called while image is downloading + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrived from the local cache of from the network. + * The forth parameter is the original image url. + */ +- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url andPlaceholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; + +/** + * Download an array of images and starts them in an animation loop + * + * @param arrayOfURLs An array of NSURL + */ +- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs; + +/** + * Cancel the current download + */ +- (void)sd_cancelCurrentImageLoad; + +- (void)sd_cancelCurrentAnimationImagesLoad; + +@end + + +@interface UIImageView (WebCacheDeprecated) + +- (NSURL *)imageURL __deprecated_msg("Use `sd_imageURL`"); + +- (void)setImageWithURL:(NSURL *)url __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:`"); +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:`"); +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options`"); + +- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:completed:`"); +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:completed:`"); +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:completed:`"); +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:progress:completed:`"); + +- (void)setAnimationImagesWithURLs:(NSArray *)arrayOfURLs __deprecated_msg("Use `sd_setAnimationImagesWithURLs:`"); + +- (void)cancelCurrentArrayLoad __deprecated_msg("Use `sd_cancelCurrentAnimationImagesLoad`"); + +- (void)cancelCurrentImageLoad __deprecated_msg("Use `sd_cancelCurrentImageLoad`"); + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m new file mode 100644 index 0000000..51663dd --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m @@ -0,0 +1,195 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIImageView+WebCache.h" +#import "objc/runtime.h" +#import "UIView+WebCacheOperation.h" + +static char imageURLKey; + +@implementation UIImageView (WebCache) + +- (void)sd_setImageWithURL:(NSURL *)url { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; +} + +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; +} + +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; +} + +- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; +} + +- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { + [self sd_cancelCurrentImageLoad]; + objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + if (!(options & SDWebImageDelayPlaceholder)) { + self.image = placeholder; + } + + if (url) { + __weak UIImageView *wself = self; + id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (!wself) return; + dispatch_main_sync_safe(^{ + if (!wself) return; + if (image) { + wself.image = image; + [wself setNeedsLayout]; + } else { + if ((options & SDWebImageDelayPlaceholder)) { + wself.image = placeholder; + [wself setNeedsLayout]; + } + } + if (completedBlock && finished) { + completedBlock(image, error, cacheType, url); + } + }); + }]; + [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoad"]; + } else { + dispatch_main_async_safe(^{ + NSError *error = [NSError errorWithDomain:@"SDWebImageErrorDomain" code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + if (completedBlock) { + completedBlock(nil, error, SDImageCacheTypeNone, url); + } + }); + } +} + +- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url andPlaceholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { + NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:url]; + UIImage *lastPreviousCachedImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key]; + + [self sd_setImageWithURL:url placeholderImage:lastPreviousCachedImage ?: placeholder options:options progress:progressBlock completed:completedBlock]; +} + +- (NSURL *)sd_imageURL { + return objc_getAssociatedObject(self, &imageURLKey); +} + +- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { + [self sd_cancelCurrentAnimationImagesLoad]; + __weak UIImageView *wself = self; + + NSMutableArray *operationsArray = [[NSMutableArray alloc] init]; + + for (NSURL *logoImageURL in arrayOfURLs) { + id operation = [SDWebImageManager.sharedManager downloadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (!wself) return; + dispatch_main_sync_safe(^{ + __strong UIImageView *sself = wself; + [sself stopAnimating]; + if (sself && image) { + NSMutableArray *currentImages = [[sself animationImages] mutableCopy]; + if (!currentImages) { + currentImages = [[NSMutableArray alloc] init]; + } + [currentImages addObject:image]; + + sself.animationImages = currentImages; + [sself setNeedsLayout]; + } + [sself startAnimating]; + }); + }]; + [operationsArray addObject:operation]; + } + + [self sd_setImageLoadOperation:[NSArray arrayWithArray:operationsArray] forKey:@"UIImageViewAnimationImages"]; +} + +- (void)sd_cancelCurrentImageLoad { + [self sd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoad"]; +} + +- (void)sd_cancelCurrentAnimationImagesLoad { + [self sd_cancelImageLoadOperationWithKey:@"UIImageViewAnimationImages"]; +} + +@end + + +@implementation UIImageView (WebCacheDeprecated) + +- (NSURL *)imageURL { + return [self sd_imageURL]; +} + +- (void)setImageWithURL:(NSURL *)url { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; +} + +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; +} + +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; +} + +- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock { + [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + if (completedBlock) { + completedBlock(image, error, cacheType); + } + }]; +} + +- (void)cancelCurrentArrayLoad { + [self sd_cancelCurrentAnimationImagesLoad]; +} + +- (void)cancelCurrentImageLoad { + [self sd_cancelCurrentImageLoad]; +} + +- (void)setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { + [self sd_setAnimationImagesWithURLs:arrayOfURLs]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h new file mode 100644 index 0000000..6719036 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h @@ -0,0 +1,36 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import +#import "SDWebImageManager.h" + +@interface UIView (WebCacheOperation) + +/** + * Set the image load operation (storage in a UIView based dictionary) + * + * @param operation the operation + * @param key key for storing the operation + */ +- (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key; + +/** + * Cancel all operations for the current UIView and key + * + * @param key key for identifying the operations + */ +- (void)sd_cancelImageLoadOperationWithKey:(NSString *)key; + +/** + * Just remove the operations corresponding to the current UIView and key without cancelling them + * + * @param key key for identifying the operations + */ +- (void)sd_removeImageLoadOperationWithKey:(NSString *)key; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m new file mode 100644 index 0000000..9219478 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m @@ -0,0 +1,55 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIView+WebCacheOperation.h" +#import "objc/runtime.h" + +static char loadOperationKey; + +@implementation UIView (WebCacheOperation) + +- (NSMutableDictionary *)operationDictionary { + NSMutableDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey); + if (operations) { + return operations; + } + operations = [NSMutableDictionary dictionary]; + objc_setAssociatedObject(self, &loadOperationKey, operations, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return operations; +} + +- (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key { + [self sd_cancelImageLoadOperationWithKey:key]; + NSMutableDictionary *operationDictionary = [self operationDictionary]; + [operationDictionary setObject:operation forKey:key]; +} + +- (void)sd_cancelImageLoadOperationWithKey:(NSString *)key { + // Cancel in progress downloader from queue + NSMutableDictionary *operationDictionary = [self operationDictionary]; + id operations = [operationDictionary objectForKey:key]; + if (operations) { + if ([operations isKindOfClass:[NSArray class]]) { + for (id operation in operations) { + if (operation) { + [operation cancel]; + } + } + } else if ([operations conformsToProtocol:@protocol(SDWebImageOperation)]){ + [(id) operations cancel]; + } + [operationDictionary removeObjectForKey:key]; + } +} + +- (void)sd_removeImageLoadOperationWithKey:(NSString *)key { + NSMutableDictionary *operationDictionary = [self operationDictionary]; + [operationDictionary removeObjectForKey:key]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/LICENSE.txt b/iOSStudy/iOSStudy/Pods/SVProgressHUD/LICENSE.txt new file mode 100644 index 0000000..5bcd8b4 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVProgressHUD/LICENSE.txt @@ -0,0 +1,26 @@ +Copyright (c) 2011-2014 Sam Vermette + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +A different license may apply to other resources included in this package, +including Freepik Icons. Please consult their +respective headers for the terms of their individual licenses. \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/README.md b/iOSStudy/iOSStudy/Pods/SVProgressHUD/README.md new file mode 100644 index 0000000..214d2a4 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVProgressHUD/README.md @@ -0,0 +1,137 @@ +# SVProgressHUD + +`SVProgressHUD` is a clean and easy-to-use HUD meant to display the progress of an ongoing task. + +![SVProgressHUD](http://f.cl.ly/items/2G1F1Z0M0k0h2U3V1p39/SVProgressHUD.gif) + +## Installation + +### From CocoaPods + +[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like `SVProgressHUD` in your projects. Simply add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html): + +```ruby +pod 'SVProgressHUD' +``` + +If you want to use the latest features of `SVProgressHUD` add `:head`: + +```ruby +pod 'SVProgressHUD', :head +``` + +This pulls from the `master` branch directly. We are usually careful about what we push there and this is the version we use ourselves in all of our projects. + +### Manually + +* Drag the `SVProgressHUD/SVProgressHUD` folder into your project. +* Take care that `SVProgressHUD.bundle` is added to `Targets->Build Phases->Copy Bundle Resources`. +* Add the **QuartzCore** framework to your project. + +## Usage + +(see sample Xcode project in `/Demo`) + +`SVProgressHUD` is created as a singleton (i.e. it doesn't need to be explicitly allocated and instantiated; you directly call `[SVProgressHUD method]`). + +**Use `SVProgressHUD` wisely! Only use it if you absolutely need to perform a task before taking the user forward. Bad use case examples: pull to refresh, infinite scrolling, sending message.** + +Using `SVProgressHUD` in your app will usually look as simple as this (using Grand Central Dispatch): + +```objective-c +[SVProgressHUD show]; +dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + // time-consuming task + dispatch_async(dispatch_get_main_queue(), ^{ + [SVProgressHUD dismiss]; + }); +}); +``` + +### Showing the HUD + +You can show the status of indeterminate tasks using one of the following: + +```objective-c ++ (void)show; ++ (void)showWithMaskType:(SVProgressHUDMaskType)maskType; ++ (void)showWithStatus:(NSString*)string; ++ (void)showWithStatus:(NSString*)string maskType:(SVProgressHUDMaskType)maskType; +``` + +If you'd like the HUD to reflect the progress of a task, use one of these: + +```objective-c ++ (void)showProgress:(CGFloat)progress; ++ (void)showProgress:(CGFloat)progress status:(NSString*)status; ++ (void)showProgress:(CGFloat)progress status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType; +``` + +### Dismissing the HUD + +It can be dismissed right away using: + +```objective-c ++ (void)dismiss; +``` + +If you'd like to stack HUDs, you can balance out every show call using: + +```objective-c ++ (void)popActivity; +``` + +The HUD will get dismissed once the `popActivity` calls will match the number of show calls. + +Or show a confirmation glyph before before getting dismissed a little bit later. The display time depends on the length of the given string (between 0.5 and 5 seconds). + +```objective-c ++ (void)showInfoWithStatus:(NSString *)string; ++ (void)showInfoWithStatus:(NSString *)string maskType:(SVProgressHUDMaskType)maskType; ++ (void)showSuccessWithStatus:(NSString*)string; ++ (void)showSuccessWithStatus:(NSString*)string maskType:(SVProgressHUDMaskType)maskType; ++ (void)showErrorWithStatus:(NSString *)string; ++ (void)showErrorWithStatus:(NSString *)string maskType:(SVProgressHUDMaskType)maskType; ++ (void)showImage:(UIImage*)image status:(NSString*)string; ++ (void)showImage:(UIImage*)image status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType; +``` + +## Customization + +`SVProgressHUD` can be customized via the following methods: + +```objective-c ++ (void)setBackgroundColor:(UIColor*)color; // default is [UIColor whiteColor] ++ (void)setForegroundColor:(UIColor*)color; // default is [UIColor blackColor] ++ (void)setRingThickness:(CGFloat)width; // default is 4 pt ++ (void)setFont:(UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] ++ (void)setInfoImage:(UIImage*)image; // default is the bundled info image provided by Freepik ++ (void)setSuccessImage:(UIImage*)image; // default is bundled success image from Freepik ++ (void)setErrorImage:(UIImage*)image; // default is bundled error image from Freepik ++ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone +``` + +## Notifications + +`SVProgressHUD` posts four notifications via `NSNotificationCenter` in response to being shown/dismissed: +* `SVProgressHUDWillAppearNotification` when the show animation starts +* `SVProgressHUDDidAppearNotification` when the show animation completes +* `SVProgressHUDWillDisappearNotification` when the dismiss animation starts +* `SVProgressHUDDidDisappearNotification` when the dismiss animation completes + +Each notification passes a `userInfo` dictionary holding the HUD's status string (if any), retrievable via `SVProgressHUDStatusUserInfoKey`. + +`SVProgressHUD` also posts `SVProgressHUDDidReceiveTouchEventNotification` when users touch on the overall screen or `SVProgressHUDDidTouchDownInsideNotification` when a user touches on the HUD directly. For this notifications `userInfo` is not passed but the object parameter contains the `UIEvent` that related to the touch. + +## Contributing to this project + +If you have feature requests or bug reports, feel free to help out by sending pull requests or by [creating new issues](https://github.com/samvermette/SVProgressHUD/issues/new). Please take a moment to +review the guidelines written by [Nicolas Gallagher](https://github.com/necolas/): + +* [Bug reports](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#bugs) +* [Feature requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#features) +* [Pull requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#pull-requests) + +## Credits + +`SVProgressHUD` is brought to you by [Sam Vermette](http://samvermette.com) and [contributors to the project](https://github.com/samvermette/SVProgressHUD/contributors). If you're using `SVProgressHUD` in your project, attribution would be very appreciated. The info, success and error icons are made by [Freepik](http://www.freepik.com) from [Flaticon](www.flaticon.com) and are licensed under [Creative Commons BY 3.0](http://creativecommons.org/licenses/by/3.0/). diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h new file mode 100644 index 0000000..734f9e7 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h @@ -0,0 +1,18 @@ +// +// SVIndefiniteAnimatedView.h +// SVProgressHUD +// +// Created by Guillaume Campagna on 2014-12-05. +// +// + +#import + +@interface SVIndefiniteAnimatedView : UIView + +@property (nonatomic, assign) CGFloat strokeThickness; +@property (nonatomic, assign) CGFloat radius; +@property (nonatomic, strong) UIColor *strokeColor; + +@end + diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m new file mode 100644 index 0000000..7cad180 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m @@ -0,0 +1,131 @@ +// +// SVIndefiniteAnimatedView.m +// SVProgressHUD +// +// Created by Guillaume Campagna on 2014-12-05. +// +// + +#import "SVIndefiniteAnimatedView.h" + +#pragma mark SVIndefiniteAnimatedView + +@interface SVIndefiniteAnimatedView () + +@property (nonatomic, strong) CAShapeLayer *indefiniteAnimatedLayer; + +@end + +@implementation SVIndefiniteAnimatedView + +- (void)willMoveToSuperview:(UIView *)newSuperview { + if (newSuperview) { + [self layoutAnimatedLayer]; + } else { + [_indefiniteAnimatedLayer removeFromSuperlayer]; + _indefiniteAnimatedLayer = nil; + } +} + +- (void)layoutAnimatedLayer { + CALayer *layer = self.indefiniteAnimatedLayer; + + [self.layer addSublayer:layer]; + layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2); +} + +- (CAShapeLayer*)indefiniteAnimatedLayer { + if(!_indefiniteAnimatedLayer) { + CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5); + CGRect rect = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2); + + UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter + radius:self.radius + startAngle:M_PI*3/2 + endAngle:M_PI/2+M_PI*5 + clockwise:YES]; + + _indefiniteAnimatedLayer = [CAShapeLayer layer]; + _indefiniteAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale]; + _indefiniteAnimatedLayer.frame = rect; + _indefiniteAnimatedLayer.fillColor = [UIColor clearColor].CGColor; + _indefiniteAnimatedLayer.strokeColor = self.strokeColor.CGColor; + _indefiniteAnimatedLayer.lineWidth = self.strokeThickness; + _indefiniteAnimatedLayer.lineCap = kCALineCapRound; + _indefiniteAnimatedLayer.lineJoin = kCALineJoinBevel; + _indefiniteAnimatedLayer.path = smoothedPath.CGPath; + + CALayer *maskLayer = [CALayer layer]; + maskLayer.contents = (id)[[UIImage imageNamed:@"SVProgressHUD.bundle/angle-mask"] CGImage]; + maskLayer.frame = _indefiniteAnimatedLayer.bounds; + _indefiniteAnimatedLayer.mask = maskLayer; + + NSTimeInterval animationDuration = 1; + CAMediaTimingFunction *linearCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; + + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; + animation.fromValue = 0; + animation.toValue = [NSNumber numberWithFloat:M_PI*2]; + animation.duration = animationDuration; + animation.timingFunction = linearCurve; + animation.removedOnCompletion = NO; + animation.repeatCount = INFINITY; + animation.fillMode = kCAFillModeForwards; + animation.autoreverses = NO; + [_indefiniteAnimatedLayer.mask addAnimation:animation forKey:@"rotate"]; + + CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; + animationGroup.duration = animationDuration; + animationGroup.repeatCount = INFINITY; + animationGroup.removedOnCompletion = NO; + animationGroup.timingFunction = linearCurve; + + CABasicAnimation *strokeStartAnimation = [CABasicAnimation animationWithKeyPath:@"strokeStart"]; + strokeStartAnimation.fromValue = @0.015; + strokeStartAnimation.toValue = @0.515; + + CABasicAnimation *strokeEndAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; + strokeEndAnimation.fromValue = @0.485; + strokeEndAnimation.toValue = @0.985; + + animationGroup.animations = @[strokeStartAnimation, strokeEndAnimation]; + [_indefiniteAnimatedLayer addAnimation:animationGroup forKey:@"progress"]; + + } + return _indefiniteAnimatedLayer; +} + +- (void)setFrame:(CGRect)frame { + [super setFrame:frame]; + + if (self.superview) { + [self layoutAnimatedLayer]; + } +} + +- (void)setRadius:(CGFloat)radius { + _radius = radius; + + [_indefiniteAnimatedLayer removeFromSuperlayer]; + _indefiniteAnimatedLayer = nil; + + if (self.superview) { + [self layoutAnimatedLayer]; + } +} + +- (void)setStrokeColor:(UIColor *)strokeColor { + _strokeColor = strokeColor; + _indefiniteAnimatedLayer.strokeColor = strokeColor.CGColor; +} + +- (void)setStrokeThickness:(CGFloat)strokeThickness { + _strokeThickness = strokeThickness; + _indefiniteAnimatedLayer.lineWidth = _strokeThickness; +} + +- (CGSize)sizeThatFits:(CGSize)size { + return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2); +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png new file mode 100644 index 0000000000000000000000000000000000000000..84d1f7cb49b6445c664e3aba8010a299cf176e23 GIT binary patch literal 3482 zcmV;L4Q29)P)%bMovp zC4PXCkL>5K?Cn=ZEdx*p)<}LV`x;I*G<%-^#oJlRdUSl9ipPX=}>Z zjEbx2r~A2Xv|)o{NH&EJvq_%aw1x; zPK(3;H9m=|BG8mLcPCS+9DUzm!LoPkwsV; zAxtDFfZ3qFGhm#t;Hv^M?6pJ>w~-?W5YaIJei~`Zex#V!#faCQx_Nwk|N!fCS8G~nl2bZP}Yan52um6s6Y@I z-f?r$CP_@fEb^j8-iem=b653t1X0JN%W32s!H=$TdarRJz@+HKnsB`aJ*+Yl)ui+u zD7z`Hkj10yMB{RJ&l`Tc;Due^D3yK~^HC)jY8lTOCoS`bV zzCh8ls|JsbKN}eoCSaQ@EDRsG$yM3~0T?p35j0B!qMUY4Zr-H8RnM~613v4`15{Irlao51&QPL_I%e~69sE=W}`VGMAZrFKy7&aI~f?WW*63JoHv?QYfg;k1 z;k?ckgWa)?&SX0E+}_zV{VE`kjGK7pu`^)C5)o<|PLs|f0X5wcK^LbuWwWR1If!)q z`F-xs!f+N9GGm2jpdg7H&m*&@_0uRjdge+Cv7BCK@8zV_`;dFule~7jMV-)GQdy8hBu+fnfl2KhV6K6LA z#1@ERC`}wd4g*eQokW^22unW$14K<0W?9{Asv5VbMi@NHhaYH zBcbBXE=3hZX=J~%Ix>kbQ%$(*_MRwBe(q#+1Mv1Z|1SajdWnvaWKI>Y3(?_rfe71X zm$G(NH%T+%n5;zrd;#!J0DpJ@^S#rfWH9v*CTSKsbLiSLR4w~Zl>s~fc`*P6W4G2;(a~>#cO;!PO}2>y#M9{=jh?|Aqe&50tv|7=wB`edXJdZ>@Q(*D z8GvyI@Z;nD<Nm7OIj(WA4V5vGg?^ zYPzAGpL|OEqgA+B)jpdPcB0w-Jr0M-ed_U_|TKwa^m{z?chAYs6S# zgfsqe3p$!E07{VhR$B~eLr1bm8BwLqP!zM5VpeUdqahv*-5tR0N!9Jy_aiAlZw>?8 zlgukib-OcmyzdNl=3?b7b*k@2>(W9p!N{oGYS=iU(j)0pxjo&H$ zvL4SKQ<UAR~8(Q(Gb0!&9F&logfkJYy^)5WCq;N{2hVc@r%Y%y<5xOO9EES zm_c=4S?WT7YTMV%vZ{iw%CKfIG&>t~Rp|~2ms*mV#Ct7^4lxZZ!Sks4W_C~dKv|O* zy{kZ(1(hk`V?~>3GTC31WmUqD02~dXCd$A%)w);HjDye(#wzIuc{Z+%K+I?I{i+%8 z(JaI$5kMmB9g5V%UWsOHzRb(2XseW4>h(T+bh$Jw{?f>Iv->OuHe)o36{FN(ESstD>Bi_8Vi7~8(m4J9MN z8>vjMryl7*m1VKi#y0BC)jzuwR_!HRZS#kuK!lTBMFr~1tdqJTcN9bIxDI2HHj7?d&t#b`^hU2@L)z0`i)4*~PKt@-XYvx9k`b&jBPJqEs z(`QiEPEVH;|AW2s9eV-F^qlK9crexYfql`OrU7XS#Hn@P#kSWNNkvBcYd0G3sPXtpf6761SM07*qo IM6N<$g4p$m`2YX_ literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa036ec83e017118d33c04c99528259d2a31c89 GIT binary patch literal 5614 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 IM6N<$g6NSPp8x;= literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4cd170883099d9c07bad7e235885affc3d5a5f GIT binary patch literal 9389 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 literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b8bc16c896bc3667141e4b131974628f68c785d2 GIT binary patch literal 1137 zcmV-%1djWOP)3FgJsCjVV#>2m~}1+ma*bQF_J7n79au+hf7mL@rEEaf-W;t z6c=x}OdL#@4mPti27@=O&<#`wmx)X35O5%~qu0~+XY%`RP1p9EKF|B_bI$AeobN-G z)fyzSEzw}LO1Rb`KXqEBWa1RJ=yj_~erL#_?G|N5<}A=*K*0e`oa6VAyxU^AOt^(^ z*Kf=-E>uamWgaqY&<;(K)VVj?q~EwF#T!CmsZPU&+-s>MRc?{ZUN`Ou7pMS$rG9P5 zke%KoNsW7}Esh!2?E-l?p4=VDUs$dz74A%T=rgX%D&;0=iCu;ayI=FH$($y4#&v&m zzA~7c+-cCTUs|bL=_Quf>XC+O5VBQmkv-G&uBV5O2;Y^$S!-?(sEGSTcFh4_B2 zP;zJZek6Zujr=s+PGd&w@@}*0bl;8S!&8ts&F&M7xZl}k-9mTxuiy{XC_e$WD{}Wa zODZk!?MOc2L&{9-J$6U#UdyD`eBX*>my0A5xCaFV_gEs;8f}i`V?HbgV1>Pr+u?0e z?_}SMgN{Aq%h+3jX~;<{~4muYj|8p%TB z?sA&Ut9PeyL9p8yGB2k^mk`N=)@9GF@+U#Rr}PS*woW3m60IJI_uFET>%Ag)#udu4 z;y&olBIi_8yTOr2UZq^>mANQ#BQ{44YP5Sfl2^-1wQ?6nZpbDJ0Fl(@rAV$fCr$1W zU4j9(9mhefjb0EuYlAAOl(*Jj1jl?mawd|lb2zTtsMf5T<5G_b`gBanL5&T1;>tF2 z&8kY5Mea3UJ0SQF%KC2N*BG>tA{Ee?p zcaS=tb})Xl-5Zr&l}kMykJ2#}S!bi?1-;rdm|d0DM)F0sortW{rbp1@I&U!h=D5TG z!OOle*)8j}I~>=oS1+9^Tx`GKh)om8de?g~a#yL7UU_SD3tqLwJOCPe#*z4{T;U{0 zm2A~*%xk_ASEA94UXAN6GZ#`PTXY-sKi@N7jxRfET(7liWmCCxJ!Vv&t?KA>RF98k z#zEc+j~e!@W)}L9RyB|*x!eOju7aFOWwI|(Ezkb}fNXxRAP(Sm00000NkvXXu0mjf D&(JVb literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf4c4fcd318ce70a46eee5d29bb369bcb47392f GIT binary patch literal 2315 zcmV+m3H0`fP)y000QmNklURFKHcEC~eU5(z>`&Nu*;~LZ?xGqIV@$1o0T!!O8do{y>6OvxjLIju~Ft&E0)&i zX_NJ(udjQ_UP&$9@FSn^XF@TD;>fBNWICC8|7Zn^7mlHP^&iU%`-|)yN@}+V)fd@>diAo@yVv= zD$6v8wFXs3DbijPfO&o~7xRc%WMz$Ob->UE3?ea5wF zgj2{mKXJZ<4k5=#i_~e8Qs*(1@?;&=^nRwO(Huc<92=qN$}=GiVKsm@}Pj%wv! zxYkOIq3Q3MVXy)nN}jP6sFjwo)nZlpev0y^x!%9n8`NCuPUR9hoP;5&ec*_sdQX`6 zi2!6PbDb5MrNf#217DD*GYA2gZL5@&|MYWL=>dQ(_eFWS1li6r-@97FsLxtpg%+`c*7$+5C3p{W>$N2}AtQnxNbv&-j|tl3SnPmbxlY+pGI*A6d07ZRI8@J;)sd#3=MJmI!Sv@`_kX^; z`iyB_)+7#fyQ$*>kY`9(p-74~d&Wei!Sth%qpusiqFK_%{v)h}bcmW4xYIh}ZMquQ z>f_j)>6=~%wQBb7rWue~RU-w4n(1w^v^`e3TFG%{u9v^_lKo;Id(ACAFI&dQH_Y8O zY7Kd-ahXz)<0D(C>%FL1$|0|XJO2zm9N+C7ZDPAUWs06ojL*99zgI$D@jV0OX2SI0 z?o=C0-)Du(6^ooG-F?%GVbsIkbgQ#uwZEEkZFEFzza=J|jG4teWRjk4SwOWIkj~cIs_NA|D{4!*<#cKcL zeAy?n$X8*mP$4@kRjEk()7@7+D{NZ%vzfjq|3rIPp<11k*glUK8%)p40_GJ~Xp(Z+ zI(Hf31n6O$hrO>&tjx<$t;B?3jxq- zt-F-VKfb-0Md~EQcAM`a#Uhy{(!&Hbnxq}}t~o{?+lKKL+7iax>JgXfrei2^wdEQG zRo(3Zg^ohDV&hc@3)<}Rh|!9490e{HR_(M}@1CQ-i0o~GB|Zph*1I>D-jPIlhUJC5 zApjf9HCE&kMEbZQWHTkU$-^#EsN?D8%a*ARp1$o~BmTEoS$dl2XZA{mrr&S4B9YFZ z(4~H9r=(UJ%{NM}2%yv?PYG(;Vzx25>pXg>@|fMyTGX1aQUW;Ll^)j^)O_E9(6`Q| zz(h;cg^AwtfYExw4IbAdDXAg6^be+YGDR-5)J|<$Z1#|gWbw3jgX!!2#3)6&2HjPu z)*vNmt7*>U=U%njd+swtfv!WIahBSq+52vF4(GVpGo}fqcd`Fx8ex%_++mmmk#k(8 lzXDy4LKUuZt`h%$_%8sKT8DVubNT=P002ovPDHLkV1nvRn<)SQ literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png new file mode 100644 index 0000000000000000000000000000000000000000..2a3101841712c36ce91ef4bd1c19fa2961c5460f GIT binary patch literal 1123 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 Kh86nG5B~!~U$x!< literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1aadb13ed3504db80e86b861531a381355e6eba2 GIT binary patch literal 4385 zcmZ{IXE+;P*nT3!-g{QWF11%EF(NT*D@BQDY3)5K5<4iON?Vjx6s;9|(^Asbst&c) zs8yq?)F`jt|N4J;zr5GEo^zk)Irn{^Pv^SMc?edPNM;5B1^@uSY=SbfxxoLzjt+b= zvxm7SUjX%OeG7d6fSkp6>Opgn14C?(27sCoq4kSI)DvZ60RTix0sy!~0O0tdgj)ju z!W0334R-(l_6Pvr4J>T8*16aKqs@>;fb;)GNmu!Uiwb=p$|>Xm&Hi6(2AbLe0IY9K zjP&gyr?!gLLvE~a55zfldLoHMUrc`XL$njQo>=9Lvf>Knkb8mVYqaR8AkXY6`3-d9UJFK)XH*0FIS#(rTe`HpP{yMyyl`1DGSz z!ze21>lYsMG4A)lXbu!en{6Th*v{mgeOBEtkpSM{U$E^jqnT;rkWGgg7V@>=o2SHC zAS^oQlCRJYury77KEgC>?;*n7GG8l&hZGPY`iDH>c7uo^G41nl95wXLGmqUpU<*i5 zxXuz$lMCHslj;O_X6$Sv#DZqU{8YMa1~dozO62}bB(CGMKxEi)Uneh$KslkDK}0KM)7vX_ha-p zerfm0^v90i^QD)$M2}IWiI3-Bzd|5SW@`teGJ2024Ns`Wr; z7ZxbAF2GcE4h#Ur8Eg-z8MN1)1S>#2OEWU=8#9Py_l#1$Nw3>62o7f7|Mfh!3b;NT zE$&gkUT!H?GbB0+$+s-ShR%Fo-`ZL;ITHw4G}hL`O6*3~nND;F%hr|X81ucX7lO}NIfH6x0@?2 z4S%&SZj{q9_P*E-B;9U?r(ehqmE?*<#}Opf4$1;CmxG~Ln$A?YxkTV!rCnffC^9d& zFDBKPsM|@9J1FR7ObrsD#iqM72ujn}OAmh{Uf9(*E~4UusORbmLdDV#K#Ol!vtvR& zjI4%vwAo?4-638{2Tg{`zO~u^g60}83PD|Bnf}X3;SNT2^D7Pbxyu!qdhv7|qJ^Aj zeGzBhH&eIDiT+xkQ|6;ITf028dSz3%DkQ69R8rURtjuhj$;LX)I493IFZOD1eh%sy zc0kPkqfVx(e?R=R2;X`sXi#+b>FmC0v@DJjWMKF?^Fu`7M{gnkqv&eMC;m$up z9$~7H0^__>B@FG1M=|_3RIJFVa>*s7GhPE< zJl%E!B{d;N8yC;8%pH5Ge(2M2(2;CbaNkR?{wF_%c00E{qO}#d8oQ_(@+}hM9e4qG9(ok^L$`ybjogL=wGf<&$oZGczDxbu;b_ zG=Ue@xbDOz&csW<``7wntgRJ4nM{&!8wleivE9B!e5jl5YXBO5yh%*d#fSc}Pyh9M zo*A@Gm}Ks?l}^0VsDQn%NiKdbn2&y9B&O;VdUj>;(TxLL(+xw}p$62AY>Bvc13wsp zqD&3&*qKzT9fM!%OncjUi0}4bv8;!+r6iEHmPjcHk@4Zt2`6Y@ns}M zZLchI3ykJO*G;cMZiYAxY1OkMX z_wbRrNrLz?ohj$jdh(B%<7$M1598vv6N$0gz^DA798Ip-+gJBLST;M*4Kd{;*IEtD zCf08iQ8N31Ik&vWsR<);HfvW?p~=r+UYCrO;ve=jpgJt9}-@Z{Pi{Y`z_Bm(ZD_fx9Wz(=1qhT4X%=bF#j+``+I5Q|*k( zu>_Zt_+%h$y~vT-wC~uG`tCXKv25^jTY>e`Rc4ALDR_WL+PCMY2%#$kDW$Chmxe#! z<+hs4kxdb$Dnk}2)TQWu=1upRP@&lP(Cn1>yToa7k%U~9kx>LOHym2&dTk+q6L~F8 z@HK2-nxh!&Fi80LqlYq1{5kXF!#{9k0tZkSypbC_ z*6`*_a}HZo?NFX3ul;k3j4A@KEVS5v#Wz+bv)}6~RWKXjkMt|hVwX98ymA3Q1EWVv z^jtL!P%DisOLihs??K2iGecP!J1T~~VnSd%*y9P@dR~(%n6plsP&jK$z05ZbeDz&#?vovt zvL)oh)^}gSoRWRoRzcUFu9zBD>s{Q%a3> z=2!7j3eUZv*SB|vZ8VlD>f`vHb%3iMHnL+9MTiw59u3@4YEC3*09BvcymG3|?J(&A zGCjWCnbG1?h6-5Mysvigq}?MObE zOr6KW)b^e9jo9Dvdr(3_j7sL1u+d%*x8Ib>^gL_PM|u-9$7DuPg_s2XYwL-X&!{Ff zJ_5{bk@=0crQ|($Uhzy(N-3w}_@|8B%N#?ONMXDdO_GIbXV(WV^gK)Bc_6Pt(*fJY zd-26LKoWzMU^YPplwV5fpT1Ig}yjMgFayaK!P6v}rBU z=qcVZSJP3xbRxBN*F=0=UK)sH`0|AU(Mo~Fcz(~+y!@@}s znrO%dQhWHG%0I50Ok327k(1>T!fUjo=yl3if}k>>$EbU$v;AY|UoN#zt#{9-jXgBV zqd^f=6q0S_sxi`PG->@C>&<{X1Il}Err(cN`<{|&GN9Gp!JJQ zzB_LlI4hg1NtSa4$I&1ET}`jP88aKMF=bzDz|Xdm9wW4#?LgALf=Gj_?(;47dR830 zyRy9DBIOM~1WC*kNr3nlhphV_&#@lzW7-Z&zBD>_ykl~%r+hnPsA+I+go`^Q%(R12 z8E+aMlfi9nQuv1*m6!s^LfX9~Wef>!hN^FHV790_S^tr<8DRGJ&$ z49CH-nQhsbn=$!S3Mp=*)dGF0cE}X{zW(-9p4#iP6Ulb3D_V9-Qa&lI zRS9o54qW!VWT^c?T`YDo{j@)VuARx!FzLw<_mPtmrtA3Uj$}V!7_}cU?cQZwaFPIT zjH%+~>qyB9L&ZNu_zA>ib+RgGw`HF8w^;An)L8_`EV=nl_nq=tGi{vEuuj62N=Ba} z)OIo_5<;(;C^=P%xQau+WCT-p&^e22H}yQAD95E_tPG;0SgefWTD(^H%vxDGm?%qY zJ`ez$tS;9{=8o~%0*rJR&X;{+#UbWbTu?_Y zG(ev+>%SVPZ&|Z{$$A79+-Dd65tBV)4qZ}7k%dM3j`99nlk&D$+FU)$enDT=V}?5v zIy~+dZ+_JapGgo|aM*`W6ZH!r6=|&)Q7mDm(8GXv&q0tPzy+z&pQ+=OFuK|NPTW^{ zZvBWwKR@R(c$-e&Wvd|G*f&QFL!AaGDWO2!

6lHVwXB(3q@*WwPN|oXrc5xFMp}X-KBf;f%yR2CG6Iv z%E~Y`4VbFRWkn^JqT-F7>5JyU{}T8GV0>;x{oexFMNhj6f$)DP1cty+J~mz<1_5FI z7$5)J1_6-(RkcV}^~;L#N(WT-(-%ac|4%gc3it8_=wkxVUh*ne6h#qMw#NT07zzSA RmM(Yz6NIHvje&do{{RQr{0;yB literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png new file mode 100644 index 0000000000000000000000000000000000000000..481caf89be7fad60ad8f7610ea0727b23bc6e72f GIT binary patch literal 349 zcmV-j0iyniP)pYS_0IEb9*y$8ZQ@LBHO9}nF7-f@zZwangb=nM*yW|Zadiz_%qmz`jO z3hbiG(io#=Mp+79xP?P>Spq{mn6YPZeBuc%(Pc68(11sD**-qdf>(4|7;k99r)9v6 z4V`5&UeQ57>(C>LI?950#tY@fI-HCe)aA@>>w&xu`-h>U%yyW$2XZ&00000NkvXXu0mjf6Y-TU literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c33f9f38609fb07043bb6d861265f74abaac8909 GIT binary patch literal 811 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 aM*jiOnw!beb;(o!0000 +#import + +extern NSString * const SVProgressHUDDidReceiveTouchEventNotification; +extern NSString * const SVProgressHUDDidTouchDownInsideNotification; +extern NSString * const SVProgressHUDWillDisappearNotification; +extern NSString * const SVProgressHUDDidDisappearNotification; +extern NSString * const SVProgressHUDWillAppearNotification; +extern NSString * const SVProgressHUDDidAppearNotification; + +extern NSString * const SVProgressHUDStatusUserInfoKey; + +typedef NS_ENUM(NSUInteger, SVProgressHUDMaskType) { + SVProgressHUDMaskTypeNone = 1, // allow user interactions while HUD is displayed + SVProgressHUDMaskTypeClear, // don't allow user interactions + SVProgressHUDMaskTypeBlack, // don't allow user interactions and dim the UI in the back of the HUD + SVProgressHUDMaskTypeGradient // don't allow user interactions and dim the UI with a a-la-alert-view background gradient +}; + +@interface SVProgressHUD : UIView + +#pragma mark - Customization + ++ (void)setBackgroundColor:(UIColor*)color; // default is [UIColor whiteColor] ++ (void)setForegroundColor:(UIColor*)color; // default is [UIColor blackColor] ++ (void)setRingThickness:(CGFloat)width; // default is 4 pt ++ (void)setFont:(UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] ++ (void)setInfoImage:(UIImage*)image; // default is the bundled info image provided by Freepik ++ (void)setSuccessImage:(UIImage*)image; // default is the bundled success image provided by Freepik ++ (void)setErrorImage:(UIImage*)image; // default is the bundled error image provided by Freepik ++ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone + +#pragma mark - Show Methods + ++ (void)show; ++ (void)showWithMaskType:(SVProgressHUDMaskType)maskType; ++ (void)showWithStatus:(NSString*)status; ++ (void)showWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType; + ++ (void)showProgress:(float)progress; ++ (void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType; ++ (void)showProgress:(float)progress status:(NSString*)status; ++ (void)showProgress:(float)progress status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType; + ++ (void)setStatus:(NSString*)string; // change the HUD loading status while it's showing + +// stops the activity indicator, shows a glyph + status, and dismisses HUD a little bit later ++ (void)showInfoWithStatus:(NSString *)string; ++ (void)showInfoWithStatus:(NSString *)string maskType:(SVProgressHUDMaskType)maskType; + ++ (void)showSuccessWithStatus:(NSString*)string; ++ (void)showSuccessWithStatus:(NSString*)string maskType:(SVProgressHUDMaskType)maskType; + ++ (void)showErrorWithStatus:(NSString *)string; ++ (void)showErrorWithStatus:(NSString *)string maskType:(SVProgressHUDMaskType)maskType; + +// use 28x28 white pngs ++ (void)showImage:(UIImage*)image status:(NSString*)status; ++ (void)showImage:(UIImage*)image status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType; + ++ (void)setOffsetFromCenter:(UIOffset)offset; ++ (void)resetOffsetFromCenter; + ++ (void)popActivity; // decrease activity count, if activity count == 0 the HUD is dismissed ++ (void)dismiss; + ++ (BOOL)isVisible; + +@end + diff --git a/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m new file mode 100644 index 0000000..43c6c6a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m @@ -0,0 +1,946 @@ +// +// SVProgressHUD.m +// +// Copyright 2011-2014 Sam Vermette. All rights reserved. +// +// https://github.com/samvermette/SVProgressHUD +// + +#if !__has_feature(objc_arc) +#error SVProgressHUD is ARC only. Either turn on ARC for the project or use -fobjc-arc flag +#endif + +#import "SVProgressHUD.h" +#import "SVIndefiniteAnimatedView.h" +#import + +NSString * const SVProgressHUDDidReceiveTouchEventNotification = @"SVProgressHUDDidReceiveTouchEventNotification"; +NSString * const SVProgressHUDDidTouchDownInsideNotification = @"SVProgressHUDDidTouchDownInsideNotification"; +NSString * const SVProgressHUDWillDisappearNotification = @"SVProgressHUDWillDisappearNotification"; +NSString * const SVProgressHUDDidDisappearNotification = @"SVProgressHUDDidDisappearNotification"; +NSString * const SVProgressHUDWillAppearNotification = @"SVProgressHUDWillAppearNotification"; +NSString * const SVProgressHUDDidAppearNotification = @"SVProgressHUDDidAppearNotification"; + +NSString * const SVProgressHUDStatusUserInfoKey = @"SVProgressHUDStatusUserInfoKey"; + +static UIColor *SVProgressHUDBackgroundColor; +static UIColor *SVProgressHUDForegroundColor; +static CGFloat SVProgressHUDRingThickness; +static UIFont *SVProgressHUDFont; +static UIImage *SVProgressHUDInfoImage; +static UIImage *SVProgressHUDSuccessImage; +static UIImage *SVProgressHUDErrorImage; +static SVProgressHUDMaskType SVProgressHUDDefaultMaskType; + +static const CGFloat SVProgressHUDRingRadius = 18; +static const CGFloat SVProgressHUDRingNoTextRadius = 24; +static const CGFloat SVProgressHUDParallaxDepthPoints = 10; +static const CGFloat SVProgressHUDUndefinedProgress = -1; + +@interface SVProgressHUD () + +@property (nonatomic, readwrite) SVProgressHUDMaskType maskType; +@property (nonatomic, strong, readonly) NSTimer *fadeOutTimer; +@property (nonatomic, readonly, getter = isClear) BOOL clear; + +@property (nonatomic, strong) UIControl *overlayView; +@property (nonatomic, strong) UIView *hudView; +@property (nonatomic, strong) UILabel *stringLabel; +@property (nonatomic, strong) UIImageView *imageView; +@property (nonatomic, strong) SVIndefiniteAnimatedView *indefiniteAnimatedView; + +@property (nonatomic, readwrite) CGFloat progress; +@property (nonatomic, readwrite) NSUInteger activityCount; +@property (nonatomic, strong) CAShapeLayer *backgroundRingLayer; +@property (nonatomic, strong) CAShapeLayer *ringLayer; + +@property (nonatomic, readonly) CGFloat visibleKeyboardHeight; +@property (nonatomic, assign) UIOffset offsetFromCenter; + + +- (void)showProgress:(float)progress status:(NSString*)string maskType:(SVProgressHUDMaskType)hudMaskType; +- (void)showImage:(UIImage*)image status:(NSString*)status duration:(NSTimeInterval)duration maskType:(SVProgressHUDMaskType)hudMaskType; + +- (void)dismiss; + +- (void)setStatus:(NSString*)string; +- (void)registerNotifications; +- (NSDictionary *)notificationUserInfo; +- (void)moveToPoint:(CGPoint)newCenter rotateAngle:(CGFloat)angle; +- (void)positionHUD:(NSNotification*)notification; +- (NSTimeInterval)displayDurationForString:(NSString*)string; + +@end + + +@implementation SVProgressHUD + ++ (SVProgressHUD*)sharedView { + static dispatch_once_t once; + static SVProgressHUD *sharedView; + dispatch_once(&once, ^ { sharedView = [[self alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; }); + return sharedView; +} + + +#pragma mark - Setters + ++ (void)setStatus:(NSString *)string { + [[self sharedView] setStatus:string]; +} + ++ (void)setBackgroundColor:(UIColor *)color { + [self sharedView].hudView.backgroundColor = color; + SVProgressHUDBackgroundColor = color; +} + ++ (void)setForegroundColor:(UIColor *)color { + [self sharedView]; + SVProgressHUDForegroundColor = color; +} + ++ (void)setFont:(UIFont *)font { + [self sharedView]; + SVProgressHUDFont = font; +} + ++ (void)setRingThickness:(CGFloat)width { + [self sharedView]; + SVProgressHUDRingThickness = width; +} + ++ (void)setInfoImage:(UIImage*)image{ + [self sharedView]; + SVProgressHUDInfoImage = image; +} + ++ (void)setSuccessImage:(UIImage *)image { + [self sharedView]; + SVProgressHUDSuccessImage = image; +} + ++ (void)setErrorImage:(UIImage *)image { + [self sharedView]; + SVProgressHUDErrorImage = image; +} + ++ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType{ + [self sharedView]; + SVProgressHUDDefaultMaskType = maskType; +} + + +#pragma mark - Show Methods + ++ (void)show { + [self showWithStatus:nil]; +} + ++ (void)showWithMaskType:(SVProgressHUDMaskType)maskType { + [self showProgress:SVProgressHUDUndefinedProgress maskType:maskType]; +} + ++ (void)showWithStatus:(NSString *)status { + [self showProgress:SVProgressHUDUndefinedProgress status:status]; +} + ++ (void)showWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType { + [self showProgress:SVProgressHUDUndefinedProgress status:status maskType:maskType]; +} + ++ (void)showProgress:(float)progress { + [self sharedView]; + [self showProgress:progress maskType:SVProgressHUDDefaultMaskType]; +} + ++ (void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType{ + [self showProgress:progress status:nil maskType:maskType]; +} + ++ (void)showProgress:(float)progress status:(NSString *)status { + [self sharedView]; + [self showProgress:progress status:status maskType:SVProgressHUDDefaultMaskType]; +} + ++ (void)showProgress:(float)progress status:(NSString *)status maskType:(SVProgressHUDMaskType)maskType { + [[self sharedView] showProgress:progress status:status maskType:maskType]; +} + + +#pragma mark - Show then dismiss methods + ++ (void)showInfoWithStatus:(NSString *)string { + [self sharedView]; + [self showInfoWithStatus:string maskType:SVProgressHUDDefaultMaskType]; +} + ++ (void)showInfoWithStatus:(NSString *)string maskType:(SVProgressHUDMaskType)maskType { + [self sharedView]; + [self showImage:SVProgressHUDInfoImage status:string maskType:maskType]; +} + ++ (void)showSuccessWithStatus:(NSString *)string { + [self sharedView]; + [self showSuccessWithStatus:string maskType:SVProgressHUDDefaultMaskType]; +} + ++ (void)showSuccessWithStatus:(NSString *)string maskType:(SVProgressHUDMaskType)maskType { + [self sharedView]; + [self showImage:SVProgressHUDSuccessImage status:string maskType:maskType]; +} + ++ (void)showErrorWithStatus:(NSString *)string { + [self sharedView]; + [self showErrorWithStatus:string maskType:SVProgressHUDDefaultMaskType]; +} + ++ (void)showErrorWithStatus:(NSString *)string maskType:(SVProgressHUDMaskType)maskType { + [self sharedView]; + [self showImage:SVProgressHUDErrorImage status:string maskType:maskType]; +} + ++ (void)showImage:(UIImage *)image status:(NSString *)string { + [self sharedView]; + [self showImage:image status:string maskType:SVProgressHUDDefaultMaskType]; +} + ++ (void)showImage:(UIImage *)image status:(NSString *)string maskType:(SVProgressHUDMaskType)maskType { + NSTimeInterval displayInterval = [[self sharedView] displayDurationForString:string]; + [[self sharedView] showImage:image status:string duration:displayInterval maskType:maskType]; +} + + +#pragma mark - Dismiss Methods + ++ (void)popActivity { + if([self sharedView].activityCount > 0) + [self sharedView].activityCount--; + if([self sharedView].activityCount == 0) + [[self sharedView] dismiss]; +} + ++ (void)dismiss { + if ([self isVisible]) { + [[self sharedView] dismiss]; + } +} + + +#pragma mark - Offset + ++ (void)setOffsetFromCenter:(UIOffset)offset { + [self sharedView].offsetFromCenter = offset; +} + ++ (void)resetOffsetFromCenter { + [self setOffsetFromCenter:UIOffsetZero]; +} + + +#pragma mark - Instance Methods + +- (id)initWithFrame:(CGRect)frame { + if ((self = [super initWithFrame:frame])) { + self.userInteractionEnabled = NO; + self.backgroundColor = [UIColor clearColor]; + self.alpha = 0.0f; + self.activityCount = 0; + + SVProgressHUDBackgroundColor = [UIColor whiteColor]; + SVProgressHUDForegroundColor = [UIColor blackColor]; + if ([UIFont respondsToSelector:@selector(preferredFontForTextStyle:)]) { + SVProgressHUDFont = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + } else { + SVProgressHUDFont = [UIFont systemFontOfSize:14.0f]; + SVProgressHUDBackgroundColor = [UIColor colorWithWhite:0.0f alpha:0.8f]; + SVProgressHUDForegroundColor = [UIColor whiteColor]; + } + if ([[UIImage class] instancesRespondToSelector:@selector(imageWithRenderingMode:)]) { + SVProgressHUDInfoImage = [[UIImage imageNamed:@"SVProgressHUD.bundle/info"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + SVProgressHUDSuccessImage = [[UIImage imageNamed:@"SVProgressHUD.bundle/success"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + SVProgressHUDErrorImage = [[UIImage imageNamed:@"SVProgressHUD.bundle/error"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } else { + SVProgressHUDInfoImage = [UIImage imageNamed:@"SVProgressHUD.bundle/info"]; + SVProgressHUDSuccessImage = [UIImage imageNamed:@"SVProgressHUD.bundle/success"]; + SVProgressHUDErrorImage = [UIImage imageNamed:@"SVProgressHUD.bundle/error"]; + } + SVProgressHUDRingThickness = 2; + SVProgressHUDDefaultMaskType = SVProgressHUDMaskTypeNone; + } + + return self; +} + +- (void)drawRect:(CGRect)rect { + CGContextRef context = UIGraphicsGetCurrentContext(); + + switch (self.maskType) { + case SVProgressHUDMaskTypeBlack: { + + [[UIColor colorWithWhite:0 alpha:0.5] set]; + CGContextFillRect(context, self.bounds); + + break; + } + case SVProgressHUDMaskTypeGradient: { + + size_t locationsCount = 2; + CGFloat locations[2] = {0.0f, 1.0f}; + CGFloat colors[8] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.75f}; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount); + CGColorSpaceRelease(colorSpace); + + CGFloat freeHeight = CGRectGetHeight(self.bounds) - self.visibleKeyboardHeight; + + CGPoint center = CGPointMake(CGRectGetWidth(self.bounds)/2, freeHeight/2); + float radius = MIN(CGRectGetWidth(self.bounds) , CGRectGetHeight(self.bounds)) ; + CGContextDrawRadialGradient (context, gradient, center, 0, center, radius, kCGGradientDrawsAfterEndLocation); + CGGradientRelease(gradient); + + break; + } + default: + break; + } +} + +- (void)updatePosition { + + CGFloat hudWidth = 100.0f; + CGFloat hudHeight = 100.0f; + CGFloat stringHeightBuffer = 20.0f; + CGFloat stringAndContentHeightBuffer = 80.0f; + + CGFloat stringWidth = 0.0f; + CGFloat stringHeight = 0.0f; + CGRect labelRect = CGRectZero; + + NSString *string = self.stringLabel.text; + + // Check if an image or progress ring is displayed + BOOL imageUsed = (self.imageView.image) || (self.imageView.hidden); + BOOL progressUsed = (self.progress != SVProgressHUDUndefinedProgress) && (self.progress >= 0.0f); + + if(string) { + CGSize constraintSize = CGSizeMake(200.0f, 300.0f); + CGRect stringRect; + if ([string respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) { + stringRect = [string boundingRectWithSize:constraintSize + options:(NSStringDrawingUsesFontLeading|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin) + attributes:@{NSFontAttributeName: self.stringLabel.font} + context:NULL]; + } else { + CGSize stringSize; + + if ([string respondsToSelector:@selector(sizeWithAttributes:)]) + stringSize = [string sizeWithAttributes:@{NSFontAttributeName:[UIFont fontWithName:self.stringLabel.font.fontName size:self.stringLabel.font.pointSize]}]; + else +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" + stringSize = [string sizeWithFont:self.stringLabel.font constrainedToSize:CGSizeMake(200.0f, 300.0f)]; +#pragma clang diagnostic pop + + stringRect = CGRectMake(0.0f, 0.0f, stringSize.width, stringSize.height); + } + stringWidth = stringRect.size.width; + stringHeight = ceil(CGRectGetHeight(stringRect)); + + if (imageUsed || progressUsed) + hudHeight = stringAndContentHeightBuffer + stringHeight; + else + hudHeight = stringHeightBuffer + stringHeight; + + if(stringWidth > hudWidth) + hudWidth = ceil(stringWidth/2)*2; + + CGFloat labelRectY = (imageUsed || progressUsed) ? 68.0f : 9.0f; + + if(hudHeight > 100.0f) { + labelRect = CGRectMake(12.0f, labelRectY, hudWidth, stringHeight); + hudWidth += 24.0f; + } else { + hudWidth += 24.0f; + labelRect = CGRectMake(0.0f, labelRectY, hudWidth, stringHeight); + } + } + + self.hudView.bounds = CGRectMake(0.0f, 0.0f, hudWidth, hudHeight); + + if(string) + self.imageView.center = CGPointMake(CGRectGetWidth(self.hudView.bounds)/2, 36.0f); + else + self.imageView.center = CGPointMake(CGRectGetWidth(self.hudView.bounds)/2, CGRectGetHeight(self.hudView.bounds)/2); + + self.stringLabel.hidden = NO; + self.stringLabel.frame = labelRect; + + [CATransaction begin]; + [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; + + if(string) { + self.indefiniteAnimatedView.radius = SVProgressHUDRingRadius; + [self.indefiniteAnimatedView sizeToFit]; + + CGPoint center = CGPointMake((CGRectGetWidth(self.hudView.bounds)/2), 36.0f); + self.indefiniteAnimatedView.center = center; + + if(self.progress != SVProgressHUDUndefinedProgress) + self.backgroundRingLayer.position = self.ringLayer.position = CGPointMake((CGRectGetWidth(self.hudView.bounds)/2), 36.0f); + } else { + self.indefiniteAnimatedView.radius = SVProgressHUDRingNoTextRadius; + [self.indefiniteAnimatedView sizeToFit]; + + CGPoint center = CGPointMake((CGRectGetWidth(self.hudView.bounds)/2), CGRectGetHeight(self.hudView.bounds)/2); + self.indefiniteAnimatedView.center = center; + + if(self.progress != SVProgressHUDUndefinedProgress) + self.backgroundRingLayer.position = self.ringLayer.position = CGPointMake((CGRectGetWidth(self.hudView.bounds)/2), CGRectGetHeight(self.hudView.bounds)/2); + } + + [CATransaction commit]; +} + +- (void)setStatus:(NSString *)string { + self.stringLabel.text = string; + [self updatePosition]; + +} + +- (void)setFadeOutTimer:(NSTimer *)newTimer { + if(_fadeOutTimer) + [_fadeOutTimer invalidate], _fadeOutTimer = nil; + + if(newTimer) + _fadeOutTimer = newTimer; +} + + +- (void)registerNotifications { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIApplicationDidChangeStatusBarOrientationNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIKeyboardWillHideNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIKeyboardDidHideNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIKeyboardWillShowNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIKeyboardDidShowNotification + object:nil]; +} + + +- (NSDictionary *)notificationUserInfo{ + return (self.stringLabel.text ? @{SVProgressHUDStatusUserInfoKey : self.stringLabel.text} : nil); +} + + +- (void)positionHUD:(NSNotification*)notification { + + CGFloat keyboardHeight = 0.0f; + double animationDuration = 0.0; + + self.frame = UIScreen.mainScreen.bounds; + + UIInterfaceOrientation orientation = UIApplication.sharedApplication.statusBarOrientation; + // no transforms applied to window in iOS 8, but only if compiled with iOS 8 sdk as base sdk, otherwise system supports old rotation logic. + BOOL ignoreOrientation = NO; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 + if ([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]) { + ignoreOrientation = YES; + } +#endif + + if(notification) { + NSDictionary* keyboardInfo = [notification userInfo]; + CGRect keyboardFrame = [[keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]; + animationDuration = [[keyboardInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + + if(notification.name == UIKeyboardWillShowNotification || notification.name == UIKeyboardDidShowNotification) { + if(ignoreOrientation || UIInterfaceOrientationIsPortrait(orientation)) + keyboardHeight = CGRectGetHeight(keyboardFrame); + else + keyboardHeight = CGRectGetWidth(keyboardFrame); + } + } else { + keyboardHeight = self.visibleKeyboardHeight; + } + + CGRect orientationFrame = self.bounds; + CGRect statusBarFrame = UIApplication.sharedApplication.statusBarFrame; + + if(!ignoreOrientation && UIInterfaceOrientationIsLandscape(orientation)) { + float temp = CGRectGetWidth(orientationFrame); + orientationFrame.size.width = CGRectGetHeight(orientationFrame); + orientationFrame.size.height = temp; + + temp = CGRectGetWidth(statusBarFrame); + statusBarFrame.size.width = CGRectGetHeight(statusBarFrame); + statusBarFrame.size.height = temp; + } + + CGFloat activeHeight = CGRectGetHeight(orientationFrame); + + if(keyboardHeight > 0) + activeHeight += CGRectGetHeight(statusBarFrame)*2; + + activeHeight -= keyboardHeight; + CGFloat posY = floor(activeHeight*0.45); + CGFloat posX = CGRectGetWidth(orientationFrame)/2; + + CGPoint newCenter; + CGFloat rotateAngle; + + if (ignoreOrientation) { + rotateAngle = 0.0; + newCenter = CGPointMake(posX, posY); + } else { + switch (orientation) { + case UIInterfaceOrientationPortraitUpsideDown: + rotateAngle = M_PI; + newCenter = CGPointMake(posX, CGRectGetHeight(orientationFrame)-posY); + break; + case UIInterfaceOrientationLandscapeLeft: + rotateAngle = -M_PI/2.0f; + newCenter = CGPointMake(posY, posX); + break; + case UIInterfaceOrientationLandscapeRight: + rotateAngle = M_PI/2.0f; + newCenter = CGPointMake(CGRectGetHeight(orientationFrame)-posY, posX); + break; + default: // as UIInterfaceOrientationPortrait + rotateAngle = 0.0; + newCenter = CGPointMake(posX, posY); + break; + } + } + + if(notification) { + [UIView animateWithDuration:animationDuration + delay:0 + options:UIViewAnimationOptionAllowUserInteraction + animations:^{ + [self moveToPoint:newCenter rotateAngle:rotateAngle]; + [self.hudView setNeedsDisplay]; + } completion:NULL]; + } else { + [self moveToPoint:newCenter rotateAngle:rotateAngle]; + [self.hudView setNeedsDisplay]; + } + +} + +- (void)moveToPoint:(CGPoint)newCenter rotateAngle:(CGFloat)angle { + self.hudView.transform = CGAffineTransformMakeRotation(angle); + self.hudView.center = CGPointMake(newCenter.x + self.offsetFromCenter.horizontal, newCenter.y + self.offsetFromCenter.vertical); +} + +- (void)overlayViewDidReceiveTouchEvent:(id)sender forEvent:(UIEvent *)event { + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidReceiveTouchEventNotification object:event]; + + UITouch *touch = event.allTouches.anyObject; + CGPoint touchLocation = [touch locationInView:self]; + + if (CGRectContainsPoint(self.hudView.frame, touchLocation)) { + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidTouchDownInsideNotification object:event]; + } +} + + +#pragma mark - Master show/dismiss methods + +- (void)showProgress:(float)progress status:(NSString*)string maskType:(SVProgressHUDMaskType)hudMaskType { + if(!self.overlayView.superview){ + NSEnumerator *frontToBackWindows = [UIApplication.sharedApplication.windows reverseObjectEnumerator]; + UIScreen *mainScreen = UIScreen.mainScreen; + + for (UIWindow *window in frontToBackWindows) + if (window.screen == mainScreen && window.windowLevel == UIWindowLevelNormal) { + [window addSubview:self.overlayView]; + break; + } + } else { + // Ensure that overlay will be exactly on top of rootViewController (which may be changed during runtime). + [self.overlayView.superview bringSubviewToFront:self.overlayView]; + } + + if(!self.superview) + [self.overlayView addSubview:self]; + + self.fadeOutTimer = nil; + self.imageView.hidden = YES; + self.maskType = hudMaskType; + self.progress = progress; + + self.stringLabel.text = string; + [self updatePosition]; + + if(progress >= 0) { + self.imageView.image = nil; + self.imageView.hidden = NO; + [self.indefiniteAnimatedView removeFromSuperview]; + + self.ringLayer.strokeEnd = progress; + + if(progress == 0) + self.activityCount++; + } else { + self.activityCount++; + [self cancelRingLayerAnimation]; + [self.hudView addSubview:self.indefiniteAnimatedView]; + } + + if(self.maskType != SVProgressHUDMaskTypeNone) { + self.overlayView.userInteractionEnabled = YES; + self.accessibilityLabel = string; + self.isAccessibilityElement = YES; + } else { + self.overlayView.userInteractionEnabled = NO; + self.hudView.accessibilityLabel = string; + self.hudView.isAccessibilityElement = YES; + } + + [self.overlayView setHidden:NO]; + self.overlayView.backgroundColor = [UIColor clearColor]; + [self positionHUD:nil]; + + if(self.alpha != 1 || self.hudView.alpha != 1) { + NSDictionary *userInfo = [self notificationUserInfo]; + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDWillAppearNotification + object:nil + userInfo:userInfo]; + + [self registerNotifications]; + self.hudView.transform = CGAffineTransformScale(self.hudView.transform, 1.3, 1.3); + + if(self.isClear) { + self.alpha = 1; + self.hudView.alpha = 0; + } + + [UIView animateWithDuration:0.15 + delay:0 + options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState + animations:^{ + self.hudView.transform = CGAffineTransformScale(self.hudView.transform, 1/1.3, 1/1.3); + + if(self.isClear) // handle iOS 7 and 8 UIToolbar which not answers well to hierarchy opacity change + self.hudView.alpha = 1; + else + self.alpha = 1; + } + completion:^(BOOL finished){ + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidAppearNotification + object:nil + userInfo:userInfo]; + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); + UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, string); + }]; + + [self setNeedsDisplay]; + } +} + +- (UIImage *)image:(UIImage *)image withTintColor:(UIColor *)color{ + CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); + UIGraphicsBeginImageContextWithOptions(rect.size, NO, image.scale); + CGContextRef c = UIGraphicsGetCurrentContext(); + [image drawInRect:rect]; + CGContextSetFillColorWithColor(c, [color CGColor]); + CGContextSetBlendMode(c, kCGBlendModeSourceAtop); + CGContextFillRect(c, rect); + UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return tintedImage; +} + +- (void)showImage:(UIImage *)image status:(NSString *)string duration:(NSTimeInterval)duration maskType:(SVProgressHUDMaskType)hudMaskType { + self.progress = SVProgressHUDUndefinedProgress; + [self cancelRingLayerAnimation]; + + if(![self.class isVisible]) + [self.class show]; + + if ([self.imageView respondsToSelector:@selector(setTintColor:)]) { + self.imageView.tintColor = SVProgressHUDForegroundColor; + } else { + image = [self image:image withTintColor:SVProgressHUDForegroundColor]; + } + self.imageView.image = image; + self.imageView.hidden = NO; + self.maskType = hudMaskType; + + self.stringLabel.text = string; + [self updatePosition]; + [self.indefiniteAnimatedView removeFromSuperview]; + + if(self.maskType != SVProgressHUDMaskTypeNone) { + self.accessibilityLabel = string; + self.isAccessibilityElement = YES; + } else { + self.hudView.accessibilityLabel = string; + self.hudView.isAccessibilityElement = YES; + } + + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); + UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, string); + + self.fadeOutTimer = [NSTimer timerWithTimeInterval:duration target:self selector:@selector(dismiss) userInfo:nil repeats:NO]; + [[NSRunLoop mainRunLoop] addTimer:self.fadeOutTimer forMode:NSRunLoopCommonModes]; +} + +- (void)dismiss { + NSDictionary *userInfo = [self notificationUserInfo]; + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDWillDisappearNotification + object:nil + userInfo:userInfo]; + + self.activityCount = 0; + [UIView animateWithDuration:0.15 + delay:0 + options:UIViewAnimationCurveEaseIn | UIViewAnimationOptionAllowUserInteraction + animations:^{ + self.hudView.transform = CGAffineTransformScale(self.hudView.transform, 0.8f, 0.8f); + if(self.isClear) // handle iOS 7 UIToolbar not answer well to hierarchy opacity change + self.hudView.alpha = 0.0f; + else + self.alpha = 0.0f; + } + completion:^(BOOL finished){ + if(self.alpha == 0.0f || self.hudView.alpha == 0.0f) { + self.alpha = 0.0f; + self.hudView.alpha = 0.0f; + + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [self cancelRingLayerAnimation]; + [_hudView removeFromSuperview]; + _hudView = nil; + + [_overlayView removeFromSuperview]; + _overlayView = nil; + + [_indefiniteAnimatedView removeFromSuperview]; + _indefiniteAnimatedView = nil; + + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); + + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidDisappearNotification + object:nil + userInfo:userInfo]; + + // Tell the rootViewController to update the StatusBar appearance + UIViewController *rootController = [[UIApplication sharedApplication] keyWindow].rootViewController; + if ([rootController respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { + [rootController setNeedsStatusBarAppearanceUpdate]; + } + // uncomment to make sure UIWindow is gone from app.windows + //NSLog(@"%@", [UIApplication sharedApplication].windows); + //NSLog(@"keyWindow = %@", [UIApplication sharedApplication].keyWindow); + } + }]; +} + + +#pragma mark - Ring progress animation + +- (SVIndefiniteAnimatedView *)indefiniteAnimatedView { + if (_indefiniteAnimatedView == nil) { + _indefiniteAnimatedView = [[SVIndefiniteAnimatedView alloc] initWithFrame:CGRectZero]; + _indefiniteAnimatedView.strokeThickness = SVProgressHUDRingThickness; + _indefiniteAnimatedView.strokeColor = SVProgressHUDForegroundColor; + _indefiniteAnimatedView.radius = self.stringLabel.text ? SVProgressHUDRingRadius : SVProgressHUDRingNoTextRadius; + [_indefiniteAnimatedView sizeToFit]; + } + return _indefiniteAnimatedView; +} + +- (CAShapeLayer *)ringLayer { + if(!_ringLayer) { + CGPoint center = CGPointMake(CGRectGetWidth(_hudView.frame)/2, CGRectGetHeight(_hudView.frame)/2); + _ringLayer = [self createRingLayerWithCenter:center + radius:SVProgressHUDRingRadius + lineWidth:SVProgressHUDRingThickness + color:SVProgressHUDForegroundColor]; + [self.hudView.layer addSublayer:_ringLayer]; + } + return _ringLayer; +} + +- (CAShapeLayer *)backgroundRingLayer { + if(!_backgroundRingLayer) { + CGPoint center = CGPointMake(CGRectGetWidth(_hudView.frame)/2, CGRectGetHeight(_hudView.frame)/2); + _backgroundRingLayer = [self createRingLayerWithCenter:center + radius:SVProgressHUDRingRadius + lineWidth:SVProgressHUDRingThickness + color:[SVProgressHUDForegroundColor colorWithAlphaComponent:0.1f]]; + _backgroundRingLayer.strokeEnd = 1; + [self.hudView.layer addSublayer:_backgroundRingLayer]; + } + return _backgroundRingLayer; +} + +- (void)cancelRingLayerAnimation { + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + [_hudView.layer removeAllAnimations]; + + _ringLayer.strokeEnd = 0.0f; + if (_ringLayer.superlayer) { + [_ringLayer removeFromSuperlayer]; + } + _ringLayer = nil; + + if (_backgroundRingLayer.superlayer) { + [_backgroundRingLayer removeFromSuperlayer]; + } + _backgroundRingLayer = nil; + + [CATransaction commit]; +} + +- (CAShapeLayer *)createRingLayerWithCenter:(CGPoint)center radius:(CGFloat)radius lineWidth:(CGFloat)lineWidth color:(UIColor *)color { + + UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(radius, radius) radius:radius startAngle:-M_PI_2 endAngle:(M_PI + M_PI_2) clockwise:YES]; + + CAShapeLayer *slice = [CAShapeLayer layer]; + slice.contentsScale = [[UIScreen mainScreen] scale]; + slice.frame = CGRectMake(center.x-radius, center.y-radius, radius*2, radius*2); + slice.fillColor = [UIColor clearColor].CGColor; + slice.strokeColor = color.CGColor; + slice.lineWidth = lineWidth; + slice.lineCap = kCALineCapRound; + slice.lineJoin = kCALineJoinBevel; + slice.path = smoothedPath.CGPath; + + return slice; +} + +#pragma mark - Utilities + ++ (BOOL)isVisible { + return ([self sharedView].alpha == 1); +} + + +#pragma mark - Getters + +- (NSTimeInterval)displayDurationForString:(NSString*)string { + return MIN((float)string.length*0.06 + 0.5, 5.0); +} + +- (BOOL)isClear { // used for iOS 7 and above + return (self.maskType == SVProgressHUDMaskTypeClear || self.maskType == SVProgressHUDMaskTypeNone); +} + +- (UIControl *)overlayView { + if(!_overlayView) { + _overlayView = [[UIControl alloc] initWithFrame:[UIScreen mainScreen].bounds]; + _overlayView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + _overlayView.backgroundColor = [UIColor clearColor]; + [_overlayView addTarget:self action:@selector(overlayViewDidReceiveTouchEvent:forEvent:) forControlEvents:UIControlEventTouchDown]; + } + return _overlayView; +} + +- (UIView *)hudView { + if(!_hudView) { + _hudView = [[UIView alloc] initWithFrame:CGRectZero]; + _hudView.backgroundColor = SVProgressHUDBackgroundColor; + _hudView.layer.cornerRadius = 14; + _hudView.layer.masksToBounds = YES; + + _hudView.autoresizingMask = (UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | + UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin); + + if ([_hudView respondsToSelector:@selector(addMotionEffect:)]) { + UIInterpolatingMotionEffect *effectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath: @"center.x" type: UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis]; + effectX.minimumRelativeValue = @(-SVProgressHUDParallaxDepthPoints); + effectX.maximumRelativeValue = @(SVProgressHUDParallaxDepthPoints); + + UIInterpolatingMotionEffect *effectY = [[UIInterpolatingMotionEffect alloc] initWithKeyPath: @"center.y" type: UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis]; + effectY.minimumRelativeValue = @(-SVProgressHUDParallaxDepthPoints); + effectY.maximumRelativeValue = @(SVProgressHUDParallaxDepthPoints); + + UIMotionEffectGroup *effectGroup = [[UIMotionEffectGroup alloc] init]; + effectGroup.motionEffects = @[effectX, effectY]; + [_hudView addMotionEffect:effectGroup]; + } + } + + if(!_hudView.superview) + [self addSubview:_hudView]; + + return _hudView; +} + +- (UILabel *)stringLabel { + if (!_stringLabel) { + _stringLabel = [[UILabel alloc] initWithFrame:CGRectZero]; + _stringLabel.backgroundColor = [UIColor clearColor]; + _stringLabel.adjustsFontSizeToFitWidth = YES; + _stringLabel.textAlignment = NSTextAlignmentCenter; + _stringLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters; + _stringLabel.numberOfLines = 0; + } + + if(!_stringLabel.superview) + [self.hudView addSubview:_stringLabel]; + + _stringLabel.textColor = SVProgressHUDForegroundColor; + _stringLabel.font = SVProgressHUDFont; + + return _stringLabel; +} + +- (UIImageView *)imageView { + if (!_imageView) + _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 28.0f, 28.0f)]; + + if(!_imageView.superview) + [self.hudView addSubview:_imageView]; + + return _imageView; +} + + +- (CGFloat)visibleKeyboardHeight { + UIWindow *keyboardWindow = nil; + for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { + if(![[testWindow class] isEqual:[UIWindow class]]) { + keyboardWindow = testWindow; + break; + } + } + + for (__strong UIView *possibleKeyboard in [keyboardWindow subviews]) { + if ([possibleKeyboard isKindOfClass:NSClassFromString(@"UIPeripheralHostView")] || [possibleKeyboard isKindOfClass:NSClassFromString(@"UIKeyboard")]) { + return CGRectGetHeight(possibleKeyboard.bounds); + } else if ([possibleKeyboard isKindOfClass:NSClassFromString(@"UIInputSetContainerView")]) { + for (__strong UIView *possibleKeyboardSubview in [possibleKeyboard subviews]) { + if ([possibleKeyboardSubview isKindOfClass:NSClassFromString(@"UIInputSetHostView")]) { + return CGRectGetHeight(possibleKeyboardSubview.bounds); + } + } + } + } + + return 0; +} + +@end + diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/LICENSE.txt b/iOSStudy/iOSStudy/Pods/SVWebViewController/LICENSE.txt new file mode 100644 index 0000000..0dfab08 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2011 Sam Vermette + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/README.md b/iOSStudy/iOSStudy/Pods/SVWebViewController/README.md new file mode 100644 index 0000000..c8d1736 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/README.md @@ -0,0 +1,52 @@ +# SVWebViewController + +SVWebViewController is a simple inline browser for your iOS 7 app. + +![SVWebViewController](http://cl.ly/SQVO/download/GitHub.png) + +**SVWebViewController features:** + +* iPhone and iPad distinct UIs +* full landscape orientation support +* back, forward, stop/refresh and share buttons +* Open in Safari and Chrome UIActivities +* navbar title set to the currently visible web page +* talks with `setNetworkActivityIndicatorVisible` + +## Installation + +### CocoaPods + +I'm not a big fan of CocoaPods, so tend to not keep it updated. If you really want to use SVWebViewController with CocoaPods, I suggest you use `pod 'SVWebViewController', :head` to pull from the `master` branch directly. I'm usually careful about what I push there and is the version I use myself in all my projects. + +### Manually + +* Drag the `SVWebViewController/SVWebViewController` folder into your project. +* `#import "SVWebViewController.h"` + +## Usage + +(see sample Xcode project in `/Demo`) + +Just like any UIViewController, SVWebViewController can be pushed into a UINavigationController stack: + +```objective-c +SVWebViewController *webViewController = [[SVWebViewController alloc] initWithAddress:@"http://google.com"]; +[self.navigationController pushViewController:webViewController animated:YES]; +``` + +It can also be presented modally using `SVModalWebViewController`: + +```objective-c +SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithAddress:@"http://google.com"]; +[self presentModalViewController:webViewController animated:YES completion:NULL]; +``` + +### SVWebViewControllerActivity + +Starting in iOS 6 Apple uses `UIActivity` to let you show additional sharing methods in share sheets. `SVWebViewController` comes with "Open in Safari" and "Open in Chrome" activities. You can easily add your own activity by subclassing `SVWebViewControllerActivity` which takes care of a few things automatically for you. Have a look at the Safari and Chrome activities for implementation examples. Feel free to send it as a pull request once you're done! + + +## Credits + +SVWebViewController is brought to you by [Sam Vermette](http://samvermette.com) and [contributors to the project](https://github.com/samvermette/SVWebViewController/contributors). If you have feature suggestions or bug reports, feel free to help out by sending pull requests or by [creating new issues](https://github.com/samvermette/SVWebViewController/issues/new). If you're using SVWebViewController in your project, attribution is always appreciated. \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVModalWebViewController.h b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVModalWebViewController.h new file mode 100644 index 0000000..aa4d84c --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVModalWebViewController.h @@ -0,0 +1,20 @@ +// +// SVModalWebViewController.h +// +// Created by Oliver Letterer on 13.08.11. +// Copyright 2011 Home. All rights reserved. +// +// https://github.com/samvermette/SVWebViewController + +#import + +@class SVWebViewController; + +@interface SVModalWebViewController : UINavigationController + +- (id)initWithAddress:(NSString*)urlString; +- (id)initWithURL:(NSURL *)URL; + +@property (nonatomic, strong) UIColor *barsTintColor; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVModalWebViewController.m b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVModalWebViewController.m new file mode 100644 index 0000000..f801fa2 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVModalWebViewController.m @@ -0,0 +1,50 @@ +// +// SVModalWebViewController.m +// +// Created by Oliver Letterer on 13.08.11. +// Copyright 2011 Home. All rights reserved. +// +// https://github.com/samvermette/SVWebViewController + +#import "SVModalWebViewController.h" +#import "SVWebViewController.h" + +@interface SVModalWebViewController () + +@property (nonatomic, strong) SVWebViewController *webViewController; + +@end + + +@implementation SVModalWebViewController + +#pragma mark - Initialization + + +- (id)initWithAddress:(NSString*)urlString { + return [self initWithURL:[NSURL URLWithString:urlString]]; +} + +- (id)initWithURL:(NSURL *)URL { + self.webViewController = [[SVWebViewController alloc] initWithURL:URL]; + if (self = [super initWithRootViewController:self.webViewController]) { + UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone + target:self.webViewController + action:@selector(doneButtonClicked:)]; + + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) + self.webViewController.navigationItem.leftBarButtonItem = doneButton; + else + self.webViewController.navigationItem.rightBarButtonItem = doneButton; + } + return self; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:NO]; + + self.webViewController.title = self.title; + self.navigationBar.tintColor = self.barsTintColor; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack.png new file mode 100644 index 0000000000000000000000000000000000000000..195b4fd2bd02601003aaf51017b39ff36af58c01 GIT binary patch literal 1148 zcmbVM+iTNM7>`$UIF!l23u4Fw6-<+pOWTB2S)0}s?KW!FG6tF^r(4*PlO<=i9e81& zIG-I%5S4-AgD8r_yAHvM4?c*XqJoHjfFh!gda|z5haqAhIp;g)_kG{*yJf7qb7ynY zx+aREnll|*j;t%l+q!Hi`FdAY-XzOfoGRcwsD#V92dQ=w6(OCm^*)$`x>+5124fVp z$hYzZT*&TL4P=M(028X%F43l_*p7;;8v_v2Mc8LKapv>AM+|M5ab~}q<+E-Q_FEkz z9^5n1nKwoT48>%2Y^P%tl^C!g*6E5p==f?S&dk_V$v!yd7Pq9`0MaDu=R1nXBFtXEjaZ);f4pl^7Vi!J2PfknNDhH;!BOzR=oZZOw9DeKhPDq#mWVhBC?B-yH=&!ba`# zEK(GGP(#MB4IP}(;taV7nU<;QMoH02qRB=LzQjsKSY#Es6lKFj0fI0H7nPFIurr^2 zLQeDPl$er4kOUwlD&a^Xr9`5F6p6^Z5N_yZ93ShB0UN$8;=4V;%St-Q|5aB_dQiv6 z%Of<{=z{KkgpuEmTsoPgw`6t0asqj4P@{Ut8uY9~&`f*Cre~6@TJsS2x8Upg=Km&- zBc!;XQ~v0j#t~`9U^_PlM3|c-=#cU8$eeK7xl3fm&S$jteC6%gmrBzpSass#$??c_ zKlNmZw)nvrdXo9NF%dg+in3&3?LU+?i;8_=f3Q-t;DO zx;iPu{RI!@dXNAB literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack@2x.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef9aca3e38474423a4d0ad0ef0dae04b3dd6c16 GIT binary patch literal 1311 zcmeAS@N?(olHy`uVBq!ia0vp^5|6H_V+Po~;1FfbQqhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfuV_lxuu?= zsiBF5p^k!)fuXU!fw8`!v96(!m4T&|p{W8CC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vzP@mS^NOJX1q?F%io^naLp=li++2{qz^aQ&f>IIAz^b}9q_QAY zKPa_0zqBYB7$0fMFwMZQ!*3BtA<#8e{zaLx4BpamZnk1VU>sp$oS?HQ28KoMU8JZ);>0!=fwCPdPAEBTImFV-q0{r?f$$f$uf9D7wIx5_ z{%@19laFg|GEET3lsSySm5_5e8ZXv{Y~7H_BW_b{WIx_?1mMS;wS!*)LHRF zbdr5zWor#ji03^v&ej^4D<1zio{1FwU$9HwUFVl%={zE;U^ z+Tm5_{)w$)ateg!n15CtN5^k>}abH|5ZKned6W z-6z($rW{ua+R~8|?ZWlw_~-m3-V<$J6wBV+)R7bAQY1E!x7*{I(ximdKI;Vst0FZLfoB#j- literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext.png new file mode 100644 index 0000000000000000000000000000000000000000..453bc79e014f8b6264f41c12bfda5f68c894f291 GIT binary patch literal 1152 zcmbVMOK8+U7>-z^7OV8&s~2PRpkUsc-6nLEcC+g)xV3H_vGCbMm9lZnaH-PVJk zP!QdN_(G9-5EW7MqFC@CzKRMWhzC(@Q4bzeY!6;)5hrc8dMF|Wl9_+z|Nj5`Updm+ zvbDCRzJ{Wx+Eh}{kaY=pmsc+$U+?;|TVz>{<2l@h3b+V7NHv)#59yQ*x?lzZvwz=H z*hoBf>q4A>9@x@7k{zE+Ad({?qo4~}_;o>svX~Lv%#tL`4iWh?{6h5M^GFc~NFXNfT5}ROs1KT*pk?&LtS=%(nQn|- zjpvKSB3G0-FetH(zpi3IhrZ!iF1Cf8rL_8#gWHBa+aaj#Vn&WDuK?+48iXeq6*p%aA;25yt+akVavEpB`TFiq0 zBQJ|kZ>0-byAeiyH*)D%jNXt2hUEnE#-K(sA?why_Cqt_A)B5~vS!Ug;NOCu!JGe^ zJf4u^gHHLQb1Fxq9fR%M91vk{lAuGz$0Kuc^U}y3GGiB0dQ-Oa=H$!gH4DJ1!S~z8 zo{dyV^d#-uXKLyAH8$qoqy$QU97sU?Yvw4pl|$s-FJGl z3jH`WSYMuK9=u#%9)Gl&RqA))rjGKW6}!J)N}l-ucC?o#hdW-iU95_n(AU0x`|#76 z+nEptj`I6AtSm={Cf>-MS3gdj9-4R{4;>hhUkvX(7_z4Bozs3U7APyh_FQ{;;c)Oz NNX1+98_jzT{Q|>4f-nF8 literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext@2x.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5746bec5c1e676553bdf448e57fa5aaa5b41b965 GIT binary patch literal 1299 zcmeAS@N?(olHy`uVBq!ia0vp^5|6H_V+Po~;1FfbQqhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfuV_lxuu?= zsiBF5p^k!)fuXU!fw8`!v96(!m4T&|p{W8CC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vzP@mS^NOJX1q?F%io^naLp=li++2{qz^aQ&f>IIAz^b}9q_QAY zKPa_0zqBYB7$0fMFwMZQ!*3BtA<#8e{zaLx4BpamZnk1VU>sp$oS?HQ28KoMU8JZk`@|TTd@GVc_+Y_7;FFTVpUxf4g zvT(_njO#@#nQBj+FsWF0!q7uQIrza$C3S_BJw8q9U2|3`3ome-Xk3~iV-xfwM%J^L zy(^}nE;WVcPVf^Uo)yaFA}f!```iqAFik1^)d`Ii+dFwQm6ac~DP2#9kmTGX<+`fR zW2%yAsmh+%`64$1Paa+vqW06hrsHqr-Gtk!{NZ!gntiIAT60J37%JaYI@A44L!m4e#vL-c(PwV`00=K5A|=O b8yFeZ)NkgB6!ts +@interface SVWebViewController () + +@property (nonatomic, strong) UIBarButtonItem *backBarButtonItem; +@property (nonatomic, strong) UIBarButtonItem *forwardBarButtonItem; +@property (nonatomic, strong) UIBarButtonItem *refreshBarButtonItem; +@property (nonatomic, strong) UIBarButtonItem *stopBarButtonItem; +@property (nonatomic, strong) UIBarButtonItem *actionBarButtonItem; + +@property (nonatomic, strong) UIWebView *webView; +@property (nonatomic, strong) NSURL *URL; + +- (id)initWithAddress:(NSString*)urlString; +- (id)initWithURL:(NSURL*)URL; +- (void)loadURL:(NSURL*)URL; + +- (void)updateToolbarItems; + +- (void)goBackClicked:(UIBarButtonItem *)sender; +- (void)goForwardClicked:(UIBarButtonItem *)sender; +- (void)reloadClicked:(UIBarButtonItem *)sender; +- (void)stopClicked:(UIBarButtonItem *)sender; +- (void)actionButtonClicked:(UIBarButtonItem *)sender; + +@end + + +@implementation SVWebViewController + +#pragma mark - Initialization + +- (void)dealloc { + [self.webView stopLoading]; + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; + self.webView.delegate = nil; +} + +- (id)initWithAddress:(NSString *)urlString { + + if (urlString) { + urlString = _urlString; + } + return [self initWithURL:[NSURL URLWithString:urlString]]; +} + +-(void)setUrlString:(NSString *)urlString{ + if (urlString) { + _urlString = urlString; + } +} + +- (id)initWithURL:(NSURL*)pageURL { + + + if(self = [super init]) { + self.URL = pageURL; + } + + return self; +} + +- (void)loadURL:(NSURL *)pageURL { + [self.webView loadRequest:[NSURLRequest requestWithURL:pageURL]]; +} + +#pragma mark - View lifecycle + +- (void)loadView { + self.view = self.webView; + [self loadURL:self.URL]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + [self updateToolbarItems]; +} + +- (void)viewDidUnload { + [super viewDidUnload]; + self.webView = nil; + _backBarButtonItem = nil; + _forwardBarButtonItem = nil; + _refreshBarButtonItem = nil; + _stopBarButtonItem = nil; + _actionBarButtonItem = nil; +} + +- (void)viewWillAppear:(BOOL)animated { + NSAssert(self.navigationController, @"SVWebViewController needs to be contained in a UINavigationController. If you are presenting SVWebViewController modally, use SVModalWebViewController instead."); + + [super viewWillAppear:animated]; + + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { + [self.navigationController setToolbarHidden:NO animated:animated]; + } +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { + [self.navigationController setToolbarHidden:YES animated:animated]; + } +} + +- (void)viewDidDisappear:(BOOL)animated { + [super viewDidDisappear:animated]; + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) + return YES; + + return toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown; +} + +#pragma mark - Getters + +- (UIWebView*)webView { + if(!_webView) { + _webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds]; + _webView.delegate = self; + _webView.scalesPageToFit = YES; + } + return _webView; +} + +- (UIBarButtonItem *)backBarButtonItem { + if (!_backBarButtonItem) { + _backBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"SVWebViewController.bundle/SVWebViewControllerBack"] + style:UIBarButtonItemStylePlain + target:self + action:@selector(goBackClicked:)]; + _backBarButtonItem.width = 18.0f; + } + return _backBarButtonItem; +} + +- (UIBarButtonItem *)forwardBarButtonItem { + if (!_forwardBarButtonItem) { + _forwardBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"SVWebViewController.bundle/SVWebViewControllerNext"] + style:UIBarButtonItemStylePlain + target:self + action:@selector(goForwardClicked:)]; + _forwardBarButtonItem.width = 18.0f; + } + return _forwardBarButtonItem; +} + +- (UIBarButtonItem *)refreshBarButtonItem { + if (!_refreshBarButtonItem) { + _refreshBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reloadClicked:)]; + } + return _refreshBarButtonItem; +} + +- (UIBarButtonItem *)stopBarButtonItem { + if (!_stopBarButtonItem) { + _stopBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop target:self action:@selector(stopClicked:)]; + } + return _stopBarButtonItem; +} + +- (UIBarButtonItem *)actionBarButtonItem { + if (!_actionBarButtonItem) { + _actionBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(actionButtonClicked:)]; + } + return _actionBarButtonItem; +} + +#pragma mark - Toolbar + +- (void)updateToolbarItems { + self.backBarButtonItem.enabled = self.self.webView.canGoBack; + self.forwardBarButtonItem.enabled = self.self.webView.canGoForward; + self.actionBarButtonItem.enabled = !self.self.webView.isLoading; + + UIBarButtonItem *refreshStopBarButtonItem = self.self.webView.isLoading ? self.stopBarButtonItem : self.refreshBarButtonItem; + + UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; + UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; + + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + CGFloat toolbarWidth = 250.0f; + fixedSpace.width = 35.0f; + + NSArray *items = [NSArray arrayWithObjects: + fixedSpace, + refreshStopBarButtonItem, + fixedSpace, + self.backBarButtonItem, + fixedSpace, + self.forwardBarButtonItem, + fixedSpace, + self.actionBarButtonItem, + nil]; + + UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, toolbarWidth, 44.0f)]; + toolbar.items = items; + toolbar.barStyle = self.navigationController.navigationBar.barStyle; + toolbar.tintColor = self.navigationController.navigationBar.tintColor; + self.navigationItem.rightBarButtonItems = items.reverseObjectEnumerator.allObjects; + } + + else { + NSArray *items = [NSArray arrayWithObjects: + fixedSpace, + self.backBarButtonItem, + flexibleSpace, + self.forwardBarButtonItem, + flexibleSpace, + refreshStopBarButtonItem, + flexibleSpace, + self.actionBarButtonItem, + fixedSpace, + nil]; + + self.navigationController.toolbar.barStyle = self.navigationController.navigationBar.barStyle; + self.navigationController.toolbar.tintColor = self.navigationController.navigationBar.tintColor; + self.toolbarItems = items; + } +} + +#pragma mark - UIWebViewDelegate + +- (void)webViewDidStartLoad:(UIWebView *)webView { + + [SVProgressHUD show]; + + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; + [self updateToolbarItems]; +} + + +- (void)webViewDidFinishLoad:(UIWebView *)webView { + + [SVProgressHUD dismiss]; + + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; + + self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; + [self updateToolbarItems]; + + +} + +- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; + [self updateToolbarItems]; + + [SVProgressHUD dismiss]; +} + +#pragma mark - Target actions + +- (void)goBackClicked:(UIBarButtonItem *)sender { + [self.webView goBack]; +} + +- (void)goForwardClicked:(UIBarButtonItem *)sender { + [self.webView goForward]; +} + +- (void)reloadClicked:(UIBarButtonItem *)sender { + [self.webView reload]; +} + +- (void)stopClicked:(UIBarButtonItem *)sender { + [self.webView stopLoading]; + [self updateToolbarItems]; +} + +- (void)actionButtonClicked:(id)sender { + NSArray *activities = @[[SVWebViewControllerActivitySafari new], [SVWebViewControllerActivityChrome new]]; + + UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[self.self.webView.request.URL] applicationActivities:activities]; + [self presentViewController:activityController animated:YES completion:nil]; +} + +- (void)doneButtonClicked:(id)sender { + [SVProgressHUD dismiss]; + [self dismissViewControllerAnimated:YES completion:NULL]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad.png new file mode 100644 index 0000000000000000000000000000000000000000..cd19edb8de89e0ceed727dfc2f1dee2289a52a71 GIT binary patch literal 2821 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 literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad@2x.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8b081cd5d95ebeb9dd3275de6997008bc1cba1 GIT binary patch literal 5345 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 literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.h b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.h new file mode 100644 index 0000000..6525193 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.h @@ -0,0 +1,13 @@ +// +// SVWebViewControllerActivityChrome.h +// +// Created by Sam Vermette on 11 Nov, 2013. +// Copyright 2013 Sam Vermette. All rights reserved. +// +// https://github.com/samvermette/SVWebViewController + +#import "SVWebViewControllerActivity.h" + +@interface SVWebViewControllerActivityChrome : SVWebViewControllerActivity + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m new file mode 100644 index 0000000..f50f68e --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome.m @@ -0,0 +1,38 @@ +// +// SVWebViewControllerActivityChrome.h +// +// Created by Sam Vermette on 11 Nov, 2013. +// Copyright 2013 Sam Vermette. All rights reserved. +// +// https://github.com/samvermette/SVWebViewController + +#import "SVWebViewControllerActivityChrome.h" + +@implementation SVWebViewControllerActivityChrome + +- (NSString *)schemePrefix { + return @"googlechrome://"; +} + +- (NSString *)activityTitle { + return NSLocalizedStringFromTable(@"Open in Chrome", @"SVWebViewController", nil); +} + +- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { + for (id activityItem in activityItems) { + if ([activityItem isKindOfClass:[NSURL class]] && [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:self.schemePrefix]]) { + return YES; + } + } + return NO; +} + +- (void)performActivity { + NSString *openingURL = [self.URLToOpen.absoluteString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSURL *activityURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", self.schemePrefix, openingURL]]; + [[UIApplication sharedApplication] openURL:activityURL]; + + [self activityDidFinish:YES]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome@2x.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..565e0ce023022c8a81630884bb1cfbb6c50d0445 GIT binary patch literal 4289 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 literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/SVWebViewControllerActivity.h b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/SVWebViewControllerActivity.h new file mode 100644 index 0000000..1d643e8 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/SVWebViewControllerActivity.h @@ -0,0 +1,16 @@ +// +// SVWebViewControllerActivity.h +// SVWeb +// +// Created by Sam Vermette on 11/11/2013. +// +// + +#import + +@interface SVWebViewControllerActivity : UIActivity + +@property (nonatomic, strong) NSURL *URLToOpen; +@property (nonatomic, strong) NSString *schemePrefix; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/SVWebViewControllerActivity.m b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/SVWebViewControllerActivity.m new file mode 100644 index 0000000..df362b6 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/SVWebViewControllerActivity.m @@ -0,0 +1,32 @@ +// +// SVWebViewControllerActivity.m +// SVWeb +// +// Created by Sam Vermette on 11/11/2013. +// +// + +#import "SVWebViewControllerActivity.h" + +@implementation SVWebViewControllerActivity + +- (NSString *)activityType { + return NSStringFromClass([self class]); +} + +- (UIImage *)activityImage { + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) + return [UIImage imageNamed:[self.activityType stringByAppendingString:@"-iPad"]]; + else + return [UIImage imageNamed:self.activityType]; +} + +- (void)prepareWithActivityItems:(NSArray *)activityItems { + for (id activityItem in activityItems) { + if ([activityItem isKindOfClass:[NSURL class]]) { + self.URLToOpen = activityItem; + } + } +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad.png new file mode 100644 index 0000000000000000000000000000000000000000..31f2ca8d0f6ac7b3c86d35fb38068b4c61ef8131 GIT binary patch literal 3333 zcmbVPdpy(o8|N4rm1{1cW|PEbb~78p*pzA#qlr4rHZ^0LZL%l|Ayi6KF1d6NIU?#5 z>tacfOLFVDOQj5nBTl#1Zz}zMf1KC(i?RW++)SA8|V=WHl%h3u74o+e|oxx#=K!L3NY%T%(uI?Tf#AXt}yD$_R z3g4A=fW0MB!19jtpfVyk3>*{e85;H@$fIdFdJs27MC| zaR}h=PSGfyAXlD%1;SWkUai(yjjM`DRA(@RfvIOB!f#=S<}YI^tJ8^o2NC#*0ET z)jkq?g6hqPQxlqc3tv>7FGN04kEO((iCrnX^9xa(XjQM!Mj5kvIKMDx3=iAm^s9~j zi$-&uAnn^RPH}f5TP*7PV;7Qk&H*q03g7{tU-^!5-tJ4x?6aR#hpN3j&&#^*U+wzP zp=F}HA2_66voKY0c(#%OfNSTg+m&E*tuC|;YX~G+V+3O%RAU|7wT0YMpU@iV_P-=J5_5jO*0?U0N3qxMcA`%>wjDEjG&`UYTM%1O zamusM7kDWm+^rdCpI~a+lA%3d`o=lU7T3K`Lv@QDF894eWS&{uQ1?(gy45PEIHz)j z;@5Su9P^^y*&&GU$U=W{dhtrohw$Q6x2eD*rvXwot)rblN#}~1-1pG=ScGC)cg z-xz`Yu3#pFnCzcJ4S{0T(!jkPu_7b!#cWb{RBcafcf_1di_TW zb8p{d|NTj8u8$|3xU6Du^&ynnTr-u(-thi<$`!T8R;OHVbwOj$YS$30fBFK5&tJuk zmrGu&1mhA#QjT}1?5Y9NX9VHn*Ogq?H+0dg8=uZaA@AhH559YrH4B9`bLvzS5qf^x zR`2p$9|$WrCd*0A#+?|5iPXjxc(qy?W758Y7n4S-9zH0HY@@5q!^QBuj4CZRxb|fJXn8SnY)#_*b=uEJ<;rF5H)WEE;J>4zXeOD`b2F~M_MqYE#zvVgw1ak@xs;KK<4H(DV&2bHptYQ6z zFW$Z9#2OcKtwfE*DLQX`p>FfG!i4fiTX&QnF0*|X{@4BVWP>5Uin)d0=+}QFhB9sY zJpz)B@&N62s=Erusw~2;nz=a^Wm76H9~_uaq}yv5MmhIgOYo95-}zeBeL=p3yRda7~1ODc@9@LTVfb2l*}-F)tV6gTMKv(ZBOaW+mXz|n+2xSX8OUL&#C z>R|k`dd7g2bh;*}NoD1i)ch4soG(5u(Tu)ucq`C2sqx*-dT}~?X22}@4bwbx+o8ec z*_S|QDxfwP-Q=ToWAj;@mD_{)O{pw~MyV9mOWwUVK#_OVuh~)pt~|GpVF>BL%W|Q^A8Y)>>Ts#hdh7-nW6p zu<=ai{B%p{_Q}2$K>o=risV*Wt*}fdirmNHJZ7eoRas*l2_T>N-o|Df@2Ub1qv}&` zue~m_g9zse5N4qEEH_|R{9$;uxbI9e_+D*O-Fbi8aHVO%FVk1iUPeyG7te$OPw!oQ zM==fgbasYeO6fJ*;c{+rntWqy1HF$n2)-TbwJE!C^TmQb1WAQ9>~4PJ$|!Z3kn+^@ zqHyg6IRq?TH(KM6Bzf{ z#ZW|o$?!!zFP~|(mm#Bz1$kfhI=q3P7c-$L8A$)OlHTyVJJbCibBx;V+fQc9z3-8s zIz~K5yv|db5_8be*K~$%p1e>t6rHiJpd{kWShd@cO?fRtpATj>Uwk;}b2{*rqoRGQ zC98O(ATH_nmouzLFnr!DX}EF0W8VR5x^2rsoRU)>W_Ls7(_8ZuYa(8cg>UU?Ph<6{ zKG{?FLQxV7xpX^|GofR;XXhdP7X@VwZ@j@gzjueY(N1UTfF08wFIw;=v!j-C=tMsz z%&CQWUBe}Oltsvc6(sd)&TI&)Qfh8+9G56X5)) zbRgj=;1$DAyA`_e_QtJeUx3!^c!_UVy9U($!0ImFGVk$Vv)2%}WEObK;q0ibcp!L% z|1@=u9pFkESjYoQ2QHmob=@FxXJwwC04bJpMa<(Vv1V bswiyISh4rxiUaLSKPK*E4^oB8zS#c&uUMIg literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad@2x.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..856e4d03284062e4cea5d3481b28f09c69282d26 GIT binary patch literal 6892 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 Ba8v*Q literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.h b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.h new file mode 100644 index 0000000..11d4c27 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.h @@ -0,0 +1,13 @@ +// +// SVWebViewControllerActivitySafari.h +// +// Created by Sam Vermette on 11 Nov, 2013. +// Copyright 2013 Sam Vermette. All rights reserved. +// +// https://github.com/samvermette/SVWebViewController + +#import "SVWebViewControllerActivity.h" + +@interface SVWebViewControllerActivitySafari : SVWebViewControllerActivity + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.m b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.m new file mode 100644 index 0000000..5235684 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari.m @@ -0,0 +1,32 @@ +// +// SVWebViewControllerActivitySafari.m +// +// Created by Sam Vermette on 11 Nov, 2013. +// Copyright 2013 Sam Vermette. All rights reserved. +// +// https://github.com/samvermette/SVWebViewController + + +#import "SVWebViewControllerActivitySafari.h" + +@implementation SVWebViewControllerActivitySafari + +- (NSString *)activityTitle { + return NSLocalizedStringFromTable(@"Open in Safari", @"SVWebViewController", nil); +} + +- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { + for (id activityItem in activityItems) { + if ([activityItem isKindOfClass:[NSURL class]] && [[UIApplication sharedApplication] canOpenURL:activityItem]) { + return YES; + } + } + return NO; +} + +- (void)performActivity { + BOOL completed = [[UIApplication sharedApplication] openURL:self.URLToOpen]; + [self activityDidFinish:completed]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari@2x.png b/iOSStudy/iOSStudy/Pods/SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b0dc8c7aefc34e19db3a09fd3b8d898cf3911a52 GIT binary patch literal 5153 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

+ +An easy-to-use UITableViewCell subclass that implements a swipeable content view which exposes utility buttons (similar to iOS 7 Mail Application) + +##Usage +In your Podfile: +
pod 'SWTableViewCell', '~> 0.3.7'
+ +Or just clone this repo and manually add source to project + +##Functionality +###Right Utility Buttons +Utility buttons that become visible on the right side of the Table View Cell when the user swipes left. This behavior is similar to that seen in the iOS apps Mail and Reminders. + +

+ +###Left Utility Buttons +Utility buttons that become visible on the left side of the Table View Cell when the user swipes right. + +

+ +###Features +* Dynamic utility button scalling. As you add more buttons to a cell, the other buttons on that side get smaller to make room +* Smart selection: The cell will pick up touch events and either scroll the cell back to center or fire the delegate method `- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath` +

+So the cell will not be considered selected when the user touches the cell while utility buttons are visible, instead the cell will slide back into place (same as iOS 7 Mail App functionality) +* Create utilty buttons with either a title or an icon along with a RGB color +* Tested on iOS 6.1 and above, including iOS 7 + +##Usage + +###Standard Table View Cells + +In your `tableView:cellForRowAtIndexPath:` method you set up the SWTableView cell and add an arbitrary amount of utility buttons to it using the included `NSMutableArray+SWUtilityButtons` category. + +```objc +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *cellIdentifier = @"Cell"; + + SWTableViewCell *cell = (SWTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; + + if (cell == nil) { + cell = [[SWTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; + cell.leftUtilityButtons = [self leftButtons]; + cell.rightUtilityButtons = [self rightButtons]; + cell.delegate = self; + } + + NSDate *dateObject = _testArray[indexPath.row]; + cell.textLabel.text = [dateObject description]; + cell.detailTextLabel.text = @"Some detail text"; + + return cell; +} + +- (NSArray *)rightButtons +{ + NSMutableArray *rightUtilityButtons = [NSMutableArray new]; + [rightUtilityButtons sw_addUtilityButtonWithColor: + [UIColor colorWithRed:0.78f green:0.78f blue:0.8f alpha:1.0] + title:@"More"]; + [rightUtilityButtons sw_addUtilityButtonWithColor: + [UIColor colorWithRed:1.0f green:0.231f blue:0.188 alpha:1.0f] + title:@"Delete"]; + + return rightUtilityButtons; +} + +- (NSArray *)leftButtons +{ + NSMutableArray *leftUtilityButtons = [NSMutableArray new]; + + [leftUtilityButtons sw_addUtilityButtonWithColor: + [UIColor colorWithRed:0.07 green:0.75f blue:0.16f alpha:1.0] + icon:[UIImage imageNamed:@"check.png"]]; + [leftUtilityButtons sw_addUtilityButtonWithColor: + [UIColor colorWithRed:1.0f green:1.0f blue:0.35f alpha:1.0] + icon:[UIImage imageNamed:@"clock.png"]]; + [leftUtilityButtons sw_addUtilityButtonWithColor: + [UIColor colorWithRed:1.0f green:0.231f blue:0.188f alpha:1.0] + icon:[UIImage imageNamed:@"cross.png"]]; + [leftUtilityButtons sw_addUtilityButtonWithColor: + [UIColor colorWithRed:0.55f green:0.27f blue:0.07f alpha:1.0] + icon:[UIImage imageNamed:@"list.png"]]; + + return leftUtilityButtons; +} +``` + +###Custom Table View Cells + +Thanks to [Matt Bowman](https://github.com/MattCBowman) you can now create custom table view cells using Interface Builder that have the capabilities of an SWTableViewCell + +The first step is to design your cell either in a standalone nib or inside of a +table view using prototype cells. Make sure to set the custom class on the +cell in interface builder to the subclass you made for it: + +

+ +Then set the cell reuse identifier: + +

+ +When writing your custom table view cell's code, make sure your cell is a +subclass of SWTableViewCell: + +```objc + +#import + +@interface MyCustomTableViewCell : SWTableViewCell + +@property (weak, nonatomic) UILabel *customLabel; +@property (weak, nonatomic) UIImageView *customImageView; + +@end + +``` + +If you are using a separate nib and not a prototype cell, you'll need to be sure to register the nib in your table view: + +```objc + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + [self.tableView registerNib:[UINib nibWithNibName:@"MyCustomTableViewCellNibFileName" bundle:nil] forCellReuseIdentifier:@"MyCustomCell"]; +} + +``` + +Then, in the `tableView:cellForRowAtIndexPath:` method of your `UITableViewDelegate` (usually your view controller), initialize your custom cell: + +```objc +- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath +{ + static NSString *cellIdentifier = @"MyCustomCell"; + + MyCustomTableViewCell *cell = (MyCustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier + forIndexPath:indexPath]; + + cell.leftUtilityButtons = [self leftButtons]; + cell.rightUtilityButtons = [self rightButtons]; + cell.delegate = self; + + cell.customLabel.text = @"Some Text"; + cell.customImageView.image = [UIImage imageNamed:@"MyAwesomeTableCellImage"]; + [cell setCellHeight:cell.frame.size.height]; + return cell; +} +``` + +###Delegate + +The delegate `SWTableViewCellDelegate` is used by the developer to find out which button was pressed. There are five methods: + +```objc +// click event on left utility button +- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerLeftUtilityButtonWithIndex:(NSInteger)index; + +// click event on right utility button +- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index; + +// utility button open/close event +- (void)swipeableTableViewCell:(SWTableViewCell *)cell scrollingToState:(SWCellState)state; + +// prevent multiple cells from showing utilty buttons simultaneously +- (BOOL)swipeableTableViewCellShouldHideUtilityButtonsOnSwipe:(SWTableViewCell *)cell; + +// prevent cell(s) from displaying left/right utility buttons +- (BOOL)swipeableTableViewCell:(SWTableViewCell *)cell canSwipeToState:(SWCellState)state; +``` + +The index signifies which utility button the user pressed, for each side the button indices are ordered from right to left 0...n + +####Example + +```objc +#pragma mark - SWTableViewDelegate + +- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerLeftUtilityButtonWithIndex:(NSInteger)index { + switch (index) { + case 0: + NSLog(@"check button was pressed"); + break; + case 1: + NSLog(@"clock button was pressed"); + break; + case 2: + NSLog(@"cross button was pressed"); + break; + case 3: + NSLog(@"list button was pressed"); + default: + break; + } +} + +- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index { + switch (index) { + case 0: + NSLog(@"More button was pressed"); + break; + case 1: + { + // Delete button was pressed + NSIndexPath *cellIndexPath = [self.tableView indexPathForCell:cell]; + + [_testArray removeObjectAtIndex:cellIndexPath.row]; + [self.tableView deleteRowsAtIndexPaths:@[cellIndexPath] + withRowAnimation:UITableViewRowAnimationAutomatic]; + break; + } + default: + break; + } +} +``` + +(This is all code from the included example project) + +###Gotchas + +#### Seperator Insets +* If you have left utility button on iOS 7, I recommend changing your Table View's seperatorInset so the seperator stretches the length of the screen +
 tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0); 
+ + +##Contributing +Use [Github issues](https://github.com/cewendel/SWTableViewCell/issues) to track bugs and feature requests. + +##Contact + +Chris Wendel + +- http://twitter.com/CEWendel + +## Licence + +MIT + + + + + diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.h b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.h new file mode 100644 index 0000000..87edf77 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.h @@ -0,0 +1,25 @@ +// +// NSMutableArray+SWUtilityButtons.h +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import + +@interface NSMutableArray (SWUtilityButtons) + +- (void)sw_addUtilityButtonWithColor:(UIColor *)color title:(NSString *)title; +- (void)sw_addUtilityButtonWithColor:(UIColor *)color attributedTitle:(NSAttributedString *)title; +- (void)sw_addUtilityButtonWithColor:(UIColor *)color icon:(UIImage *)icon; +- (void)sw_addUtilityButtonWithColor:(UIColor *)color normalIcon:(UIImage *)normalIcon selectedIcon:(UIImage *)selectedIcon; + +@end + + +@interface NSArray (SWUtilityButtons) + +- (BOOL)sw_isEqualToButtons:(NSArray *)buttons; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.m b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.m new file mode 100644 index 0000000..2d32b75 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/NSMutableArray+SWUtilityButtons.m @@ -0,0 +1,92 @@ +// +// NSMutableArray+SWUtilityButtons.m +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import "NSMutableArray+SWUtilityButtons.h" + +@implementation NSMutableArray (SWUtilityButtons) + +- (void)sw_addUtilityButtonWithColor:(UIColor *)color title:(NSString *)title +{ + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.backgroundColor = color; + [button setTitle:title forState:UIControlStateNormal]; + [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [button.titleLabel setAdjustsFontSizeToFitWidth:YES]; + [self addObject:button]; +} + +- (void)sw_addUtilityButtonWithColor:(UIColor *)color attributedTitle:(NSAttributedString *)title +{ + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.backgroundColor = color; + [button setAttributedTitle:title forState:UIControlStateNormal]; + [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [self addObject:button]; +} + +- (void)sw_addUtilityButtonWithColor:(UIColor *)color icon:(UIImage *)icon +{ + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.backgroundColor = color; + [button setImage:icon forState:UIControlStateNormal]; + [self addObject:button]; +} + +- (void)sw_addUtilityButtonWithColor:(UIColor *)color normalIcon:(UIImage *)normalIcon selectedIcon:(UIImage *)selectedIcon { + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.backgroundColor = color; + [button setImage:normalIcon forState:UIControlStateNormal]; + [button setImage:selectedIcon forState:UIControlStateHighlighted]; + [button setImage:selectedIcon forState:UIControlStateSelected]; + [self addObject:button]; +} + +@end + + +@implementation NSArray (SWUtilityButtons) + +- (BOOL)sw_isEqualToButtons:(NSArray *)buttons +{ + buttons = [buttons copy]; + if (!buttons || self.count != buttons.count) return NO; + + for (NSUInteger idx = 0; idx < self.count; idx++) { + id buttonA = self[idx]; + id buttonB = buttons[idx]; + if (![buttonA isKindOfClass:[UIButton class]] || ![buttonB isKindOfClass:[UIButton class]]) return NO; + if (![[self class] sw_button:buttonA isEqualToButton:buttonB]) return NO; + } + + return YES; +} + ++ (BOOL)sw_button:(UIButton *)buttonA isEqualToButton:(UIButton *)buttonB +{ + if (!buttonA || !buttonB) return NO; + + UIColor *backgroundColorA = buttonA.backgroundColor; + UIColor *backgroundColorB = buttonB.backgroundColor; + BOOL haveEqualBackgroundColors = (!backgroundColorA && !backgroundColorB) || [backgroundColorA isEqual:backgroundColorB]; + + NSString *titleA = [buttonA titleForState:UIControlStateNormal]; + NSString *titleB = [buttonB titleForState:UIControlStateNormal]; + BOOL haveEqualTitles = (!titleA && !titleB) || [titleA isEqualToString:titleB]; + + UIImage *normalIconA = [buttonA imageForState:UIControlStateNormal]; + UIImage *normalIconB = [buttonB imageForState:UIControlStateNormal]; + BOOL haveEqualNormalIcons = (!normalIconA && !normalIconB) || [normalIconA isEqual:normalIconB]; + + UIImage *selectedIconA = [buttonA imageForState:UIControlStateSelected]; + UIImage *selectedIconB = [buttonB imageForState:UIControlStateSelected]; + BOOL haveEqualSelectedIcons = (!selectedIconA && !selectedIconB) || [selectedIconA isEqual:selectedIconB]; + + return haveEqualBackgroundColors && haveEqualTitles && haveEqualNormalIcons && haveEqualSelectedIcons; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWCellScrollView.h b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWCellScrollView.h new file mode 100644 index 0000000..50fe75b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWCellScrollView.h @@ -0,0 +1,13 @@ +// +// SWCellScrollView.h +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import + +@interface SWCellScrollView : UIScrollView + +@end diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWCellScrollView.m b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWCellScrollView.m new file mode 100644 index 0000000..56b394a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWCellScrollView.m @@ -0,0 +1,42 @@ +// +// SWCellScrollView.m +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import "SWCellScrollView.h" + +@implementation SWCellScrollView + +- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer +{ + if (gestureRecognizer == self.panGestureRecognizer) { + CGPoint translation = [(UIPanGestureRecognizer*)gestureRecognizer translationInView:gestureRecognizer.view]; + return fabs(translation.y) <= fabs(translation.x); + } else { + return YES; + } +} + +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { + // Find out if the user is actively scrolling the tableView of which this is a member. + // If they are, return NO, and don't let the gesture recognizers work simultaneously. + // + // This works very well in maintaining user expectations while still allowing for the user to + // scroll the cell sideways when that is their true intent. + if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { + + // Find the current scrolling velocity in that view, in the Y direction. + CGFloat yVelocity = [(UIPanGestureRecognizer*)gestureRecognizer velocityInView:gestureRecognizer.view].y; + + // Return YES iff the user is not actively scrolling up. + return fabs(yVelocity) <= 0.25; + + } + return YES; +} + +@end + diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.h b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.h new file mode 100644 index 0000000..a6f57e9 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.h @@ -0,0 +1,15 @@ +// +// SWLongPressGestureRecognizer.h +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import +#import + +@interface SWLongPressGestureRecognizer : UILongPressGestureRecognizer + +@end + diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.m b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.m new file mode 100644 index 0000000..2f2c519 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWLongPressGestureRecognizer.m @@ -0,0 +1,33 @@ +// +// SWLongPressGestureRecognizer.m +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import "SWLongPressGestureRecognizer.h" + +@implementation SWLongPressGestureRecognizer + +-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + [super touchesBegan:touches withEvent:event]; +} + +-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event +{ + [super touchesMoved:touches withEvent:event]; + + self.state = UIGestureRecognizerStateFailed; +} + +-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +{ + [super touchesEnded:touches withEvent:event]; + + self.state = UIGestureRecognizerStateFailed; +} + +@end + diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWTableViewCell.h b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWTableViewCell.h new file mode 100644 index 0000000..50b2d11 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWTableViewCell.h @@ -0,0 +1,52 @@ +// +// SWTableViewCell.h +// SWTableViewCell +// +// Created by Chris Wendel on 9/10/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import +#import +#import "SWCellScrollView.h" +#import "SWLongPressGestureRecognizer.h" +#import "SWUtilityButtonTapGestureRecognizer.h" +#import "NSMutableArray+SWUtilityButtons.h" + +@class SWTableViewCell; + +typedef NS_ENUM(NSInteger, SWCellState) +{ + kCellStateCenter, + kCellStateLeft, + kCellStateRight, +}; + +@protocol SWTableViewCellDelegate + +@optional +- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerLeftUtilityButtonWithIndex:(NSInteger)index; +- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index; +- (void)swipeableTableViewCell:(SWTableViewCell *)cell scrollingToState:(SWCellState)state; +- (BOOL)swipeableTableViewCellShouldHideUtilityButtonsOnSwipe:(SWTableViewCell *)cell; +- (BOOL)swipeableTableViewCell:(SWTableViewCell *)cell canSwipeToState:(SWCellState)state; +- (void)swipeableTableViewCellDidEndScrolling:(SWTableViewCell *)cell; + +@end + +@interface SWTableViewCell : UITableViewCell + +@property (nonatomic, copy) NSArray *leftUtilityButtons; +@property (nonatomic, copy) NSArray *rightUtilityButtons; + +@property (nonatomic, weak) id delegate; + +- (void)setRightUtilityButtons:(NSArray *)rightUtilityButtons WithButtonWidth:(CGFloat) width; +- (void)setLeftUtilityButtons:(NSArray *)leftUtilityButtons WithButtonWidth:(CGFloat) width; +- (void)hideUtilityButtonsAnimated:(BOOL)animated; +- (void)showLeftUtilityButtonsAnimated:(BOOL)animated; +- (void)showRightUtilityButtonsAnimated:(BOOL)animated; + +- (BOOL)isUtilityButtonsHidden; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWTableViewCell.m b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWTableViewCell.m new file mode 100644 index 0000000..a7c2a2b --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWTableViewCell.m @@ -0,0 +1,800 @@ +// +// SWTableViewCell.m +// SWTableViewCell +// +// Created by Chris Wendel on 9/10/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import "SWTableViewCell.h" +#import "SWUtilityButtonView.h" + +static NSString * const kTableViewCellContentView = @"UITableViewCellContentView"; + +#define kSectionIndexWidth 15 +#define kAccessoryTrailingSpace 15 +#define kLongPressMinimumDuration 0.16f + +@interface SWTableViewCell () + +@property (nonatomic, weak) UITableView *containingTableView; + +@property (nonatomic, strong) UIPanGestureRecognizer *tableViewPanGestureRecognizer; + +@property (nonatomic, assign) SWCellState cellState; // The state of the cell within the scroll view, can be left, right or middle +@property (nonatomic, assign) CGFloat additionalRightPadding; + +@property (nonatomic, strong) UIScrollView *cellScrollView; +@property (nonatomic, strong) SWUtilityButtonView *leftUtilityButtonsView, *rightUtilityButtonsView; +@property (nonatomic, strong) UIView *leftUtilityClipView, *rightUtilityClipView; +@property (nonatomic, strong) NSLayoutConstraint *leftUtilityClipConstraint, *rightUtilityClipConstraint; + +@property (nonatomic, strong) UILongPressGestureRecognizer *longPressGestureRecognizer; +@property (nonatomic, strong) UITapGestureRecognizer *tapGestureRecognizer; + +- (CGFloat)leftUtilityButtonsWidth; +- (CGFloat)rightUtilityButtonsWidth; +- (CGFloat)utilityButtonsPadding; + +- (CGPoint)contentOffsetForCellState:(SWCellState)state; +- (void)updateCellState; + +- (BOOL)shouldHighlight; + +@end + +@implementation SWTableViewCell { + UIView *_contentCellView; + BOOL layoutUpdating; +} + +#pragma mark Initializers + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + + if (self) + { + [self initializer]; + } + + return self; +} + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier +{ + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; + + if (self) + { + [self initializer]; + } + + return self; +} + +- (void)initializer +{ + layoutUpdating = NO; + // Set up scroll view that will host our cell content + self.cellScrollView = [[SWCellScrollView alloc] init]; + self.cellScrollView.translatesAutoresizingMaskIntoConstraints = NO; + self.cellScrollView.delegate = self; + self.cellScrollView.showsHorizontalScrollIndicator = NO; + self.cellScrollView.scrollsToTop = NO; + self.cellScrollView.scrollEnabled = YES; + + _contentCellView = [[UIView alloc] init]; + [self.cellScrollView addSubview:_contentCellView]; + + // Add the cell scroll view to the cell + UIView *contentViewParent = self; + UIView *clipViewParent = self.cellScrollView; + if (![NSStringFromClass([[self.subviews objectAtIndex:0] class]) isEqualToString:kTableViewCellContentView]) + { + // iOS 7 + contentViewParent = [self.subviews objectAtIndex:0]; + clipViewParent = self; + } + NSArray *cellSubviews = [contentViewParent subviews]; + [self insertSubview:self.cellScrollView atIndex:0]; + for (UIView *subview in cellSubviews) + { + [_contentCellView addSubview:subview]; + } + + // Set scroll view to perpetually have same frame as self. Specifying relative to superview doesn't work, since the latter UITableViewCellScrollView has different behaviour. + [self addConstraints:@[ + [NSLayoutConstraint constraintWithItem:self.cellScrollView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0], + [NSLayoutConstraint constraintWithItem:self.cellScrollView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0], + [NSLayoutConstraint constraintWithItem:self.cellScrollView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0], + [NSLayoutConstraint constraintWithItem:self.cellScrollView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0], + ]]; + + self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewTapped:)]; + self.tapGestureRecognizer.cancelsTouchesInView = NO; + self.tapGestureRecognizer.delegate = self; + [self.cellScrollView addGestureRecognizer:self.tapGestureRecognizer]; + + self.longPressGestureRecognizer = [[SWLongPressGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewPressed:)]; + self.longPressGestureRecognizer.cancelsTouchesInView = NO; + self.longPressGestureRecognizer.minimumPressDuration = kLongPressMinimumDuration; + self.longPressGestureRecognizer.delegate = self; + [self.cellScrollView addGestureRecognizer:self.longPressGestureRecognizer]; + + // Create the left and right utility button views, as well as vanilla UIViews in which to embed them. We can manipulate the latter in order to effect clipping according to scroll position. + // Such an approach is necessary in order for the utility views to sit on top to get taps, as well as allow the backgroundColor (and private UITableViewCellBackgroundView) to work properly. + + self.leftUtilityClipView = [[UIView alloc] init]; + self.leftUtilityClipConstraint = [NSLayoutConstraint constraintWithItem:self.leftUtilityClipView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]; + self.leftUtilityButtonsView = [[SWUtilityButtonView alloc] initWithUtilityButtons:nil + parentCell:self + utilityButtonSelector:@selector(leftUtilityButtonHandler:)]; + + self.rightUtilityClipView = [[UIView alloc] initWithFrame:self.bounds]; + self.rightUtilityClipConstraint = [NSLayoutConstraint constraintWithItem:self.rightUtilityClipView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]; + self.rightUtilityButtonsView = [[SWUtilityButtonView alloc] initWithUtilityButtons:nil + parentCell:self + utilityButtonSelector:@selector(rightUtilityButtonHandler:)]; + + + UIView *clipViews[] = { self.rightUtilityClipView, self.leftUtilityClipView }; + NSLayoutConstraint *clipConstraints[] = { self.rightUtilityClipConstraint, self.leftUtilityClipConstraint }; + UIView *buttonViews[] = { self.rightUtilityButtonsView, self.leftUtilityButtonsView }; + NSLayoutAttribute alignmentAttributes[] = { NSLayoutAttributeRight, NSLayoutAttributeLeft }; + + for (NSUInteger i = 0; i < 2; ++i) + { + UIView *clipView = clipViews[i]; + NSLayoutConstraint *clipConstraint = clipConstraints[i]; + UIView *buttonView = buttonViews[i]; + NSLayoutAttribute alignmentAttribute = alignmentAttributes[i]; + + clipConstraint.priority = UILayoutPriorityDefaultHigh; + + clipView.translatesAutoresizingMaskIntoConstraints = NO; + clipView.clipsToBounds = YES; + + [clipViewParent addSubview:clipView]; + [self addConstraints:@[ + // Pin the clipping view to the appropriate outer edges of the cell. + [NSLayoutConstraint constraintWithItem:clipView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0], + [NSLayoutConstraint constraintWithItem:clipView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0], + [NSLayoutConstraint constraintWithItem:clipView attribute:alignmentAttribute relatedBy:NSLayoutRelationEqual toItem:self attribute:alignmentAttribute multiplier:1.0 constant:0.0], + clipConstraint, + ]]; + + [clipView addSubview:buttonView]; + [self addConstraints:@[ + // Pin the button view to the appropriate outer edges of its clipping view. + [NSLayoutConstraint constraintWithItem:buttonView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:clipView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0], + [NSLayoutConstraint constraintWithItem:buttonView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:clipView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0], + [NSLayoutConstraint constraintWithItem:buttonView attribute:alignmentAttribute relatedBy:NSLayoutRelationEqual toItem:clipView attribute:alignmentAttribute multiplier:1.0 constant:0.0], + + // Constrain the maximum button width so that at least a button's worth of contentView is left visible. (The button view will shrink accordingly.) + [NSLayoutConstraint constraintWithItem:buttonView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:self.contentView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:-kUtilityButtonWidthDefault], + ]]; + } +} + +static NSString * const kTableViewPanState = @"state"; + +- (void)removeOldTableViewPanObserver +{ + [_tableViewPanGestureRecognizer removeObserver:self forKeyPath:kTableViewPanState]; +} + +- (void)dealloc +{ + [self removeOldTableViewPanObserver]; +} + +- (void)setContainingTableView:(UITableView *)containingTableView +{ + [self removeOldTableViewPanObserver]; + + _tableViewPanGestureRecognizer = containingTableView.panGestureRecognizer; + + _containingTableView = containingTableView; + + if (containingTableView) + { + // Check if the UITableView will display Indices on the right. If that's the case, add a padding + if ([_containingTableView.dataSource respondsToSelector:@selector(sectionIndexTitlesForTableView:)]) + { + NSArray *indices = [_containingTableView.dataSource sectionIndexTitlesForTableView:_containingTableView]; + self.additionalRightPadding = indices == nil ? 0 : kSectionIndexWidth; + } + + _containingTableView.directionalLockEnabled = YES; + + [self.tapGestureRecognizer requireGestureRecognizerToFail:_containingTableView.panGestureRecognizer]; + + [_tableViewPanGestureRecognizer addObserver:self forKeyPath:kTableViewPanState options:0 context:nil]; + } +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if([keyPath isEqualToString:kTableViewPanState] && object == _tableViewPanGestureRecognizer) + { + if(_tableViewPanGestureRecognizer.state == UIGestureRecognizerStateBegan) + { + CGPoint locationInTableView = [_tableViewPanGestureRecognizer locationInView:_containingTableView]; + + BOOL inCurrentCell = CGRectContainsPoint(self.frame, locationInTableView); + if(!inCurrentCell && _cellState != kCellStateCenter) + { + if ([self.delegate respondsToSelector:@selector(swipeableTableViewCellShouldHideUtilityButtonsOnSwipe:)]) + { + if([self.delegate swipeableTableViewCellShouldHideUtilityButtonsOnSwipe:self]) + { + [self hideUtilityButtonsAnimated:YES]; + } + } + } + } + } +} + +- (void)setLeftUtilityButtons:(NSArray *)leftUtilityButtons +{ + if (![_leftUtilityButtons sw_isEqualToButtons:leftUtilityButtons]) { + _leftUtilityButtons = leftUtilityButtons; + + self.leftUtilityButtonsView.utilityButtons = leftUtilityButtons; + + [self.leftUtilityButtonsView layoutIfNeeded]; + [self layoutIfNeeded]; + } +} + +- (void)setLeftUtilityButtons:(NSArray *)leftUtilityButtons WithButtonWidth:(CGFloat) width +{ + _leftUtilityButtons = leftUtilityButtons; + + [self.leftUtilityButtonsView setUtilityButtons:leftUtilityButtons WithButtonWidth:width]; + + [self.leftUtilityButtonsView layoutIfNeeded]; + [self layoutIfNeeded]; +} + +- (void)setRightUtilityButtons:(NSArray *)rightUtilityButtons +{ + if (![_rightUtilityButtons sw_isEqualToButtons:rightUtilityButtons]) { + _rightUtilityButtons = rightUtilityButtons; + + self.rightUtilityButtonsView.utilityButtons = rightUtilityButtons; + + [self.rightUtilityButtonsView layoutIfNeeded]; + [self layoutIfNeeded]; + } +} + +- (void)setRightUtilityButtons:(NSArray *)rightUtilityButtons WithButtonWidth:(CGFloat) width +{ + _rightUtilityButtons = rightUtilityButtons; + + [self.rightUtilityButtonsView setUtilityButtons:rightUtilityButtons WithButtonWidth:width]; + + [self.rightUtilityButtonsView layoutIfNeeded]; + [self layoutIfNeeded]; +} + +#pragma mark - UITableViewCell overrides + +- (void)didMoveToSuperview +{ + self.containingTableView = nil; + UIView *view = self.superview; + + do { + if ([view isKindOfClass:[UITableView class]]) + { + self.containingTableView = (UITableView *)view; + break; + } + } while ((view = view.superview)); +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + // Offset the contentView origin so that it appears correctly w/rt the enclosing scroll view (to which we moved it). + CGRect frame = self.contentView.frame; + frame.origin.x = [self leftUtilityButtonsWidth]; + _contentCellView.frame = frame; + + self.cellScrollView.contentSize = CGSizeMake(CGRectGetWidth(self.frame) + [self utilityButtonsPadding], CGRectGetHeight(self.frame)); + + if (!self.cellScrollView.isTracking && !self.cellScrollView.isDecelerating) + { + self.cellScrollView.contentOffset = [self contentOffsetForCellState:_cellState]; + } + + [self updateCellState]; +} + +- (void)setFrame:(CGRect)frame +{ + layoutUpdating = YES; + // Fix for new screen sizes + // Initially, the cell is still 320 points wide + // We need to layout our subviews again when this changes so our constraints clip to the right width + BOOL widthChanged = (self.frame.size.width != frame.size.width); + + [super setFrame:frame]; + + if (widthChanged) + { + [self layoutIfNeeded]; + } + layoutUpdating = NO; +} + +- (void)prepareForReuse +{ + [super prepareForReuse]; + + [self hideUtilityButtonsAnimated:NO]; +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated +{ + // Work around stupid background-destroying override magic that UITableView seems to perform on contained buttons. + + [self.leftUtilityButtonsView pushBackgroundColors]; + [self.rightUtilityButtonsView pushBackgroundColors]; + + [super setSelected:selected animated:animated]; + + [self.leftUtilityButtonsView popBackgroundColors]; + [self.rightUtilityButtonsView popBackgroundColors]; +} + +- (void)didTransitionToState:(UITableViewCellStateMask)state { + [super didTransitionToState:state]; + + if (state == UITableViewCellStateDefaultMask) { + [self layoutSubviews]; + } +} + +#pragma mark - Selection handling + +- (BOOL)shouldHighlight +{ + BOOL shouldHighlight = YES; + + if ([self.containingTableView.delegate respondsToSelector:@selector(tableView:shouldHighlightRowAtIndexPath:)]) + { + NSIndexPath *cellIndexPath = [self.containingTableView indexPathForCell:self]; + + shouldHighlight = [self.containingTableView.delegate tableView:self.containingTableView shouldHighlightRowAtIndexPath:cellIndexPath]; + } + + return shouldHighlight; +} + +- (void)scrollViewPressed:(UIGestureRecognizer *)gestureRecognizer +{ + if (gestureRecognizer.state == UIGestureRecognizerStateBegan && !self.isHighlighted && self.shouldHighlight) + { + [self setHighlighted:YES animated:NO]; + } + + else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) + { + // Cell is already highlighted; clearing it temporarily seems to address visual anomaly. + [self setHighlighted:NO animated:NO]; + [self scrollViewTapped:gestureRecognizer]; + } + + else if (gestureRecognizer.state == UIGestureRecognizerStateCancelled) + { + [self setHighlighted:NO animated:NO]; + } +} + +- (void)scrollViewTapped:(UIGestureRecognizer *)gestureRecognizer +{ + if (_cellState == kCellStateCenter) + { + if (self.isSelected) + { + [self deselectCell]; + } + else if (self.shouldHighlight) // UITableView refuses selection if highlight is also refused. + { + [self selectCell]; + } + } + else + { + // Scroll back to center + [self hideUtilityButtonsAnimated:YES]; + } +} + +- (void)selectCell +{ + if (_cellState == kCellStateCenter) + { + NSIndexPath *cellIndexPath = [self.containingTableView indexPathForCell:self]; + + if ([self.containingTableView.delegate respondsToSelector:@selector(tableView:willSelectRowAtIndexPath:)]) + { + cellIndexPath = [self.containingTableView.delegate tableView:self.containingTableView willSelectRowAtIndexPath:cellIndexPath]; + } + + if (cellIndexPath) + { + [self.containingTableView selectRowAtIndexPath:cellIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; + + if ([self.containingTableView.delegate respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)]) + { + [self.containingTableView.delegate tableView:self.containingTableView didSelectRowAtIndexPath:cellIndexPath]; + } + } + } +} + +- (void)deselectCell +{ + if (_cellState == kCellStateCenter) + { + NSIndexPath *cellIndexPath = [self.containingTableView indexPathForCell:self]; + + if ([self.containingTableView.delegate respondsToSelector:@selector(tableView:willDeselectRowAtIndexPath:)]) + { + cellIndexPath = [self.containingTableView.delegate tableView:self.containingTableView willDeselectRowAtIndexPath:cellIndexPath]; + } + + if (cellIndexPath) + { + [self.containingTableView deselectRowAtIndexPath:cellIndexPath animated:NO]; + + if ([self.containingTableView.delegate respondsToSelector:@selector(tableView:didDeselectRowAtIndexPath:)]) + { + [self.containingTableView.delegate tableView:self.containingTableView didDeselectRowAtIndexPath:cellIndexPath]; + } + } + } +} + +#pragma mark - Utility buttons handling + +- (void)rightUtilityButtonHandler:(id)sender +{ + SWUtilityButtonTapGestureRecognizer *utilityButtonTapGestureRecognizer = (SWUtilityButtonTapGestureRecognizer *)sender; + NSUInteger utilityButtonIndex = utilityButtonTapGestureRecognizer.buttonIndex; + if ([self.delegate respondsToSelector:@selector(swipeableTableViewCell:didTriggerRightUtilityButtonWithIndex:)]) + { + [self.delegate swipeableTableViewCell:self didTriggerRightUtilityButtonWithIndex:utilityButtonIndex]; + } +} + +- (void)leftUtilityButtonHandler:(id)sender +{ + SWUtilityButtonTapGestureRecognizer *utilityButtonTapGestureRecognizer = (SWUtilityButtonTapGestureRecognizer *)sender; + NSUInteger utilityButtonIndex = utilityButtonTapGestureRecognizer.buttonIndex; + if ([self.delegate respondsToSelector:@selector(swipeableTableViewCell:didTriggerLeftUtilityButtonWithIndex:)]) + { + [self.delegate swipeableTableViewCell:self didTriggerLeftUtilityButtonWithIndex:utilityButtonIndex]; + } +} + +- (void)hideUtilityButtonsAnimated:(BOOL)animated +{ + if (_cellState != kCellStateCenter) + { + [self.cellScrollView setContentOffset:[self contentOffsetForCellState:kCellStateCenter] animated:animated]; + + if ([self.delegate respondsToSelector:@selector(swipeableTableViewCell:scrollingToState:)]) + { + [self.delegate swipeableTableViewCell:self scrollingToState:kCellStateCenter]; + } + } +} + +- (void)showLeftUtilityButtonsAnimated:(BOOL)animated { + if (_cellState != kCellStateLeft) + { + [self.cellScrollView setContentOffset:[self contentOffsetForCellState:kCellStateLeft] animated:animated]; + + if ([self.delegate respondsToSelector:@selector(swipeableTableViewCell:scrollingToState:)]) + { + [self.delegate swipeableTableViewCell:self scrollingToState:kCellStateLeft]; + } + } +} + +- (void)showRightUtilityButtonsAnimated:(BOOL)animated { + if (_cellState != kCellStateRight) + { + [self.cellScrollView setContentOffset:[self contentOffsetForCellState:kCellStateRight] animated:animated]; + + if ([self.delegate respondsToSelector:@selector(swipeableTableViewCell:scrollingToState:)]) + { + [self.delegate swipeableTableViewCell:self scrollingToState:kCellStateRight]; + } + } +} + +- (BOOL)isUtilityButtonsHidden { + return _cellState == kCellStateCenter; +} + + +#pragma mark - Geometry helpers + +- (CGFloat)leftUtilityButtonsWidth +{ +#if CGFLOAT_IS_DOUBLE + return round(CGRectGetWidth(self.leftUtilityButtonsView.frame)); +#else + return roundf(CGRectGetWidth(self.leftUtilityButtonsView.frame)); +#endif +} + +- (CGFloat)rightUtilityButtonsWidth +{ +#if CGFLOAT_IS_DOUBLE + return round(CGRectGetWidth(self.rightUtilityButtonsView.frame) + self.additionalRightPadding); +#else + return roundf(CGRectGetWidth(self.rightUtilityButtonsView.frame) + self.additionalRightPadding); +#endif +} + +- (CGFloat)utilityButtonsPadding +{ +#if CGFLOAT_IS_DOUBLE + return round([self leftUtilityButtonsWidth] + [self rightUtilityButtonsWidth]); +#else + return roundf([self leftUtilityButtonsWidth] + [self rightUtilityButtonsWidth]); +#endif +} + +- (CGPoint)contentOffsetForCellState:(SWCellState)state +{ + CGPoint scrollPt = CGPointZero; + + switch (state) + { + case kCellStateCenter: + scrollPt.x = [self leftUtilityButtonsWidth]; + break; + + case kCellStateRight: + scrollPt.x = [self utilityButtonsPadding]; + break; + + case kCellStateLeft: + scrollPt.x = 0; + break; + } + + return scrollPt; +} + +- (void)updateCellState +{ + if(layoutUpdating == NO) + { + // Update the cell state according to the current scroll view contentOffset. + for (NSNumber *numState in @[ + @(kCellStateCenter), + @(kCellStateLeft), + @(kCellStateRight), + ]) + { + SWCellState cellState = numState.integerValue; + + if (CGPointEqualToPoint(self.cellScrollView.contentOffset, [self contentOffsetForCellState:cellState])) + { + _cellState = cellState; + break; + } + } + + // Update the clipping on the utility button views according to the current position. + CGRect frame = [self.contentView.superview convertRect:self.contentView.frame toView:self]; + frame.size.width = CGRectGetWidth(self.frame); + + self.leftUtilityClipConstraint.constant = MAX(0, CGRectGetMinX(frame) - CGRectGetMinX(self.frame)); + self.rightUtilityClipConstraint.constant = MIN(0, CGRectGetMaxX(frame) - CGRectGetMaxX(self.frame)); + + if (self.isEditing) { + self.leftUtilityClipConstraint.constant = 0; + self.cellScrollView.contentOffset = CGPointMake([self leftUtilityButtonsWidth], 0); + _cellState = kCellStateCenter; + } + + self.leftUtilityClipView.hidden = (self.leftUtilityClipConstraint.constant == 0); + self.rightUtilityClipView.hidden = (self.rightUtilityClipConstraint.constant == 0); + + if (self.accessoryType != UITableViewCellAccessoryNone && !self.editing) { + UIView *accessory = [self.cellScrollView.superview.subviews lastObject]; + + CGRect accessoryFrame = accessory.frame; + accessoryFrame.origin.x = CGRectGetWidth(frame) - CGRectGetWidth(accessoryFrame) - kAccessoryTrailingSpace + CGRectGetMinX(frame); + accessory.frame = accessoryFrame; + } + + // Enable or disable the gesture recognizers according to the current mode. + if (!self.cellScrollView.isDragging && !self.cellScrollView.isDecelerating) + { + self.tapGestureRecognizer.enabled = YES; + self.longPressGestureRecognizer.enabled = (_cellState == kCellStateCenter); + } + else + { + self.tapGestureRecognizer.enabled = NO; + self.longPressGestureRecognizer.enabled = NO; + } + + self.cellScrollView.scrollEnabled = !self.isEditing; + } +} + +#pragma mark - UIScrollViewDelegate + +- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset +{ + if (velocity.x >= 0.5f) + { + if (_cellState == kCellStateLeft || !self.rightUtilityButtons || self.rightUtilityButtonsWidth == 0.0) + { + _cellState = kCellStateCenter; + } + else + { + _cellState = kCellStateRight; + } + } + else if (velocity.x <= -0.5f) + { + if (_cellState == kCellStateRight || !self.leftUtilityButtons || self.leftUtilityButtonsWidth == 0.0) + { + _cellState = kCellStateCenter; + } + else + { + _cellState = kCellStateLeft; + } + } + else + { + CGFloat leftThreshold = [self contentOffsetForCellState:kCellStateLeft].x + (self.leftUtilityButtonsWidth / 2); + CGFloat rightThreshold = [self contentOffsetForCellState:kCellStateRight].x - (self.rightUtilityButtonsWidth / 2); + + if (targetContentOffset->x > rightThreshold) + { + _cellState = kCellStateRight; + } + else if (targetContentOffset->x < leftThreshold) + { + _cellState = kCellStateLeft; + } + else + { + _cellState = kCellStateCenter; + } + } + + if ([self.delegate respondsToSelector:@selector(swipeableTableViewCell:scrollingToState:)]) + { + [self.delegate swipeableTableViewCell:self scrollingToState:_cellState]; + } + + if (_cellState != kCellStateCenter) + { + if ([self.delegate respondsToSelector:@selector(swipeableTableViewCellShouldHideUtilityButtonsOnSwipe:)]) + { + for (SWTableViewCell *cell in [self.containingTableView visibleCells]) { + if (cell != self && [cell isKindOfClass:[SWTableViewCell class]] && [self.delegate swipeableTableViewCellShouldHideUtilityButtonsOnSwipe:cell]) { + [cell hideUtilityButtonsAnimated:YES]; + } + } + } + } + + *targetContentOffset = [self contentOffsetForCellState:_cellState]; +} + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView +{ + if (scrollView.contentOffset.x > [self leftUtilityButtonsWidth]) + { + if ([self rightUtilityButtonsWidth] > 0) + { + if (self.delegate && [self.delegate respondsToSelector:@selector(swipeableTableViewCell:canSwipeToState:)]) + { + BOOL shouldScroll = [self.delegate swipeableTableViewCell:self canSwipeToState:kCellStateRight]; + if (!shouldScroll) + { + scrollView.contentOffset = CGPointMake([self leftUtilityButtonsWidth], 0); + } + } + } + else + { + [scrollView setContentOffset:CGPointMake([self leftUtilityButtonsWidth], 0)]; + self.tapGestureRecognizer.enabled = YES; + } + } + else + { + // Expose the left button view + if ([self leftUtilityButtonsWidth] > 0) + { + if (self.delegate && [self.delegate respondsToSelector:@selector(swipeableTableViewCell:canSwipeToState:)]) + { + BOOL shouldScroll = [self.delegate swipeableTableViewCell:self canSwipeToState:kCellStateLeft]; + if (!shouldScroll) + { + scrollView.contentOffset = CGPointMake([self leftUtilityButtonsWidth], 0); + } + } + } + else + { + [scrollView setContentOffset:CGPointMake(0, 0)]; + self.tapGestureRecognizer.enabled = YES; + } + } + + [self updateCellState]; +} + +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView +{ + [self updateCellState]; + + if (self.delegate && [self.delegate respondsToSelector:@selector(swipeableTableViewCellDidEndScrolling:)]) { + [self.delegate swipeableTableViewCellDidEndScrolling:self]; + } +} + +- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView +{ + [self updateCellState]; + + if (self.delegate && [self.delegate respondsToSelector:@selector(swipeableTableViewCellDidEndScrolling:)]) { + [self.delegate swipeableTableViewCellDidEndScrolling:self]; + } +} + +-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate +{ + if (!decelerate) + { + self.tapGestureRecognizer.enabled = YES; + } + +} + +#pragma mark - UIGestureRecognizerDelegate + +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer +{ + if ((gestureRecognizer == self.containingTableView.panGestureRecognizer && otherGestureRecognizer == self.longPressGestureRecognizer) + || (gestureRecognizer == self.longPressGestureRecognizer && otherGestureRecognizer == self.containingTableView.panGestureRecognizer)) + { + // Return YES so the pan gesture of the containing table view is not cancelled by the long press recognizer + return YES; + } + else + { + return NO; + } +} + +-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch +{ + return ![touch.view isKindOfClass:[UIControl class]]; +} + +@end diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.h b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.h new file mode 100644 index 0000000..6d7e7c8 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.h @@ -0,0 +1,17 @@ +// +// SWUtilityButtonTapGestureRecognizer.h +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import +#import + +@interface SWUtilityButtonTapGestureRecognizer : UITapGestureRecognizer + +@property (nonatomic) NSUInteger buttonIndex; + +@end + diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.m b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.m new file mode 100644 index 0000000..549bc9f --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonTapGestureRecognizer.m @@ -0,0 +1,14 @@ +// +// SWUtilityButtonTapGestureRecognizer.m +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import "SWUtilityButtonTapGestureRecognizer.h" + +@implementation SWUtilityButtonTapGestureRecognizer + +@end + diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonView.h b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonView.h new file mode 100644 index 0000000..c201220 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonView.h @@ -0,0 +1,27 @@ +// +// SWUtilityButtonView.h +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import +@class SWTableViewCell; + +#define kUtilityButtonWidthDefault 90 + +@interface SWUtilityButtonView : UIView + +- (id)initWithUtilityButtons:(NSArray *)utilityButtons parentCell:(SWTableViewCell *)parentCell utilityButtonSelector:(SEL)utilityButtonSelector; +- (id)initWithFrame:(CGRect)frame utilityButtons:(NSArray *)utilityButtons parentCell:(SWTableViewCell *)parentCell utilityButtonSelector:(SEL)utilityButtonSelector; + +@property (nonatomic, weak, readonly) SWTableViewCell *parentCell; +@property (nonatomic, copy) NSArray *utilityButtons; +@property (nonatomic, assign) SEL utilityButtonSelector; + +- (void)setUtilityButtons:(NSArray *)utilityButtons WithButtonWidth:(CGFloat)width; +- (void)pushBackgroundColors; +- (void)popBackgroundColors; + +@end diff --git a/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonView.m b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonView.m new file mode 100644 index 0000000..c36908f --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/SWTableViewCell/SWTableViewCell/PodFiles/SWUtilityButtonView.m @@ -0,0 +1,153 @@ +// +// SWUtilityButtonView.m +// SWTableViewCell +// +// Created by Matt Bowman on 11/27/13. +// Copyright (c) 2013 Chris Wendel. All rights reserved. +// + +#import "SWUtilityButtonView.h" +#import "SWUtilityButtonTapGestureRecognizer.h" + +@interface SWUtilityButtonView() + +@property (nonatomic, strong) NSLayoutConstraint *widthConstraint; +@property (nonatomic, strong) NSMutableArray *buttonBackgroundColors; + +@end + +@implementation SWUtilityButtonView + +#pragma mark - SWUtilityButonView initializers + +- (id)initWithUtilityButtons:(NSArray *)utilityButtons parentCell:(SWTableViewCell *)parentCell utilityButtonSelector:(SEL)utilityButtonSelector +{ + self = [self initWithFrame:CGRectZero utilityButtons:utilityButtons parentCell:parentCell utilityButtonSelector:utilityButtonSelector]; + + return self; +} + +- (id)initWithFrame:(CGRect)frame utilityButtons:(NSArray *)utilityButtons parentCell:(SWTableViewCell *)parentCell utilityButtonSelector:(SEL)utilityButtonSelector +{ + self = [super initWithFrame:frame]; + + if (self) { + self.translatesAutoresizingMaskIntoConstraints = NO; + + self.widthConstraint = [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeNotAnAttribute + multiplier:1.0 + constant:0.0]; // constant will be adjusted dynamically in -setUtilityButtons:. + self.widthConstraint.priority = UILayoutPriorityDefaultHigh; + [self addConstraint:self.widthConstraint]; + + _parentCell = parentCell; + self.utilityButtonSelector = utilityButtonSelector; + self.utilityButtons = utilityButtons; + } + + return self; +} + +#pragma mark Populating utility buttons + +- (void)setUtilityButtons:(NSArray *)utilityButtons +{ + // if no width specified, use the default width + [self setUtilityButtons:utilityButtons WithButtonWidth:kUtilityButtonWidthDefault]; +} + +- (void)setUtilityButtons:(NSArray *)utilityButtons WithButtonWidth:(CGFloat)width +{ + for (UIButton *button in _utilityButtons) + { + [button removeFromSuperview]; + } + + _utilityButtons = [utilityButtons copy]; + + if (utilityButtons.count) + { + NSUInteger utilityButtonsCounter = 0; + UIView *precedingView = nil; + + for (UIButton *button in _utilityButtons) + { + [self addSubview:button]; + button.translatesAutoresizingMaskIntoConstraints = NO; + + if (!precedingView) + { + // First button; pin it to the left edge. + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button]" + options:0L + metrics:nil + views:NSDictionaryOfVariableBindings(button)]]; + } + else + { + // Subsequent button; pin it to the right edge of the preceding one, with equal width. + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[precedingView][button(==precedingView)]" + options:0L + metrics:nil + views:NSDictionaryOfVariableBindings(precedingView, button)]]; + } + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[button]|" + options:0L + metrics:nil + views:NSDictionaryOfVariableBindings(button)]]; + + + SWUtilityButtonTapGestureRecognizer *utilityButtonTapGestureRecognizer = [[SWUtilityButtonTapGestureRecognizer alloc] initWithTarget:_parentCell action:_utilityButtonSelector]; + utilityButtonTapGestureRecognizer.buttonIndex = utilityButtonsCounter; + [button addGestureRecognizer:utilityButtonTapGestureRecognizer]; + + utilityButtonsCounter++; + precedingView = button; + } + + // Pin the last button to the right edge. + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[precedingView]|" + options:0L + metrics:nil + views:NSDictionaryOfVariableBindings(precedingView)]]; + } + + self.widthConstraint.constant = (width * utilityButtons.count); + + [self setNeedsLayout]; + + return; +} + +#pragma mark - + +- (void)pushBackgroundColors +{ + self.buttonBackgroundColors = [[NSMutableArray alloc] init]; + + for (UIButton *button in self.utilityButtons) + { + [self.buttonBackgroundColors addObject:button.backgroundColor]; + } +} + +- (void)popBackgroundColors +{ + NSEnumerator *e = self.utilityButtons.objectEnumerator; + + for (UIColor *color in self.buttonBackgroundColors) + { + UIButton *button = [e nextObject]; + button.backgroundColor = color; + } + + self.buttonBackgroundColors = nil; +} + +@end + diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-Private.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-Private.xcconfig new file mode 100644 index 0000000..1b0bf9d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-Private.xcconfig @@ -0,0 +1,5 @@ +#include "Pods-AFNetworking.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/AFNetworking" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = ${PODS_AFNETWORKING_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-dummy.m b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-dummy.m new file mode 100644 index 0000000..c50a8c6 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_AFNetworking : NSObject +@end +@implementation PodsDummy_Pods_AFNetworking +@end diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-prefix.pch b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-prefix.pch new file mode 100644 index 0000000..95cf11d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking.xcconfig new file mode 100644 index 0000000..c2f387a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-AFNetworking/Pods-AFNetworking.xcconfig @@ -0,0 +1 @@ +PODS_AFNETWORKING_OTHER_LDFLAGS = -framework "CoreGraphics" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-Private.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-Private.xcconfig new file mode 100644 index 0000000..994c1fb --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-Private.xcconfig @@ -0,0 +1,5 @@ +#include "Pods-FMDB.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/FMDB" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = ${PODS_FMDB_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-dummy.m b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-dummy.m new file mode 100644 index 0000000..9f21ee3 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_FMDB : NSObject +@end +@implementation PodsDummy_Pods_FMDB +@end diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-prefix.pch b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-prefix.pch new file mode 100644 index 0000000..95cf11d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB.xcconfig new file mode 100644 index 0000000..dc1e7e4 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-FMDB/Pods-FMDB.xcconfig @@ -0,0 +1 @@ +PODS_FMDB_OTHER_LDFLAGS = -l"sqlite3" \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-Private.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-Private.xcconfig new file mode 100644 index 0000000..82c7242 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-Private.xcconfig @@ -0,0 +1,5 @@ +#include "Pods-MJRefresh.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/MJRefresh" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = -ObjC +PODS_ROOT = ${SRCROOT} \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-dummy.m b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-dummy.m new file mode 100644 index 0000000..cc6a260 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_MJRefresh : NSObject +@end +@implementation PodsDummy_Pods_MJRefresh +@end diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-prefix.pch b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-prefix.pch new file mode 100644 index 0000000..95cf11d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-MJRefresh/Pods-MJRefresh.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-Private.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-Private.xcconfig new file mode 100644 index 0000000..757ac0c --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-Private.xcconfig @@ -0,0 +1,5 @@ +#include "Pods-Mantle.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/Mantle" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = ${PODS_MANTLE_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-dummy.m b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-dummy.m new file mode 100644 index 0000000..ae4bd15 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Mantle : NSObject +@end +@implementation PodsDummy_Pods_Mantle +@end diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-prefix.pch b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-prefix.pch new file mode 100644 index 0000000..95cf11d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle.xcconfig new file mode 100644 index 0000000..9224ebf --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-Mantle/Pods-Mantle.xcconfig @@ -0,0 +1 @@ +PODS_MANTLE_OTHER_LDFLAGS = -framework "Foundation" \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-Private.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-Private.xcconfig new file mode 100644 index 0000000..5cff63d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-Private.xcconfig @@ -0,0 +1,5 @@ +#include "Pods-SDWebImage.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/SDWebImage" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = ${PODS_SDWEBIMAGE_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-dummy.m b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-dummy.m new file mode 100644 index 0000000..1e978bb --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_SDWebImage : NSObject +@end +@implementation PodsDummy_Pods_SDWebImage +@end diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-prefix.pch b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-prefix.pch new file mode 100644 index 0000000..95cf11d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage.xcconfig new file mode 100644 index 0000000..b82befe --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SDWebImage/Pods-SDWebImage.xcconfig @@ -0,0 +1 @@ +PODS_SDWEBIMAGE_OTHER_LDFLAGS = -framework "ImageIO" \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-Private.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-Private.xcconfig new file mode 100644 index 0000000..ad76ac9 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-Private.xcconfig @@ -0,0 +1,5 @@ +#include "Pods-SVProgressHUD.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/SVProgressHUD" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = ${PODS_SVPROGRESSHUD_OTHER_LDFLAGS} -ObjC +PODS_ROOT = ${SRCROOT} \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-dummy.m b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-dummy.m new file mode 100644 index 0000000..e5c1fad --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_SVProgressHUD : NSObject +@end +@implementation PodsDummy_Pods_SVProgressHUD +@end diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-prefix.pch b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-prefix.pch new file mode 100644 index 0000000..95cf11d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD.xcconfig new file mode 100644 index 0000000..2ce71e0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVProgressHUD/Pods-SVProgressHUD.xcconfig @@ -0,0 +1 @@ +PODS_SVPROGRESSHUD_OTHER_LDFLAGS = -framework "QuartzCore" \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-Private.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-Private.xcconfig new file mode 100644 index 0000000..efe0096 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-Private.xcconfig @@ -0,0 +1,5 @@ +#include "Pods-SVWebViewController.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/SVWebViewController" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = -ObjC +PODS_ROOT = ${SRCROOT} \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-dummy.m b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-dummy.m new file mode 100644 index 0000000..374040a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_SVWebViewController : NSObject +@end +@implementation PodsDummy_Pods_SVWebViewController +@end diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-prefix.pch b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-prefix.pch new file mode 100644 index 0000000..95cf11d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SVWebViewController/Pods-SVWebViewController.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-Private.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-Private.xcconfig new file mode 100644 index 0000000..b29e583 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-Private.xcconfig @@ -0,0 +1,5 @@ +#include "Pods-SWTableViewCell.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/SWTableViewCell" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = -ObjC +PODS_ROOT = ${SRCROOT} \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-dummy.m b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-dummy.m new file mode 100644 index 0000000..2bd4320 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_SWTableViewCell : NSObject +@end +@implementation PodsDummy_Pods_SWTableViewCell +@end diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-prefix.pch b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-prefix.pch new file mode 100644 index 0000000..95cf11d --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell-prefix.pch @@ -0,0 +1,5 @@ +#ifdef __OBJC__ +#import +#endif + +#import "Pods-environment.h" diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods-SWTableViewCell/Pods-SWTableViewCell.xcconfig new file mode 100644 index 0000000..e69de29 diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown new file mode 100644 index 0000000..3b2ec91 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown @@ -0,0 +1,205 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## AFNetworking + +Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## FMDB + +If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +## MJRefresh + +Copyright (c) 2013-2014 MJRefresh (https://github.com/CoderMJLee/MJRefresh) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## Mantle + +**Copyright (c) 2012 - 2014, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +**This project uses portions of code from the Proton framework.** +**Proton is copyright (c) 2012, Bitswift, Inc.** +**All rights reserved.** + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Neither the name of the Bitswift, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +## SDWebImage + +Copyright (c) 2009 Olivier Poitrey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + +## SVProgressHUD + +Copyright (c) 2011-2014 Sam Vermette + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +A different license may apply to other resources included in this package, +including Freepik Icons. Please consult their +respective headers for the terms of their individual licenses. + +## SVWebViewController + +Copyright (c) 2011 Sam Vermette + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +## SWTableViewCell + +Copyright (c) 2013 Christopher Wendel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +Generated by CocoaPods - http://cocoapods.org diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-acknowledgements.plist b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-acknowledgements.plist new file mode 100644 index 0000000..b34b32a --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-acknowledgements.plist @@ -0,0 +1,263 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2013-2015 AFNetworking (http://afnetworking.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + AFNetworking + Type + PSGroupSpecifier + + + FooterText + If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + Title + FMDB + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2013-2014 MJRefresh (https://github.com/CoderMJLee/MJRefresh) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + MJRefresh + Type + PSGroupSpecifier + + + FooterText + **Copyright (c) 2012 - 2014, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +**This project uses portions of code from the Proton framework.** +**Proton is copyright (c) 2012, Bitswift, Inc.** +**All rights reserved.** + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Neither the name of the Bitswift, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Title + Mantle + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2009 Olivier Poitrey <rs@dailymotion.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + Title + SDWebImage + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2011-2014 Sam Vermette + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +A different license may apply to other resources included in this package, +including Freepik Icons. Please consult their +respective headers for the terms of their individual licenses. + Title + SVProgressHUD + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2011 Sam Vermette + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + Title + SVWebViewController + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2013 Christopher Wendel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + Title + SWTableViewCell + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-dummy.m b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-dummy.m new file mode 100644 index 0000000..ade64bd --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods : NSObject +@end +@implementation PodsDummy_Pods +@end diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-environment.h b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-environment.h new file mode 100644 index 0000000..9ec3fd4 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-environment.h @@ -0,0 +1,116 @@ + +// To check if a library is compiled with CocoaPods you +// can use the `COCOAPODS` macro definition which is +// defined in the xcconfigs so it is available in +// headers also when they are imported in the client +// project. + + +// AFNetworking +#define COCOAPODS_POD_AVAILABLE_AFNetworking +#define COCOAPODS_VERSION_MAJOR_AFNetworking 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking 1 + +// AFNetworking/NSURLConnection +#define COCOAPODS_POD_AVAILABLE_AFNetworking_NSURLConnection +#define COCOAPODS_VERSION_MAJOR_AFNetworking_NSURLConnection 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_NSURLConnection 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_NSURLConnection 1 + +// AFNetworking/NSURLSession +#define COCOAPODS_POD_AVAILABLE_AFNetworking_NSURLSession +#define COCOAPODS_VERSION_MAJOR_AFNetworking_NSURLSession 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_NSURLSession 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_NSURLSession 1 + +// AFNetworking/Reachability +#define COCOAPODS_POD_AVAILABLE_AFNetworking_Reachability +#define COCOAPODS_VERSION_MAJOR_AFNetworking_Reachability 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_Reachability 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_Reachability 1 + +// AFNetworking/Security +#define COCOAPODS_POD_AVAILABLE_AFNetworking_Security +#define COCOAPODS_VERSION_MAJOR_AFNetworking_Security 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_Security 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_Security 1 + +// AFNetworking/Serialization +#define COCOAPODS_POD_AVAILABLE_AFNetworking_Serialization +#define COCOAPODS_VERSION_MAJOR_AFNetworking_Serialization 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_Serialization 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_Serialization 1 + +// AFNetworking/UIKit +#define COCOAPODS_POD_AVAILABLE_AFNetworking_UIKit +#define COCOAPODS_VERSION_MAJOR_AFNetworking_UIKit 2 +#define COCOAPODS_VERSION_MINOR_AFNetworking_UIKit 5 +#define COCOAPODS_VERSION_PATCH_AFNetworking_UIKit 1 + +// FMDB +#define COCOAPODS_POD_AVAILABLE_FMDB +#define COCOAPODS_VERSION_MAJOR_FMDB 2 +#define COCOAPODS_VERSION_MINOR_FMDB 5 +#define COCOAPODS_VERSION_PATCH_FMDB 0 + +// FMDB/common +#define COCOAPODS_POD_AVAILABLE_FMDB_common +#define COCOAPODS_VERSION_MAJOR_FMDB_common 2 +#define COCOAPODS_VERSION_MINOR_FMDB_common 5 +#define COCOAPODS_VERSION_PATCH_FMDB_common 0 + +// FMDB/standard +#define COCOAPODS_POD_AVAILABLE_FMDB_standard +#define COCOAPODS_VERSION_MAJOR_FMDB_standard 2 +#define COCOAPODS_VERSION_MINOR_FMDB_standard 5 +#define COCOAPODS_VERSION_PATCH_FMDB_standard 0 + +// MJRefresh +#define COCOAPODS_POD_AVAILABLE_MJRefresh +#define COCOAPODS_VERSION_MAJOR_MJRefresh 0 +#define COCOAPODS_VERSION_MINOR_MJRefresh 0 +#define COCOAPODS_VERSION_PATCH_MJRefresh 1 + +// Mantle +#define COCOAPODS_POD_AVAILABLE_Mantle +#define COCOAPODS_VERSION_MAJOR_Mantle 1 +#define COCOAPODS_VERSION_MINOR_Mantle 5 +#define COCOAPODS_VERSION_PATCH_Mantle 4 + +// Mantle/extobjc +#define COCOAPODS_POD_AVAILABLE_Mantle_extobjc +#define COCOAPODS_VERSION_MAJOR_Mantle_extobjc 1 +#define COCOAPODS_VERSION_MINOR_Mantle_extobjc 5 +#define COCOAPODS_VERSION_PATCH_Mantle_extobjc 4 + +// SDWebImage +#define COCOAPODS_POD_AVAILABLE_SDWebImage +#define COCOAPODS_VERSION_MAJOR_SDWebImage 3 +#define COCOAPODS_VERSION_MINOR_SDWebImage 7 +#define COCOAPODS_VERSION_PATCH_SDWebImage 1 + +// SDWebImage/Core +#define COCOAPODS_POD_AVAILABLE_SDWebImage_Core +#define COCOAPODS_VERSION_MAJOR_SDWebImage_Core 3 +#define COCOAPODS_VERSION_MINOR_SDWebImage_Core 7 +#define COCOAPODS_VERSION_PATCH_SDWebImage_Core 1 + +// SVProgressHUD +#define COCOAPODS_POD_AVAILABLE_SVProgressHUD +#define COCOAPODS_VERSION_MAJOR_SVProgressHUD 1 +#define COCOAPODS_VERSION_MINOR_SVProgressHUD 1 +#define COCOAPODS_VERSION_PATCH_SVProgressHUD 2 + +// SVWebViewController +#define COCOAPODS_POD_AVAILABLE_SVWebViewController +#define COCOAPODS_VERSION_MAJOR_SVWebViewController 1 +#define COCOAPODS_VERSION_MINOR_SVWebViewController 0 +#define COCOAPODS_VERSION_PATCH_SVWebViewController 0 + +// SWTableViewCell +#define COCOAPODS_POD_AVAILABLE_SWTableViewCell +#define COCOAPODS_VERSION_MAJOR_SWTableViewCell 0 +#define COCOAPODS_VERSION_MINOR_SWTableViewCell 3 +#define COCOAPODS_VERSION_PATCH_SWTableViewCell 7 + diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-resources.sh b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-resources.sh new file mode 100755 index 0000000..f0ee1a0 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods-resources.sh @@ -0,0 +1,87 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + install_resource "MJRefresh/MJRefreshExample/MJRefreshExample/MJRefresh/MJRefresh.bundle" + install_resource "SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle" + install_resource "SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack.png" + install_resource "SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerBack@2x.png" + install_resource "SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext.png" + install_resource "SVWebViewController/SVWebViewController/SVWebViewController.bundle/SVWebViewControllerNext@2x.png" + install_resource "SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad.png" + install_resource "SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome-iPad@2x.png" + install_resource "SVWebViewController/SVWebViewController/UIActivities/Chrome/SVWebViewControllerActivityChrome@2x.png" + install_resource "SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad.png" + install_resource "SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari-iPad@2x.png" + install_resource "SVWebViewController/SVWebViewController/UIActivities/Safari/SVWebViewControllerActivitySafari@2x.png" + install_resource "SVWebViewController/SVWebViewController/SVWebViewController.bundle" + +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]]; then + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ `find . -name '*.xcassets' | wc -l` -ne 0 ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + find "${PWD}" -name "*.xcassets" -print0 | xargs -0 actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods.debug.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods.debug.xcconfig new file mode 100644 index 0000000..0d3ecc7 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods.debug.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/FMDB" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/Mantle" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/SVProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/SVWebViewController" -isystem "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = -ObjC -l"Pods-AFNetworking" -l"Pods-FMDB" -l"Pods-MJRefresh" -l"Pods-Mantle" -l"Pods-SDWebImage" -l"Pods-SVProgressHUD" -l"Pods-SVWebViewController" -l"Pods-SWTableViewCell" -l"sqlite3" -framework "CoreGraphics" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods.release.xcconfig b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods.release.xcconfig new file mode 100644 index 0000000..0d3ecc7 --- /dev/null +++ b/iOSStudy/iOSStudy/Pods/Target Support Files/Pods/Pods.release.xcconfig @@ -0,0 +1,6 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/Mantle" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/SVProgressHUD" "${PODS_ROOT}/Headers/Public/SVWebViewController" "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/FMDB" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/Mantle" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/SVProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/SVWebViewController" -isystem "${PODS_ROOT}/Headers/Public/SWTableViewCell" +OTHER_LDFLAGS = -ObjC -l"Pods-AFNetworking" -l"Pods-FMDB" -l"Pods-MJRefresh" -l"Pods-Mantle" -l"Pods-SDWebImage" -l"Pods-SVProgressHUD" -l"Pods-SVWebViewController" -l"Pods-SWTableViewCell" -l"sqlite3" -framework "CoreGraphics" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" +OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/iOSStudy/iOSStudy/Reachability.h b/iOSStudy/iOSStudy/Reachability.h new file mode 100755 index 0000000..502c17a --- /dev/null +++ b/iOSStudy/iOSStudy/Reachability.h @@ -0,0 +1,95 @@ +/* + Copyright (c) 2011, Tony Million. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import + + +/** + * Create NS_ENUM macro if it does not exist on the targeted version of iOS or OS X. + * + * @see http://nshipster.com/ns_enum-ns_options/ + **/ +#ifndef NS_ENUM +#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type +#endif + +extern NSString *const kReachabilityChangedNotification; + +typedef NS_ENUM(NSInteger, NetworkStatus) { + // Apple NetworkStatus Compatible Names. + NotReachable = 0, + ReachableViaWiFi = 2, + ReachableViaWWAN = 1 +}; + +@class Reachability; + +typedef void (^NetworkReachable)(Reachability * reachability); +typedef void (^NetworkUnreachable)(Reachability * reachability); + + +@interface Reachability : NSObject + +@property (nonatomic, copy) NetworkReachable reachableBlock; +@property (nonatomic, copy) NetworkUnreachable unreachableBlock; + +@property (nonatomic, assign) BOOL reachableOnWWAN; + + ++(instancetype)reachabilityWithHostname:(NSString*)hostname; +// This is identical to the function above, but is here to maintain +//compatibility with Apples original code. (see .m) ++(instancetype)reachabilityWithHostName:(NSString*)hostname; ++(instancetype)reachabilityForInternetConnection; ++(instancetype)reachabilityWithAddress:(void *)hostAddress; ++(instancetype)reachabilityForLocalWiFi; + +-(instancetype)initWithReachabilityRef:(SCNetworkReachabilityRef)ref; + +-(BOOL)startNotifier; +-(void)stopNotifier; + +-(BOOL)isReachable; +-(BOOL)isReachableViaWWAN; +-(BOOL)isReachableViaWiFi; + +// WWAN may be available, but not active until a connection has been established. +// WiFi may require a connection for VPN on Demand. +-(BOOL)isConnectionRequired; // Identical DDG variant. +-(BOOL)connectionRequired; // Apple's routine. +// Dynamic, on demand connection? +-(BOOL)isConnectionOnDemand; +// Is user intervention required? +-(BOOL)isInterventionRequired; + +-(NetworkStatus)currentReachabilityStatus; +-(SCNetworkReachabilityFlags)reachabilityFlags; +-(NSString*)currentReachabilityString; +-(NSString*)currentReachabilityFlags; + +@end diff --git a/iOSStudy/iOSStudy/Reachability.m b/iOSStudy/iOSStudy/Reachability.m new file mode 100755 index 0000000..e2fd1d8 --- /dev/null +++ b/iOSStudy/iOSStudy/Reachability.m @@ -0,0 +1,469 @@ +/* + Copyright (c) 2011, Tony Million. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#import "Reachability.h" + +#import +#import +#import +#import +#import +#import + + +NSString *const kReachabilityChangedNotification = @"kReachabilityChangedNotification"; + + +@interface Reachability () + +@property (nonatomic, assign) SCNetworkReachabilityRef reachabilityRef; +@property (nonatomic, strong) dispatch_queue_t reachabilitySerialQueue; +@property (nonatomic, strong) id reachabilityObject; + +-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags; +-(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags; + +@end + + +static NSString *reachabilityFlags(SCNetworkReachabilityFlags flags) +{ + return [NSString stringWithFormat:@"%c%c %c%c%c%c%c%c%c", +#if TARGET_OS_IPHONE + (flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-', +#else + 'X', +#endif + (flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-', + (flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-', + (flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-', + (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-', + (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-', + (flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-', + (flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-', + (flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-']; +} + +// Start listening for reachability notifications on the current run loop +static void TMReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) +{ +#pragma unused (target) + + Reachability *reachability = ((__bridge Reachability*)info); + + // We probably don't need an autoreleasepool here, as GCD docs state each queue has its own autorelease pool, + // but what the heck eh? + @autoreleasepool + { + [reachability reachabilityChanged:flags]; + } +} + + +@implementation Reachability + +#pragma mark - Class Constructor Methods + ++(instancetype)reachabilityWithHostName:(NSString*)hostname +{ + return [Reachability reachabilityWithHostname:hostname]; +} + ++(instancetype)reachabilityWithHostname:(NSString*)hostname +{ + SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]); + if (ref) + { + id reachability = [[self alloc] initWithReachabilityRef:ref]; + + return reachability; + } + + return nil; +} + ++(instancetype)reachabilityWithAddress:(void *)hostAddress +{ + SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress); + if (ref) + { + id reachability = [[self alloc] initWithReachabilityRef:ref]; + + return reachability; + } + + return nil; +} + ++(instancetype)reachabilityForInternetConnection +{ + struct sockaddr_in zeroAddress; + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + + return [self reachabilityWithAddress:&zeroAddress]; +} + ++(instancetype)reachabilityForLocalWiFi +{ + struct sockaddr_in localWifiAddress; + bzero(&localWifiAddress, sizeof(localWifiAddress)); + localWifiAddress.sin_len = sizeof(localWifiAddress); + localWifiAddress.sin_family = AF_INET; + // IN_LINKLOCALNETNUM is defined in as 169.254.0.0 + localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM); + + return [self reachabilityWithAddress:&localWifiAddress]; +} + + +// Initialization methods + +-(instancetype)initWithReachabilityRef:(SCNetworkReachabilityRef)ref +{ + self = [super init]; + if (self != nil) + { + self.reachableOnWWAN = YES; + self.reachabilityRef = ref; + + // We need to create a serial queue. + // We allocate this once for the lifetime of the notifier. + + self.reachabilitySerialQueue = dispatch_queue_create("com.tonymillion.reachability", NULL); + } + + return self; +} + +-(void)dealloc +{ + [self stopNotifier]; + + if(self.reachabilityRef) + { + CFRelease(self.reachabilityRef); + self.reachabilityRef = nil; + } + + self.reachableBlock = nil; + self.unreachableBlock = nil; + self.reachabilitySerialQueue = nil; +} + +#pragma mark - Notifier Methods + +// Notifier +// NOTE: This uses GCD to trigger the blocks - they *WILL NOT* be called on THE MAIN THREAD +// - In other words DO NOT DO ANY UI UPDATES IN THE BLOCKS. +// INSTEAD USE dispatch_async(dispatch_get_main_queue(), ^{UISTUFF}) (or dispatch_sync if you want) + +-(BOOL)startNotifier +{ + // allow start notifier to be called multiple times + if(self.reachabilityObject && (self.reachabilityObject == self)) + { + return YES; + } + + + SCNetworkReachabilityContext context = { 0, NULL, NULL, NULL, NULL }; + context.info = (__bridge void *)self; + + if(SCNetworkReachabilitySetCallback(self.reachabilityRef, TMReachabilityCallback, &context)) + { + // Set it as our reachability queue, which will retain the queue + if(SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue)) + { + // this should do a retain on ourself, so as long as we're in notifier mode we shouldn't disappear out from under ourselves + // woah + self.reachabilityObject = self; + return YES; + } + else + { +#ifdef DEBUG + NSLog(@"SCNetworkReachabilitySetDispatchQueue() failed: %s", SCErrorString(SCError())); +#endif + + // UH OH - FAILURE - stop any callbacks! + SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL); + } + } + else + { +#ifdef DEBUG + NSLog(@"SCNetworkReachabilitySetCallback() failed: %s", SCErrorString(SCError())); +#endif + } + + // if we get here we fail at the internet + self.reachabilityObject = nil; + return NO; +} + +-(void)stopNotifier +{ + // First stop, any callbacks! + SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL); + + // Unregister target from the GCD serial dispatch queue. + SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, NULL); + + self.reachabilityObject = nil; +} + +#pragma mark - reachability tests + +// This is for the case where you flick the airplane mode; +// you end up getting something like this: +//Reachability: WR ct----- +//Reachability: -- ------- +//Reachability: WR ct----- +//Reachability: -- ------- +// We treat this as 4 UNREACHABLE triggers - really apple should do better than this + +#define testcase (kSCNetworkReachabilityFlagsConnectionRequired | kSCNetworkReachabilityFlagsTransientConnection) + +-(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags +{ + BOOL connectionUP = YES; + + if(!(flags & kSCNetworkReachabilityFlagsReachable)) + connectionUP = NO; + + if( (flags & testcase) == testcase ) + connectionUP = NO; + +#if TARGET_OS_IPHONE + if(flags & kSCNetworkReachabilityFlagsIsWWAN) + { + // We're on 3G. + if(!self.reachableOnWWAN) + { + // We don't want to connect when on 3G. + connectionUP = NO; + } + } +#endif + + return connectionUP; +} + +-(BOOL)isReachable +{ + SCNetworkReachabilityFlags flags; + + if(!SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) + return NO; + + return [self isReachableWithFlags:flags]; +} + +-(BOOL)isReachableViaWWAN +{ +#if TARGET_OS_IPHONE + + SCNetworkReachabilityFlags flags = 0; + + if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) + { + // Check we're REACHABLE + if(flags & kSCNetworkReachabilityFlagsReachable) + { + // Now, check we're on WWAN + if(flags & kSCNetworkReachabilityFlagsIsWWAN) + { + return YES; + } + } + } +#endif + + return NO; +} + +-(BOOL)isReachableViaWiFi +{ + SCNetworkReachabilityFlags flags = 0; + + if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) + { + // Check we're reachable + if((flags & kSCNetworkReachabilityFlagsReachable)) + { +#if TARGET_OS_IPHONE + // Check we're NOT on WWAN + if((flags & kSCNetworkReachabilityFlagsIsWWAN)) + { + return NO; + } +#endif + return YES; + } + } + + return NO; +} + + +// WWAN may be available, but not active until a connection has been established. +// WiFi may require a connection for VPN on Demand. +-(BOOL)isConnectionRequired +{ + return [self connectionRequired]; +} + +-(BOOL)connectionRequired +{ + SCNetworkReachabilityFlags flags; + + if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) + { + return (flags & kSCNetworkReachabilityFlagsConnectionRequired); + } + + return NO; +} + +// Dynamic, on demand connection? +-(BOOL)isConnectionOnDemand +{ + SCNetworkReachabilityFlags flags; + + if (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) + { + return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) && + (flags & (kSCNetworkReachabilityFlagsConnectionOnTraffic | kSCNetworkReachabilityFlagsConnectionOnDemand))); + } + + return NO; +} + +// Is user intervention required? +-(BOOL)isInterventionRequired +{ + SCNetworkReachabilityFlags flags; + + if (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) + { + return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) && + (flags & kSCNetworkReachabilityFlagsInterventionRequired)); + } + + return NO; +} + + +#pragma mark - reachability status stuff + +-(NetworkStatus)currentReachabilityStatus +{ + if([self isReachable]) + { + if([self isReachableViaWiFi]) + return ReachableViaWiFi; + +#if TARGET_OS_IPHONE + return ReachableViaWWAN; +#endif + } + + return NotReachable; +} + +-(SCNetworkReachabilityFlags)reachabilityFlags +{ + SCNetworkReachabilityFlags flags = 0; + + if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) + { + return flags; + } + + return 0; +} + +-(NSString*)currentReachabilityString +{ + NetworkStatus temp = [self currentReachabilityStatus]; + + if(temp == ReachableViaWWAN) + { + // Updated for the fact that we have CDMA phones now! + return NSLocalizedString(@"Cellular", @""); + } + if (temp == ReachableViaWiFi) + { + return NSLocalizedString(@"WiFi", @""); + } + + return NSLocalizedString(@"No Connection", @""); +} + +-(NSString*)currentReachabilityFlags +{ + return reachabilityFlags([self reachabilityFlags]); +} + +#pragma mark - Callback function calls this method + +-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags +{ + if([self isReachableWithFlags:flags]) + { + if(self.reachableBlock) + { + self.reachableBlock(self); + } + } + else + { + if(self.unreachableBlock) + { + self.unreachableBlock(self); + } + } + + // this makes sure the change notification happens on the MAIN THREAD + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification + object:self]; + }); +} + +#pragma mark - Debug Description + +- (NSString *) description +{ + NSString *description = [NSString stringWithFormat:@"<%@: %#x (%@)>", + NSStringFromClass([self class]), (unsigned int) self, [self currentReachabilityFlags]]; + return description; +} + +@end diff --git a/iOSStudy/iOSStudy/SecondViewController.h b/iOSStudy/iOSStudy/SecondViewController.h index ed07da7..1d46884 100644 --- a/iOSStudy/iOSStudy/SecondViewController.h +++ b/iOSStudy/iOSStudy/SecondViewController.h @@ -9,9 +9,10 @@ #import #import "BaseViewController.h" #import "SecondViewControllerViewModel.h" -@interface SecondViewController : BaseViewController - +#import +@interface SecondViewController : BaseViewController @property (weak, nonatomic) IBOutlet UITableView *tableView; @property(nonatomic,strong)SecondViewControllerViewModel *viewModel; +@property(nonatomic,copy)NSString *favouriteType; @end diff --git a/iOSStudy/iOSStudy/SecondViewController.m b/iOSStudy/iOSStudy/SecondViewController.m index 3280128..202d168 100644 --- a/iOSStudy/iOSStudy/SecondViewController.m +++ b/iOSStudy/iOSStudy/SecondViewController.m @@ -16,6 +16,8 @@ #import "BlogDetailViewController.h" #import #import +#import +#import "EntityConstants.h" @interface SecondViewController () @end @@ -29,47 +31,52 @@ - (void)viewDidLoad { _tableView.delegate = self; _tableView.dataSource = self; + [self initViewData]; + +} + + + +-(void)initViewData{ - _viewModel = [[SecondViewControllerViewModel alloc]init]; - + _favouriteType = TYPE_BLOG_FAVOURITE_TYPE; + _viewModel = [[SecondViewControllerViewModel alloc]init]; [self.tableView addHeaderWithCallback:^{ + + [_viewModel getDate:^{ - [_tableView reloadData]; - [self stopEndRefreshing]; + [self stopTableRefreshing]; + } modelDataReload:^{ + [_tableView reloadData]; } modelDataErrors:^{ - - [self stopEndRefreshing]; - + [self stopTableRefreshing]; } modelDataIsNetworking:^(BOOL isNetWorking) { - - [self stopEndRefreshing]; - - }]; + [self stopTableRefreshing]; + } httpAdress:Adress_webs dataType:TYPE_WEB_SIMPLE_TYPE jsonClass:[WebBean class]]; + + + }]; - - - - [self.tableView headerBeginRefreshing]; - - } /** * 停止UITableView刷新 */ --(void)stopEndRefreshing{ +-(void)stopTableRefreshing{ if ([_tableView isHeaderRefreshing]) { [_tableView headerEndRefreshing]; } } + + -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; @@ -87,29 +94,33 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"WebCell"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + SWTableViewCell *cell = (SWTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; + cell = [[SWTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; + } - ; - cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; + cell.delegate = self; + - cell.textLabel.text = [_viewModel getBlogBean:indexPath].title; - cell.detailTextLabel.text = [_viewModel getBlogBean:indexPath].subTitle; + cell.textLabel.text = [[_viewModel getBlogBean:indexPath]valueForKey:FavouriteBean_title]; + cell.detailTextLabel.text = [[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_subtitle]; - [cell.imageView setImageWithURL:[NSURL URLWithString:[_viewModel getBlogBean:indexPath].webImage] placeholderImage:[UIImage imageNamed:@"SVWebViewControllerActivitySafari-iPad"]]; + + cell.rightUtilityButtons =[_viewModel setRightSWCellButtons:[[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_url] withType:TYPE_BLOG_FAVOURITE_TYPE]; + + + [cell.imageView setImageWithURL:[NSURL URLWithString:[[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_image_name]] placeholderImage:[UIImage imageNamed:@"SVWebViewControllerActivitySafari-iPad.png"]]; return cell; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ - - - SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithAddress:[_viewModel getBlogBean:indexPath].webUrl]; + + SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithAddress:[[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_url]]; [self presentViewController:webViewController animated:NO completion:NULL]; } @@ -122,6 +133,53 @@ -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ } +#pragma mark-- SWTableViewCell delagate + +- (BOOL)swipeableTableViewCellShouldHideUtilityButtonsOnSwipe:(SWTableViewCell *)cell +{ + + return YES; +} +- (BOOL)swipeableTableViewCell:(SWTableViewCell *)cell canSwipeToState:(SWCellState)state{ + + return YES; + +} + +- (void)swipeableTableViewCellDidEndScrolling:(SWTableViewCell *)cell{ + + //根据侧滑按钮是否显示设置箭头标志 + if (cell.isUtilityButtonsHidden) { + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + }else{ + cell.accessoryType = UITableViewCellAccessoryNone; + + } +} + +- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index{ + + + NSIndexPath *indexPath = [_tableView indexPathForCell:cell]; + + + [_viewModel saveFavourite:indexPath favouriteType:_favouriteType]; + + + [cell hideUtilityButtonsAnimated:YES]; + + [_tableView reloadData]; + + + +} + + + + + + + -(void)dealloc{ _tableView.delegate = nil; _tableView.dataSource = nil; diff --git a/iOSStudy/iOSStudy/ThirdTableViewController.h b/iOSStudy/iOSStudy/ThirdTableViewController.h index 948521d..1f4b0b5 100644 --- a/iOSStudy/iOSStudy/ThirdTableViewController.h +++ b/iOSStudy/iOSStudy/ThirdTableViewController.h @@ -8,8 +8,10 @@ #import #import "ThirdViewControllerViewModel.h" -@interface ThirdTableViewController : UIViewController +#import +@interface ThirdTableViewController : UIViewController @property (weak, nonatomic) IBOutlet UITableView *tableView; @property(nonatomic,strong)ThirdViewControllerViewModel *viewModel; +@property(nonatomic,copy)NSString* favouriteType; @end diff --git a/iOSStudy/iOSStudy/ThirdTableViewController.m b/iOSStudy/iOSStudy/ThirdTableViewController.m index 247b5fe..67f590d 100644 --- a/iOSStudy/iOSStudy/ThirdTableViewController.m +++ b/iOSStudy/iOSStudy/ThirdTableViewController.m @@ -19,6 +19,8 @@ #import "BaseTableViewCell.h" #import "UIImage+Resize.h" #import "VideoCell.h" +#import + @interface ThirdTableViewController () @end @@ -32,47 +34,54 @@ - (void)viewDidLoad { _tableView.delegate = self; _tableView.dataSource = self; + [self initViewData]; - _viewModel = [[ThirdViewControllerViewModel alloc]init]; +} + +-(void)initViewData{ + + _favouriteType = TYPE_BLOG_FAVOURITE_TYPE; + _viewModel = [[ThirdViewControllerViewModel alloc]init]; - [_tableView addHeaderWithCallback:^{ + [self.tableView addHeaderWithCallback:^{ + + [_viewModel getDate:^{ - [_tableView reloadData]; - [self stopEndRefreshing]; + [self stopTableRefreshing]; + } modelDataReload:^{ + [_tableView reloadData]; } modelDataErrors:^{ - - [self stopEndRefreshing]; - + [self stopTableRefreshing]; } modelDataIsNetworking:^(BOOL isNetWorking) { - - [self stopEndRefreshing]; - - }]; + [self stopTableRefreshing]; + } httpAdress:Adress_videos dataType:TYPE_VIDEO_SIMPLE_TYPE jsonClass:[VideoBean class]]; + + }]; - - - - [self.tableView headerBeginRefreshing]; - - } + + + + /** * 停止UITableView刷新 */ --(void)stopEndRefreshing{ +-(void)stopTableRefreshing{ if ([_tableView isHeaderRefreshing]) { [_tableView headerEndRefreshing]; } } + + -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; @@ -89,34 +98,35 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ + static NSString *CellIdentifier = @"VideoCell"; - VideoCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + SWTableViewCell *cell = (SWTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { - cell = [[VideoCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; + cell = [[SWTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; + } - - - - cell.videoTitle.text = [_viewModel getBlogBean:indexPath].title; - cell.videoSubTitle.text = [_viewModel getBlogBean:indexPath].subTitle; + cell.delegate = self; + cell.textLabel.text = [[_viewModel getBlogBean:indexPath]valueForKey:FavouriteBean_title]; + cell.detailTextLabel.text = [[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_subtitle]; - [cell.videoImageView setImageWithURL:[NSURL URLWithString:[_viewModel getBlogBean:indexPath].webImage] placeholderImage:[UIImage imageNamed:@"SVWebViewControllerActivitySafari-iPad"]]; - - + + cell.rightUtilityButtons =[_viewModel setRightSWCellButtons:[[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_url] withType:TYPE_BLOG_FAVOURITE_TYPE]; + [cell.imageView setImageWithURL:[NSURL URLWithString:[[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_image_name]] placeholderImage:[UIImage imageNamed:@"SVWebViewControllerActivitySafari-iPad.png"]]; + return cell; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ - SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithAddress:[_viewModel getBlogBean:indexPath].webUrl]; + SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithAddress:[[_viewModel getBlogBean:indexPath] valueForKey:FavouriteBean_url]]; [self presentViewController:webViewController animated:NO completion:NULL]; } @@ -129,6 +139,51 @@ -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ } +#pragma mark-- SWTableViewCell delagate + +- (BOOL)swipeableTableViewCellShouldHideUtilityButtonsOnSwipe:(SWTableViewCell *)cell +{ + + return YES; +} +- (BOOL)swipeableTableViewCell:(SWTableViewCell *)cell canSwipeToState:(SWCellState)state{ + + return YES; + +} + +- (void)swipeableTableViewCellDidEndScrolling:(SWTableViewCell *)cell{ + + //根据侧滑按钮是否显示设置箭头标志 + if (cell.isUtilityButtonsHidden) { + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + }else{ + cell.accessoryType = UITableViewCellAccessoryNone; + + } +} + +- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index{ + + + NSIndexPath *indexPath = [_tableView indexPathForCell:cell]; + + + [_viewModel saveFavourite:indexPath favouriteType:_favouriteType]; + + + [cell hideUtilityButtonsAnimated:YES]; + + [_tableView reloadData]; + + + +} + + + + + -(void)dealloc{ _tableView.delegate = nil; _tableView.dataSource = nil; diff --git a/iOSStudy/iOSStudy/Tools/CoreDataUtils.h b/iOSStudy/iOSStudy/Tools/CoreDataUtils.h new file mode 100644 index 0000000..5dd64a9 --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/CoreDataUtils.h @@ -0,0 +1,41 @@ +// +// CoreDataUtils.h +// iOSStudy +// +// Created by chenguandong on 15/4/3. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +@interface CoreDataUtils : NSObject +/** + * 检查数据是否在表中已经存在 + * + * @param tableName 表名 + * @param predicate 查询条件 + * + * @return YES 存在 NO不存在 + */ ++(BOOL)dataisExistTableName:(NSString*)tableName withPredicate:(NSPredicate*)predicate; + + +/** + * 查询数据 + * @param tableName 查询的表明称 + * @param predicate NSPredicate 查询条件 nil时表示没有查询条件 + * + * @return NSManagedObject 集合 + */ ++(NSArray*)queryDataFromTableName:(NSString*)tableName andNSPredicate:(NSPredicate*)predicate; + + +/** + * 删除指定表中的数据 + + * + * @param tableName 表名 + * @param andNSPredicate 删除条件 为nil 删除所有数据 + */ ++(void)deleteDateFromTableName:(NSString*)tableName andNSPredicate:(NSPredicate*)andNSPredicate; +@end diff --git a/iOSStudy/iOSStudy/Tools/CoreDataUtils.m b/iOSStudy/iOSStudy/Tools/CoreDataUtils.m new file mode 100644 index 0000000..c1fe7ec --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/CoreDataUtils.m @@ -0,0 +1,108 @@ +// +// CoreDataUtils.m +// iOSStudy +// +// Created by chenguandong on 15/4/3. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "CoreDataUtils.h" +#import +#import "Constants .h" +@implementation CoreDataUtils + +/** + * 检查数据是否在表中已经存在 + * + * @param url http地址 + * @param tableName 表名 + * @param rowName 数据所在的列名 + * + * @return YES 存在 NO 不存在 + */ ++(BOOL)dataisExistTableName:(NSString*)tableName withPredicate:(NSPredicate*)predicate{ + + NSError *error; + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription *entity = [NSEntityDescription + entityForName:tableName inManagedObjectContext:SharedApp.managedObjectContext]; + [fetchRequest setEntity:entity]; + + if (predicate) { + fetchRequest.predicate = predicate; + } + + NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + + + + //NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"%@ = %@",rowName, url]; + + + if (fetchedObjects.count!=0) { + // NSLog(@"111%lu",resultArr.count); + return YES; + }else{ + // NSLog(@"222%lu",resultArr.count); + return NO; + } + + +} + +/** + * 查询数据 + * @param tableName 查询的表明称 + * @param predicate NSPredicate 查询条件 nil时表示没有查询条件 + * + * @return NSManagedObject 集合 + */ ++(NSArray*)queryDataFromTableName:(NSString*)tableName andNSPredicate:(NSPredicate*)predicate{ + + NSError *error; + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription *entity = [NSEntityDescription + entityForName:tableName inManagedObjectContext:SharedApp.managedObjectContext]; + [fetchRequest setEntity:entity]; + + // NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url= %@", url]; + if (predicate) { + fetchRequest.predicate = predicate; + } + + NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + + + return [fetchedObjects filteredArrayUsingPredicate:predicate]; + + +} + + +/** + * 删除指定表中的数据 + + * + * @param tableName 表名 + * @param andNSPredicate 删除条件 为nil 删除所有数据 + */ ++(void)deleteDateFromTableName:(NSString*)tableName andNSPredicate:(NSPredicate*)andNSPredicate{ + //存储之前先删除原来的数据 + + //NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"type= %@", @"11"]; + + NSArray* managerObjtList = [CoreDataUtils queryDataFromTableName:tableName andNSPredicate:andNSPredicate]; + + for (NSManagedObject *obct in managerObjtList) { + [SharedApp.managedObjectContext deleteObject:obct]; + } + + + NSError *error = nil; + if (![SharedApp.managedObjectContext save:&error]) { + NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]); + return; + } + +} +@end diff --git a/iOSStudy/iOSStudy/Tools/DBUtils.h b/iOSStudy/iOSStudy/Tools/DBUtils.h new file mode 100644 index 0000000..7d8c6b5 --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/DBUtils.h @@ -0,0 +1,31 @@ +// +// DBUtils.h +// iOSStudy +// +// Created by chenguandong on 15/2/25. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + + +#import +#import "Constants .h" + +typedef void(^FMDB)(FMDatabase *db); + + +typedef void (^executeSqlStart)(); + +typedef void (^executeSqlSuccess)(BOOL isSqlSuccess); + +typedef void (^executeSqlFail)(BOOL isFail); + +@interface DBUtils : NSObject +/** + * 执行数据库操作 + * + * @param fmdb_block 执行数据库操作回调 + */ ++(void)executeSQL:(FMDB)fmdb_block; +@end diff --git a/iOSStudy/iOSStudy/Tools/DBUtils.m b/iOSStudy/iOSStudy/Tools/DBUtils.m new file mode 100644 index 0000000..6187a58 --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/DBUtils.m @@ -0,0 +1,89 @@ +// +// DBUtils.m +// iOSStudy +// +// Created by chenguandong on 15/2/25. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "DBUtils.h" + + +/** + * 博客表表名 + */ +NSString *const blogsTableName = @"blogs"; +/** + * 数据库名字 + */ +NSString *const DBPath = @"iOSStudy.db"; + +@implementation DBUtils + ++ (instancetype)sharedInstance { + static dispatch_once_t once; + static id sharedInstance; + dispatch_once(&once, ^ + + { + sharedInstance = [[self alloc] init]; + + [self createDB]; + }); + + return sharedInstance; + } + + +/** + * 回去数据库地址 + * + * @return 数据库地址 + */ ++(NSString*)getDBPath{ + + return [PATH_OF_DOCUMENT stringByAppendingPathComponent:DBPath]; +} + + +/** + * 执行数据库操作 + * + * @param fmdb_block 执行数据库操作回调 + */ ++(void)executeSQL:(FMDB)fmdb_block{ + FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:[self getDBPath]]; + [queue inDatabase:fmdb_block]; +} + +/** + * 创建数据库和表 + */ ++(void)createDB{ + + NSFileManager * fileManager = [NSFileManager defaultManager]; + if ([fileManager fileExistsAtPath:[self getDBPath]] == NO) { + // create it + FMDatabase * db = [FMDatabase databaseWithPath:[self getDBPath]]; + + if ([db open]) { + NSString * sql = [NSString stringWithFormat:@"CREATE TABLE '%@' ('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , 'title' VARCHAR(255), 'subtitle' VARCHAR(255),'image_name' VARCHAR(255)),'url' VARCHAR(255)),'type' INTEGER)",blogsTableName]; + + if (![db tableExists:blogsTableName]) { + BOOL res = [db executeUpdate:sql]; + if (!res) { + NSLog(@"error when creating db table blogs"); + } else { + NSLog(@"succ to creating db table blogs"); + } + + }else{ + NSLog(@"blogsTableName has ready created!"); + } + [db close]; + } else { + NSLog(@"error when open db"); + } + } +} +@end diff --git a/iOSStudy/iOSStudy/Tools/HttpVersionTools.h b/iOSStudy/iOSStudy/Tools/HttpVersionTools.h new file mode 100644 index 0000000..fbb382d --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/HttpVersionTools.h @@ -0,0 +1,79 @@ +// +// HttpVersionTools.h +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + + +/** + * 网络请求成功回调 + */ +typedef void (^versionSuccess)(NSArray*versionLists); +/** + * 网络请求失败回调 + */ +typedef void (^versionError)(); + +/** + * 网络是否链接回调 + * + * @param isNetWorking YES 有网络 NO 没有网络 + */ +typedef void (^versionNetWorking)(BOOL isNetWorking); + + +@interface HttpVersionTools : NSObject + + +/** + * 得到当前服务器版本号列表 + * + * @return 服务器版本号列表 + */ ++(void)getVersions:(versionSuccess)v_success v_error:(versionError)v_error v_netWork:(versionNetWorking)v_netWork; + + +/** + * 判断版本号是否向服务器请求最新数据 + * + * @param url http请求地址 + * + * @return YES 发送请求 NO 不发送请求 + */ ++(BOOL)checkHttpVersion:(NSString*)url nowVersion:(NSString*)nowVersion; + + +/** + * 返回服务器当前url版本号 + * + * @param url http请求地址 + * + * @return 服务器当前url版本号 + */ ++(NSString*)getNowHttpVersion:(NSString*)url; + + +/** + * 得到URL本地版本号 + * + * @param url URL地址 + * + * @return !nil 本地版本号 nil 没有本地版本号 + */ ++(NSString*)getLocalHttpVersion:(NSString*)url; + + + +/** + * 存储当前服务器返回的版本号 + * + * @param url http 请求地址 + * @param version 版本号 + */ ++(void)saveNowHttpVersion:(NSString*)url version:(NSString*)version; + +@end diff --git a/iOSStudy/iOSStudy/Tools/HttpVersionTools.m b/iOSStudy/iOSStudy/Tools/HttpVersionTools.m new file mode 100644 index 0000000..668936b --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/HttpVersionTools.m @@ -0,0 +1,204 @@ +// +// HttpVersionTools.m +// iOSStudy +// +// Created by chenguandong on 15/4/2. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "HttpVersionTools.h" +#import "NetWorkTools.h" +#import "JsonTools.h" +#import +#import "VersionBean.h" +#import "CoreDataUtils.h" +@implementation HttpVersionTools + ++(void)getVersions:(versionSuccess)v_success v_error:(versionError)v_error v_netWork:(versionNetWorking)v_netWork{ + + + __block NSMutableArray*versionArr = [NSMutableArray arrayWithCapacity:5]; + + [NetWorkTools postHttp:Adress_versions success:^(AFHTTPRequestOperation *operation, id responseObject) { + + NSLog(@"JSON: %@", [operation responseString]); + + NSArray *dic = [JsonTools getJsonNSDictionary:[operation responseString]]; + + //将JSON数据和Model的属性进行绑定 + + NSArray *arr = [MTLJSONAdapter modelsOfClass:[VersionBean class] fromJSONArray:dic error:nil]; + + versionArr = [arr copy]; + +// for (VersionBean *vBean in versionArr) { +// NSLog(@"version =%@",vBean.urlVersion); +// } + + v_success(versionArr); + + } error:^(AFHTTPRequestOperation *operation, NSError *error) { + NSLog(@"Error: %@", error); + + v_error(); + + } isNetworking:^(BOOL isNetwork) { + + + v_netWork(isNetwork); + }]; + + +} + +/** + * 返回服务器当前url版本号 + * + * @param url http请求地址 + * + * @return 服务器当前url版本号 + */ ++(NSString*)getNowHttpVersion:(NSString*)url{ + + NSString *versionStr ; + for (VersionBean *vBean in SharedApp.versionLists) { + + + if ([vBean.url isEqualToString:url]) { + + versionStr = vBean.urlVersion; + return versionStr; + }else{ + versionStr = nil; + } + } + NSLog(@"nowVersion = %@",versionStr); + return versionStr; +} + + +/** + * 存储当前服务器返回的版本号 + * + * @param url http 请求地址 + * @param version 版本号 + */ ++(void)saveNowHttpVersion:(NSString*)url version:(NSString*)version{ + + NSString *log ; + + //当数据存在事后执行更新操作 + //[CoreDataUtils dataisExist:url inTable:CD_VersionsEntity tableRowName:@"url"] + NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"%@ = %@",@"url", url]; + if ( + [CoreDataUtils dataisExistTableName:CD_VersionsEntity withPredicate:urlPredicate] + ) + + { + + + NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"url= %@", url]; + + NSArray *managerList = [CoreDataUtils queryDataFromTableName:CD_VersionsEntity andNSPredicate:urlPredicate]; + + if (managerList.count!=0) { + NSManagedObject *updateObjt= managerList.firstObject; + [updateObjt setValue:url forKey:@"url"]; + [updateObjt setValue:version forKey:@"url_version"]; + } + + log = @"版本更新成功"; + + } + else + //当数据不存在的事后执行插入操作 + { + NSManagedObject *managerObjt =[NSEntityDescription insertNewObjectForEntityForName:CD_VersionsEntity inManagedObjectContext:SharedApp.managedObjectContext]; + + + [managerObjt setValue:url forKey:@"url"]; + [managerObjt setValue:version forKey:@"url_version"];; + + log = @"版本插入成功"; + + } + + NSError *error; + if (![SharedApp.managedObjectContext save:&error]) + { + NSLog(@"%@: %@", log,[error localizedDescription]); + + } + + +} + + + +/** + * 判断版本号是否向服务器请求最新数据 + * + * @param url http请求地址 + * + * @return YES 发送请求 NO 不发送请求 + */ ++(BOOL)checkHttpVersion:(NSString*)url nowVersion:(NSString*)nowVersion{ + + + + + if (nowVersion!=nil) { + //从数据库拿到URL 版本号 如果没有说明第一次请求 直接发送请求 + + if ([[self getLocalHttpVersion:url]floatValue]!=[nowVersion floatValue]) { + + + + return YES; + }else{ + return NO; + } + }else{ + return YES; + } + + +} + +/** + * 得到URL本地版本号 + * + * @param url URL地址 + * + * @return !nil 本地版本号 nil 没有本地版本号 + */ ++(NSString*)getLocalHttpVersion:(NSString*)url{ + NSError *error; + NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription *entity = [NSEntityDescription + entityForName:CD_VersionsEntity inManagedObjectContext:SharedApp.managedObjectContext]; + [fetchRequest setEntity:entity]; + + NSArray *fetchedObjects = [SharedApp.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + + + NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"url = %@", url]; + + + NSArray *resultArr = [fetchedObjects filteredArrayUsingPredicate:titlePredicate]; + if (resultArr.count!=0) { + NSLog(@"111%lu",resultArr.count); + + NSManagedObject *objt = resultArr[0]; + + + return [objt valueForKey:@"url_version"]; + }else{ + NSLog(@"没有查到本地版本%lu",resultArr.count); + return nil; + } + + +} + +@end diff --git a/iOSStudy/iOSStudy/Tools/JsonTools.h b/iOSStudy/iOSStudy/Tools/JsonTools.h new file mode 100644 index 0000000..efe9dfb --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/JsonTools.h @@ -0,0 +1,13 @@ +// +// JsonTools.h +// iOSStudy +// +// Created by chenguandong on 15/2/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +@interface JsonTools : NSObject ++(id)getJsonNSDictionary:(NSString *)jsonString; +@end diff --git a/iOSStudy/iOSStudy/Tools/JsonTools.m b/iOSStudy/iOSStudy/Tools/JsonTools.m new file mode 100644 index 0000000..ba064db --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/JsonTools.m @@ -0,0 +1,24 @@ +// +// JsonTools.m +// iOSStudy +// +// Created by chenguandong on 15/2/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "JsonTools.h" + +@implementation JsonTools + + + ++(id)getJsonNSDictionary:(NSString *)jsonString{ + NSData *data = [ jsonString dataUsingEncoding:NSUTF8StringEncoding]; + //IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中 + id JsonObjectAll = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; + + + return JsonObjectAll; +} + +@end diff --git a/iOSStudy/iOSStudy/Tools/NetWorkTools.h b/iOSStudy/iOSStudy/Tools/NetWorkTools.h new file mode 100644 index 0000000..7187dec --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/NetWorkTools.h @@ -0,0 +1,29 @@ +// +// NetWorkTools.h +// iOSStudy +// +// Created by chenguandong on 15/1/31. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import +#import +#import "Constants .h" + +typedef void(^success)(AFHTTPRequestOperation *operation, id responseObject) ; +typedef void(^error)(AFHTTPRequestOperation *operation, NSError *error); +typedef void(^isNetwork) (BOOL isNetwork); + +@interface NetWorkTools : NSObject + + + ++ (instancetype)sharedInstance; + ++(void)postHttp:(NSString*)httpUrl success:(success)success error:(error)error isNetworking:(isNetwork)isNetworking; + +/* + *检查网络连接注册通知 + */ ++(void)checkNetworking; +@end diff --git a/iOSStudy/iOSStudy/Tools/NetWorkTools.m b/iOSStudy/iOSStudy/Tools/NetWorkTools.m new file mode 100644 index 0000000..007d513 --- /dev/null +++ b/iOSStudy/iOSStudy/Tools/NetWorkTools.m @@ -0,0 +1,109 @@ +// +// NetWorkTools.m +// iOSStudy +// +// Created by chenguandong on 15/1/31. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "NetWorkTools.h" +#import +#import "Reachability.h" +@implementation NetWorkTools + + ++ (instancetype)sharedInstance { + static dispatch_once_t once; + static id sharedInstance; + dispatch_once(&once, ^{ + sharedInstance = [[self alloc] init]; + }); + + return sharedInstance; +} + + ++(void)postHttp:(NSString*)httpUrl success:(success)success error:(error)error isNetworking:(isNetwork)isNetworking{ + + + if (SharedApp.isNetworking) { + AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; + manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil]; + [manager POST:httpUrl parameters:nil success:success failure:error]; + }else{ + + isNetworking(false); + + NSLog(@"REACHABLE!"); + [SVProgressHUD showErrorWithStatus:@"无网络连接" maskType:SVProgressHUDMaskTypeGradient]; + + double delayInSeconds = 3.0; dispatch_time_t + popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + // code to be executed on the main queue after delay + [SVProgressHUD dismiss]; + }); + + + } +} + + ++(void)checkNetworking{ + + + + + // Allocate a reachability object + Reachability* reach = [Reachability reachabilityWithHostname:@"http://www.baidu.com"]; + + // Set the blocks + reach.reachableBlock = ^(Reachability*reach) + { + // keep in mind this is called on a background thread + // and if you are updating the UI it needs to happen + // on the main thread, like this: + + NSLog(@"网络已经连接!"); + + + SharedApp.isNetworking = YES; + + [SVProgressHUD dismiss]; + + + }; + + reach.unreachableBlock = ^(Reachability*reach) + { + NSLog(@"网络断开!"); + + SharedApp.isNetworking = YES; + + dispatch_async(dispatch_get_main_queue(), ^{ + + [SVProgressHUD showErrorWithStatus:@"无网络连接" maskType:SVProgressHUDMaskTypeGradient]; + + double delayInSeconds = 2.0; + dispatch_time_t + popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + // code to be executed on the main queue after delay + + [SVProgressHUD dismiss]; + }); + }); + + }; + + // Start the notifier, which will cause the reachability object to retain itself! + [reach startNotifier]; + + + +} + + + + +@end diff --git a/iOSStudy/iOSStudy/ViewColl/BlogDetailViewController.h b/iOSStudy/iOSStudy/ViewColl/BlogDetailViewController.h new file mode 100644 index 0000000..d89cec1 --- /dev/null +++ b/iOSStudy/iOSStudy/ViewColl/BlogDetailViewController.h @@ -0,0 +1,13 @@ +// +// BlogDetailViewController.h +// iOSStudy +// +// Created by chenguandong on 15/2/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import + +@interface BlogDetailViewController : UIViewController + +@end diff --git a/iOSStudy/iOSStudy/ViewColl/BlogDetailViewController.m b/iOSStudy/iOSStudy/ViewColl/BlogDetailViewController.m new file mode 100644 index 0000000..d1e511c --- /dev/null +++ b/iOSStudy/iOSStudy/ViewColl/BlogDetailViewController.m @@ -0,0 +1,40 @@ +// +// BlogDetailViewController.m +// iOSStudy +// +// Created by chenguandong on 15/2/5. +// Copyright (c) 2015年 chenguandong. All rights reserved. +// + +#import "BlogDetailViewController.h" +#import "DBUtils.h" +@interface BlogDetailViewController () + +@end + +@implementation BlogDetailViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. + [DBUtils executeSQL:^(FMDatabase *db) { + + }]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h index 10d6be2..99a65bd 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.h @@ -36,14 +36,6 @@ typedef void (^modelNetWorking)(BOOL isNetWorking); @interface FirstViewControllerViewModel : NSObject @property(nonatomic,strong)NSArray *array; -/** - * 获取博客数据 - * - * @param modelDataSuccess 获取博客数据成功 - * @param modelDataErrors 获取博客数据失败 - * @param modelDataIsNetWoring 是否有网络 - */ --(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring; /** * 获取table的行数 @@ -68,7 +60,7 @@ typedef void (^modelNetWorking)(BOOL isNetWorking); * * @param indexPath indexPath */ --(void)saveFavourite:(NSIndexPath*)indexPath; +-(void)saveFavourite:(NSIndexPath*)indexPath favouriteType:(NSString*)type; @@ -77,11 +69,11 @@ typedef void (^modelNetWorking)(BOOL isNetWorking); * 请求网络数据 * * @param modelDataSuccess 请求成功 - * @param modelPersistentReload 刷新Table + * @param modelDataStart 请求开始 * @param modelDataErrors 请求失败 * @param modelDataIsNetWoring 网络状态 */ --(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentReload)modelDataReload modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring; +-(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentReload)modelDataReload modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring httpAdress:(NSString*)httpAdress dataType:(NSString*)dataType jsonClass:(Class)myClass; /** @@ -93,4 +85,16 @@ typedef void (^modelNetWorking)(BOOL isNetWorking); * @return 要显示的Button集合 */ - (NSArray *)setRightSWCellButtons:(NSString*)url withType:(NSString*)type; + +#pragma mark -- 持久化所有数据 +-(void)persistenceDataWithType:(NSString*)type; + +/** + * 判断收藏的URL地址是否存在 + * + * @param url URL地址 + * + * @return YES 存在 NO 不存在 + */ +-(BOOL)isExistSimpleDataWithURL:(NSString*)url; @end diff --git a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m index 4cfe441..1957547 100644 --- a/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m +++ b/iOSStudy/iOSStudy/ViewModel/FirstViewControllerViewModel.m @@ -48,21 +48,21 @@ -(NSManagedObject*)getBlogBean:(NSIndexPath *)indexPath{ * @param modelDataErrors 请求失败 * @param modelDataIsNetWoring 网络状态 */ --(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentReload)modelDataReload modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring{ +-(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentReload)modelDataReload modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring httpAdress:(NSString*)httpAdress dataType:(NSString*)dataType jsonClass:(Class)myClass{ - _array = [[self getPersistenceDataWithType:TYPE_BLOG_SIMPLE_TYPE]copy]; + _array = [[self getPersistenceDataWithType:dataType]copy]; modelDataReload(); __block NSString *versionStr; - if ([HttpVersionTools checkHttpVersion:Address_blogs nowVersion:[HttpVersionTools getNowHttpVersion:Address_blogs]]) { + if ([HttpVersionTools checkHttpVersion:httpAdress nowVersion:[HttpVersionTools getNowHttpVersion:httpAdress]]) { // - [NetWorkTools postHttp:Address_blogs success:^(AFHTTPRequestOperation *operation, id responseObject) { + [NetWorkTools postHttp:httpAdress success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", [operation responseString]); @@ -77,7 +77,7 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentRe // NSLog(@"%@arr=",dic[@"bloglists"]); - NSArray *arr = [MTLJSONAdapter modelsOfClass:[BlogBean class] fromJSONArray:dic[@"bloglists"] error:nil]; + NSArray *arr = [MTLJSONAdapter modelsOfClass:myClass fromJSONArray:dic[@"bloglists"] error:nil]; @@ -86,13 +86,13 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentRe //持久化数据 - [self persistenceData]; + [self persistenceDataWithType:dataType]; //当前最新版本号存入数据库 - [HttpVersionTools saveNowHttpVersion:Address_blogs version:versionStr]; + [HttpVersionTools saveNowHttpVersion:httpAdress version:versionStr]; - _array = [[self getPersistenceDataWithType:TYPE_BLOG_SIMPLE_TYPE]copy]; + _array = [[self getPersistenceDataWithType:dataType]copy]; modelDataSuccess(); @@ -124,73 +124,6 @@ -(void)getDate:(modelSuccess)modelDataSuccess modelDataReload:(modelPersistentRe } --(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring{ - - - _array = [[self getPersistenceDataWithType:TYPE_BLOG_SIMPLE_TYPE]copy]; - modelDataSuccess(); - - - __block NSString *versionStr; - - if ([HttpVersionTools checkHttpVersion:Address_blogs nowVersion:[HttpVersionTools getNowHttpVersion:Address_blogs]]) { - - // - [NetWorkTools postHttp:Address_blogs success:^(AFHTTPRequestOperation *operation, id responseObject) { - - NSLog(@"JSON: %@", [operation responseString]); - - NSDictionary *dic = [JsonTools getJsonNSDictionary:[operation responseString]]; - - //NSLog(@"jsonVersion=%@",dic[@"version"]); - - - versionStr =dic[@"version"]; - - //将JSON数据和Model的属性进行绑定 - - // NSLog(@"%@arr=",dic[@"bloglists"]); - - NSArray *arr = [MTLJSONAdapter modelsOfClass:[BlogBean class] fromJSONArray:dic[@"bloglists"] error:nil]; - - - - _array = [arr copy]; - - - modelDataSuccess(); - - //持久化数据 - [self persistenceData]; - - //当前最新版本号存入数据库 - - [HttpVersionTools saveNowHttpVersion:Address_blogs version:versionStr]; - - - } error:^(AFHTTPRequestOperation *operation, NSError *error) { - NSLog(@"Error: %@", error); - - modelDataErrors(); - - } isNetworking:^(BOOL isNetwork) { - - - modelDataIsNetWoring(isNetwork); - - - }]; - }else{ - //直接显示持久化数据 数据显示完毕 - modelDataSuccess(); - - NSLog(@"cout====%ld",_array.count); - } - - - - -} #pragma mark -- 得到持久化的数据 -(NSArray*)getPersistenceDataWithType:(NSString*)type{ @@ -213,10 +146,10 @@ -(NSArray*)getPersistenceDataWithType:(NSString*)type{ } #pragma mark -- 持久化所有数据 --(void)persistenceData{ +-(void)persistenceDataWithType:(NSString*)type{ //删除已经存在的数据 - NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"type= %@", @"11"]; + NSPredicate *titlePredicate = [NSPredicate predicateWithFormat:@"type= %@", type]; [CoreDataUtils deleteDateFromTableName:CD_FAVOURITE_BEAN andNSPredicate:titlePredicate]; @@ -232,7 +165,7 @@ -(void)persistenceData{ [favouriteBean setValue:bean.subTitle forKey:FavouriteBean_subtitle]; [favouriteBean setValue:bean.image forKey:FavouriteBean_image_name]; [favouriteBean setValue:bean.url forKey:FavouriteBean_url]; - [favouriteBean setValue:TYPE_BLOG_SIMPLE_TYPE forKey:FavouriteBean_type]; + [favouriteBean setValue:type forKey:FavouriteBean_type]; } @@ -250,12 +183,12 @@ -(void)persistenceData{ } --(void)saveFavourite:(NSIndexPath*)indexPath{ +-(void)saveFavourite:(NSIndexPath*)indexPath favouriteType:(NSString*)type{ NSManagedObject *loveBean = _array[indexPath.row]; - NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"url= %@ AND type=%@", [loveBean valueForKey:FavouriteBean_url],TYPE_BLOG_FAVOURITE_TYPE]; + NSPredicate *urlPredicate = [NSPredicate predicateWithFormat:@"url= %@ AND type=%@", [loveBean valueForKey:FavouriteBean_url],type]; NSArray*favouriteList = [CoreDataUtils queryDataFromTableName:CD_FAVOURITE_BEAN andNSPredicate:urlPredicate]; if (favouriteList.count!=0) { NSLog(@"已经有这条数据了 ");//更新收藏的状态 @@ -305,12 +238,12 @@ -(void)saveFavourite:(NSIndexPath*)indexPath{ * * @return YES 存在 NO 不存在 */ --(BOOL)isEXistFavouriteDataWithURL:(NSString*)url andUrlType:(NSString*)type{ - - NSPredicate *urlAndurlTypePredicate = [NSPredicate predicateWithFormat:@"url = %@ AND type=%@",url,TYPE_BLOG_FAVOURITE_TYPE]; - - return [CoreDataUtils dataisExistTableName:CD_FAVOURITE_BEAN withPredicate:urlAndurlTypePredicate]; -} +//-(BOOL)isEXistFavouriteDataWithURL:(NSString*)url andUrlType:(NSString*)type{ +// +// NSPredicate *urlAndurlTypePredicate = [NSPredicate predicateWithFormat:@"url = %@ AND type=%@",url,TYPE_BLOG_FAVOURITE_TYPE]; +// +// return [CoreDataUtils dataisExistTableName:CD_FAVOURITE_BEAN withPredicate:urlAndurlTypePredicate]; +//} /** * 判断收藏的URL地址是否存在 diff --git a/iOSStudy/iOSStudy/ViewModel/ThirdViewControllerViewModel.h b/iOSStudy/iOSStudy/ViewModel/ThirdViewControllerViewModel.h index 682b3db..7957bd8 100644 --- a/iOSStudy/iOSStudy/ViewModel/ThirdViewControllerViewModel.h +++ b/iOSStudy/iOSStudy/ViewModel/ThirdViewControllerViewModel.h @@ -10,36 +10,9 @@ #import "NetWorkTools.h" #import "JsonTools.h" #import "VideoBean.h" -typedef void (^modelSuccess)(); -typedef void (^modelError)(); -typedef void (^modelNetWorking)(BOOL isNetWorking); +#import "EntityConstants.h" +#import "CoreDataUtils.h" +#import "FirstViewControllerViewModel.h" +@interface ThirdViewControllerViewModel : FirstViewControllerViewModel -@interface ThirdViewControllerViewModel : NSObject -@property(nonatomic,strong)NSArray *array; - -/** - * 获取推荐网站数据 - * - * @param modelDataSuccess 获取推荐网站数据成功 - * @param modelDataErrors 获取推荐网站数据失败 - * @param modelDataIsNetWoring 是否有网络连接 - */ --(void)getDate:(modelSuccess)modelDataSuccess modelDataErrors:(modelError)modelDataErrors modelDataIsNetworking:(modelNetWorking)modelDataIsNetWoring; - -/** - * 返回table 的行数 - * - * @return table行数 - */ -- (NSInteger)getNumberOfRowsInSection; - - -/** - * 返回单个cell的数据 - * - * @param indexPath cell 的indexPath - * - * @return cell的数据 - */ --(WebBean*)getBlogBean:(NSIndexPath *)indexPath; @end diff --git a/iOSStudy/iOSStudy/iOSStudy.xcodeproj/project.pbxproj b/iOSStudy/iOSStudy/iOSStudy.xcodeproj/project.pbxproj new file mode 100644 index 0000000..64141a9 --- /dev/null +++ b/iOSStudy/iOSStudy/iOSStudy.xcodeproj/project.pbxproj @@ -0,0 +1,929 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 184F48AF1A93321700C5C22F /* SecondViewControllerViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 184F48AE1A93321700C5C22F /* SecondViewControllerViewModel.m */; }; + 184F48B41A93340F00C5C22F /* WebBean.m in Sources */ = {isa = PBXBuildFile; fileRef = 184F48B31A93340F00C5C22F /* WebBean.m */; }; + 185EEB4B1A98DC9900BFDB79 /* SettingTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 185EEB4A1A98DC9900BFDB79 /* SettingTableViewController.m */; }; + 185EEB4F1A98E0BA00BFDB79 /* tabbar_setting.png in Resources */ = {isa = PBXBuildFile; fileRef = 185EEB4C1A98E0BA00BFDB79 /* tabbar_setting.png */; }; + 185EEB501A98E0BA00BFDB79 /* tabbar_setting@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 185EEB4D1A98E0BA00BFDB79 /* tabbar_setting@2x.png */; }; + 185EEB511A98E0BA00BFDB79 /* tabbar_setting@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 185EEB4E1A98E0BA00BFDB79 /* tabbar_setting@3x.png */; }; + 189EF8331A8399B100F19327 /* BlogBean.m in Sources */ = {isa = PBXBuildFile; fileRef = 189EF8321A8399B100F19327 /* BlogBean.m */; }; + 189EF8361A839FC600F19327 /* JsonTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 189EF8351A839FC600F19327 /* JsonTools.m */; }; + 189EF83A1A83C3AF00F19327 /* BlogDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 189EF8391A83C3AF00F19327 /* BlogDetailViewController.m */; }; + 18A998931A7C77D0002E7219 /* NetWorkTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 18A998921A7C77D0002E7219 /* NetWorkTools.m */; }; + 18AB47951A99969600E4C030 /* VideoBean.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AB47941A99969600E4C030 /* VideoBean.m */; }; + 18AB47981A99A51200E4C030 /* BaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AB47971A99A51200E4C030 /* BaseTableViewCell.m */; }; + 18AB479B1A9C59CB00E4C030 /* UIImage+Resize.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AB479A1A9C59CB00E4C030 /* UIImage+Resize.m */; }; + 18AB479F1A9C5E3300E4C030 /* VideoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AB479E1A9C5E3300E4C030 /* VideoCell.m */; }; + 18AB47A51A9C82FA00E4C030 /* AddBlogTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AB47A41A9C82FA00E4C030 /* AddBlogTableViewController.m */; }; + 18AB47A81A9DA40500E4C030 /* DBUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AB47A71A9DA40500E4C030 /* DBUtils.m */; }; + 18AB47AB1AA415A400E4C030 /* FavouriteBean.m in Sources */ = {isa = PBXBuildFile; fileRef = 18AB47AA1AA415A400E4C030 /* FavouriteBean.m */; }; + 18B23B251A7A14D100E80854 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B241A7A14D100E80854 /* main.m */; }; + 18B23B281A7A14D100E80854 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B271A7A14D100E80854 /* AppDelegate.m */; }; + 18B23B2B1A7A14D100E80854 /* FirstViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B2A1A7A14D100E80854 /* FirstViewController.m */; }; + 18B23B2E1A7A14D100E80854 /* SecondViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B2D1A7A14D100E80854 /* SecondViewController.m */; }; + 18B23B311A7A14D100E80854 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 18B23B2F1A7A14D100E80854 /* Main.storyboard */; }; + 18B23B331A7A14D100E80854 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 18B23B321A7A14D100E80854 /* Images.xcassets */; }; + 18B23B361A7A14D100E80854 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 18B23B341A7A14D100E80854 /* LaunchScreen.xib */; }; + 18B23B421A7A14D100E80854 /* iOSStudyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B411A7A14D100E80854 /* iOSStudyTests.m */; }; + 18B23B4D1A7A234800E80854 /* BaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18B23B4C1A7A234800E80854 /* BaseViewController.m */; }; + 18C845091ACCFC690053884F /* HttpVersionTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C845081ACCFC690053884F /* HttpVersionTools.m */; }; + 18C8450C1ACD41C40053884F /* BlogJsonBean.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C8450B1ACD41C40053884F /* BlogJsonBean.m */; }; + 18C8450F1ACE3E580053884F /* CoreDataUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C8450E1ACE3E580053884F /* CoreDataUtils.m */; }; + 18C845121ACE4A580053884F /* WelcomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C845111ACE4A580053884F /* WelcomeViewController.m */; }; + 18C845151ACE56150053884F /* MainTabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18C845141ACE56150053884F /* MainTabBarViewController.m */; }; + 18CECC0A1A91ACB7005598E4 /* FirstViewControllerViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 18CECC091A91ACB7005598E4 /* FirstViewControllerViewModel.m */; }; + 18D201161A95A6F400D5F095 /* icon_29.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2010D1A95A6F400D5F095 /* icon_29.png */; }; + 18D201171A95A6F400D5F095 /* icon_40.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2010E1A95A6F400D5F095 /* icon_40.png */; }; + 18D201181A95A6F400D5F095 /* icon_58.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2010F1A95A6F400D5F095 /* icon_58.png */; }; + 18D201191A95A6F400D5F095 /* icon_76.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201101A95A6F400D5F095 /* icon_76.png */; }; + 18D2011A1A95A6F400D5F095 /* icon_80.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201111A95A6F400D5F095 /* icon_80.png */; }; + 18D2011B1A95A6F400D5F095 /* icon_87.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201121A95A6F400D5F095 /* icon_87.png */; }; + 18D2011C1A95A6F400D5F095 /* icon_120.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201131A95A6F400D5F095 /* icon_120.png */; }; + 18D2011D1A95A6F400D5F095 /* icon_152.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201141A95A6F400D5F095 /* icon_152.png */; }; + 18D2011E1A95A6F400D5F095 /* icon_180.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201151A95A6F400D5F095 /* icon_180.png */; }; + 18D201221A95A70900D5F095 /* tabbar_blog.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2011F1A95A70900D5F095 /* tabbar_blog.png */; }; + 18D201231A95A70900D5F095 /* tabbar_blog@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201201A95A70900D5F095 /* tabbar_blog@2x.png */; }; + 18D201241A95A70900D5F095 /* tabbar_blog@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201211A95A70900D5F095 /* tabbar_blog@3x.png */; }; + 18D2012B1A95A9D600D5F095 /* tabbar_video.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201251A95A9D600D5F095 /* tabbar_video.png */; }; + 18D2012C1A95A9D600D5F095 /* tabbar_video@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201261A95A9D600D5F095 /* tabbar_video@2x.png */; }; + 18D2012D1A95A9D600D5F095 /* tabbar_video@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201271A95A9D600D5F095 /* tabbar_video@3x.png */; }; + 18D2012E1A95A9D600D5F095 /* tabbar_web.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201281A95A9D600D5F095 /* tabbar_web.png */; }; + 18D2012F1A95A9D600D5F095 /* tabbar_web@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201291A95A9D600D5F095 /* tabbar_web@2x.png */; }; + 18D201301A95A9D600D5F095 /* tabbar_web@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2012A1A95A9D600D5F095 /* tabbar_web@3x.png */; }; + 18D201351A96090A00D5F095 /* app_img_640.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201321A96090A00D5F095 /* app_img_640.png */; }; + 18D201361A96090A00D5F095 /* app_img_1136.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201331A96090A00D5F095 /* app_img_1136.png */; }; + 18D201371A96090A00D5F095 /* app_img_iOS8.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201341A96090A00D5F095 /* app_img_iOS8.png */; }; + 18D2013C1A960B6100D5F095 /* app_img_768x1024.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201381A960B6100D5F095 /* app_img_768x1024.png */; }; + 18D2013D1A960B6100D5F095 /* app_img_1024x768.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D201391A960B6100D5F095 /* app_img_1024x768.png */; }; + 18D2013E1A960B6100D5F095 /* app_img_1536x2048.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2013A1A960B6100D5F095 /* app_img_1536x2048.png */; }; + 18D2013F1A960B6100D5F095 /* app_img_2048x1536.png in Resources */ = {isa = PBXBuildFile; fileRef = 18D2013B1A960B6100D5F095 /* app_img_2048x1536.png */; }; + 18D201421A96143300D5F095 /* ThirdViewControllerViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 18D201411A96143300D5F095 /* ThirdViewControllerViewModel.m */; }; + 18D4ECA61AD17F56009FE9F0 /* EntityConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 18D4ECA51AD17F56009FE9F0 /* EntityConstants.m */; }; + 18D908A71A8A205600B42A42 /* ThirdTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 18D908A61A8A205600B42A42 /* ThirdTableViewController.m */; }; + 18DF6D3D1A80D3BC005751E8 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 18DF6D3C1A80D3BC005751E8 /* Reachability.m */; }; + 18DF6D3F1A80D40D005751E8 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18DF6D3E1A80D40D005751E8 /* SystemConfiguration.framework */; }; + 18E016AA1ACAA898002A6E59 /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18E016A91ACAA898002A6E59 /* CoreData.framework */; }; + 18E016E51ACAAB35002A6E59 /* iOSStudy.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 18E016E31ACAAB35002A6E59 /* iOSStudy.xcdatamodeld */; }; + 18E6A0B51ACCF7FD00B28D32 /* VersionBean.m in Sources */ = {isa = PBXBuildFile; fileRef = 18E6A0B41ACCF7FD00B28D32 /* VersionBean.m */; }; + 54A0444849F1931415392FC1 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E83ED1B8EA89BC57ACF91BA5 /* libPods.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 18B23B3C1A7A14D100E80854 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 18B23B171A7A14D000E80854 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 18B23B1E1A7A14D000E80854; + remoteInfo = iOSStudy; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 05EB633B553B549AA5102110 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; + 184F48AE1A93321700C5C22F /* SecondViewControllerViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SecondViewControllerViewModel.m; path = iOSStudy/ViewModel/SecondViewControllerViewModel.m; sourceTree = ""; }; + 184F48B01A93323F00C5C22F /* SecondViewControllerViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SecondViewControllerViewModel.h; path = iOSStudy/ViewModel/SecondViewControllerViewModel.h; sourceTree = ""; }; + 184F48B21A93340F00C5C22F /* WebBean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebBean.h; path = Bean/webBean/WebBean.h; sourceTree = ""; }; + 184F48B31A93340F00C5C22F /* WebBean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WebBean.m; path = Bean/webBean/WebBean.m; sourceTree = ""; }; + 185EEB491A98DC9900BFDB79 /* SettingTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingTableViewController.h; sourceTree = ""; }; + 185EEB4A1A98DC9900BFDB79 /* SettingTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingTableViewController.m; sourceTree = ""; }; + 185EEB4C1A98E0BA00BFDB79 /* tabbar_setting.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tabbar_setting.png; path = " Resource/images/tabbar/tabbar_setting.png"; sourceTree = ""; }; + 185EEB4D1A98E0BA00BFDB79 /* tabbar_setting@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "tabbar_setting@2x.png"; path = " Resource/images/tabbar/tabbar_setting@2x.png"; sourceTree = ""; }; + 185EEB4E1A98E0BA00BFDB79 /* tabbar_setting@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "tabbar_setting@3x.png"; path = " Resource/images/tabbar/tabbar_setting@3x.png"; sourceTree = ""; }; + 189EF8311A8399B100F19327 /* BlogBean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlogBean.h; path = Bean/blogBean/BlogBean.h; sourceTree = ""; }; + 189EF8321A8399B100F19327 /* BlogBean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BlogBean.m; path = Bean/blogBean/BlogBean.m; sourceTree = ""; }; + 189EF8341A839FC600F19327 /* JsonTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JsonTools.h; path = Tools/JsonTools.h; sourceTree = ""; }; + 189EF8351A839FC600F19327 /* JsonTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JsonTools.m; path = Tools/JsonTools.m; sourceTree = ""; }; + 189EF8381A83C3AF00F19327 /* BlogDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlogDetailViewController.h; path = ViewColl/BlogDetailViewController.h; sourceTree = ""; }; + 189EF8391A83C3AF00F19327 /* BlogDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BlogDetailViewController.m; path = ViewColl/BlogDetailViewController.m; sourceTree = ""; }; + 18A998911A7C77D0002E7219 /* NetWorkTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetWorkTools.h; path = Tools/NetWorkTools.h; sourceTree = ""; }; + 18A998921A7C77D0002E7219 /* NetWorkTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NetWorkTools.m; path = Tools/NetWorkTools.m; sourceTree = ""; }; + 18AB47931A99969600E4C030 /* VideoBean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VideoBean.h; path = Bean/videoBean/VideoBean.h; sourceTree = ""; }; + 18AB47941A99969600E4C030 /* VideoBean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VideoBean.m; path = Bean/videoBean/VideoBean.m; sourceTree = ""; }; + 18AB47961A99A51200E4C030 /* BaseTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BaseTableViewCell.h; path = Base/BaseTableViewCell.h; sourceTree = ""; }; + 18AB47971A99A51200E4C030 /* BaseTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BaseTableViewCell.m; path = Base/BaseTableViewCell.m; sourceTree = ""; }; + 18AB47991A9C59CB00E4C030 /* UIImage+Resize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+Resize.h"; path = "libs/UIImage+Resize.h"; sourceTree = ""; }; + 18AB479A1A9C59CB00E4C030 /* UIImage+Resize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Resize.m"; path = "libs/UIImage+Resize.m"; sourceTree = ""; }; + 18AB479D1A9C5E3300E4C030 /* VideoCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VideoCell.h; path = Cell/VideoCell.h; sourceTree = ""; }; + 18AB479E1A9C5E3300E4C030 /* VideoCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VideoCell.m; path = Cell/VideoCell.m; sourceTree = ""; }; + 18AB47A31A9C82FA00E4C030 /* AddBlogTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddBlogTableViewController.h; sourceTree = ""; }; + 18AB47A41A9C82FA00E4C030 /* AddBlogTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddBlogTableViewController.m; sourceTree = ""; }; + 18AB47A61A9DA40500E4C030 /* DBUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DBUtils.h; path = Tools/DBUtils.h; sourceTree = ""; }; + 18AB47A71A9DA40500E4C030 /* DBUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DBUtils.m; path = Tools/DBUtils.m; sourceTree = ""; }; + 18AB47A91AA415A400E4C030 /* FavouriteBean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FavouriteBean.h; path = Bean/FavouriteBean.h; sourceTree = ""; }; + 18AB47AA1AA415A400E4C030 /* FavouriteBean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FavouriteBean.m; path = Bean/FavouriteBean.m; sourceTree = ""; }; + 18B23B1F1A7A14D000E80854 /* iOSStudy.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iOSStudy.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 18B23B231A7A14D100E80854 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 18B23B241A7A14D100E80854 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 18B23B261A7A14D100E80854 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 18B23B271A7A14D100E80854 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 18B23B291A7A14D100E80854 /* FirstViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FirstViewController.h; sourceTree = ""; }; + 18B23B2A1A7A14D100E80854 /* FirstViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FirstViewController.m; sourceTree = ""; }; + 18B23B2C1A7A14D100E80854 /* SecondViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecondViewController.h; sourceTree = ""; }; + 18B23B2D1A7A14D100E80854 /* SecondViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SecondViewController.m; sourceTree = ""; }; + 18B23B301A7A14D100E80854 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 18B23B321A7A14D100E80854 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 18B23B351A7A14D100E80854 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 18B23B3B1A7A14D100E80854 /* iOSStudyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iOSStudyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 18B23B401A7A14D100E80854 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 18B23B411A7A14D100E80854 /* iOSStudyTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iOSStudyTests.m; sourceTree = ""; }; + 18B23B4B1A7A234800E80854 /* BaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BaseViewController.h; path = Base/BaseViewController.h; sourceTree = ""; }; + 18B23B4C1A7A234800E80854 /* BaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BaseViewController.m; path = Base/BaseViewController.m; sourceTree = ""; }; + 18C845071ACCFC690053884F /* HttpVersionTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HttpVersionTools.h; path = Tools/HttpVersionTools.h; sourceTree = ""; }; + 18C845081ACCFC690053884F /* HttpVersionTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HttpVersionTools.m; path = Tools/HttpVersionTools.m; sourceTree = ""; }; + 18C8450A1ACD41C40053884F /* BlogJsonBean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlogJsonBean.h; path = Bean/blogBean/BlogJsonBean.h; sourceTree = ""; }; + 18C8450B1ACD41C40053884F /* BlogJsonBean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BlogJsonBean.m; path = Bean/blogBean/BlogJsonBean.m; sourceTree = ""; }; + 18C8450D1ACE3E580053884F /* CoreDataUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CoreDataUtils.h; path = Tools/CoreDataUtils.h; sourceTree = ""; }; + 18C8450E1ACE3E580053884F /* CoreDataUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CoreDataUtils.m; path = Tools/CoreDataUtils.m; sourceTree = ""; }; + 18C845101ACE4A580053884F /* WelcomeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WelcomeViewController.h; sourceTree = ""; }; + 18C845111ACE4A580053884F /* WelcomeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WelcomeViewController.m; sourceTree = ""; }; + 18C845131ACE56150053884F /* MainTabBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainTabBarViewController.h; sourceTree = ""; }; + 18C845141ACE56150053884F /* MainTabBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainTabBarViewController.m; sourceTree = ""; }; + 18CECC081A91ACB6005598E4 /* FirstViewControllerViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FirstViewControllerViewModel.h; path = iOSStudy/ViewModel/FirstViewControllerViewModel.h; sourceTree = ""; }; + 18CECC091A91ACB7005598E4 /* FirstViewControllerViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FirstViewControllerViewModel.m; path = iOSStudy/ViewModel/FirstViewControllerViewModel.m; sourceTree = ""; }; + 18CECC101A921272005598E4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = ""; }; + 18D2010D1A95A6F400D5F095 /* icon_29.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_29.png; path = " Resource/images/appicon/icon_29.png"; sourceTree = ""; }; + 18D2010E1A95A6F400D5F095 /* icon_40.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_40.png; path = " Resource/images/appicon/icon_40.png"; sourceTree = ""; }; + 18D2010F1A95A6F400D5F095 /* icon_58.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_58.png; path = " Resource/images/appicon/icon_58.png"; sourceTree = ""; }; + 18D201101A95A6F400D5F095 /* icon_76.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_76.png; path = " Resource/images/appicon/icon_76.png"; sourceTree = ""; }; + 18D201111A95A6F400D5F095 /* icon_80.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_80.png; path = " Resource/images/appicon/icon_80.png"; sourceTree = ""; }; + 18D201121A95A6F400D5F095 /* icon_87.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_87.png; path = " Resource/images/appicon/icon_87.png"; sourceTree = ""; }; + 18D201131A95A6F400D5F095 /* icon_120.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_120.png; path = " Resource/images/appicon/icon_120.png"; sourceTree = ""; }; + 18D201141A95A6F400D5F095 /* icon_152.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_152.png; path = " Resource/images/appicon/icon_152.png"; sourceTree = ""; }; + 18D201151A95A6F400D5F095 /* icon_180.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon_180.png; path = " Resource/images/appicon/icon_180.png"; sourceTree = ""; }; + 18D2011F1A95A70900D5F095 /* tabbar_blog.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tabbar_blog.png; path = " Resource/images/tabbar/tabbar_blog.png"; sourceTree = ""; }; + 18D201201A95A70900D5F095 /* tabbar_blog@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "tabbar_blog@2x.png"; path = " Resource/images/tabbar/tabbar_blog@2x.png"; sourceTree = ""; }; + 18D201211A95A70900D5F095 /* tabbar_blog@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "tabbar_blog@3x.png"; path = " Resource/images/tabbar/tabbar_blog@3x.png"; sourceTree = ""; }; + 18D201251A95A9D600D5F095 /* tabbar_video.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tabbar_video.png; path = " Resource/images/tabbar/tabbar_video.png"; sourceTree = ""; }; + 18D201261A95A9D600D5F095 /* tabbar_video@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "tabbar_video@2x.png"; path = " Resource/images/tabbar/tabbar_video@2x.png"; sourceTree = ""; }; + 18D201271A95A9D600D5F095 /* tabbar_video@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "tabbar_video@3x.png"; path = " Resource/images/tabbar/tabbar_video@3x.png"; sourceTree = ""; }; + 18D201281A95A9D600D5F095 /* tabbar_web.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tabbar_web.png; path = " Resource/images/tabbar/tabbar_web.png"; sourceTree = ""; }; + 18D201291A95A9D600D5F095 /* tabbar_web@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "tabbar_web@2x.png"; path = " Resource/images/tabbar/tabbar_web@2x.png"; sourceTree = ""; }; + 18D2012A1A95A9D600D5F095 /* tabbar_web@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "tabbar_web@3x.png"; path = " Resource/images/tabbar/tabbar_web@3x.png"; sourceTree = ""; }; + 18D201321A96090A00D5F095 /* app_img_640.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = app_img_640.png; path = " Resource/images/start_img/app_img_640.png"; sourceTree = ""; }; + 18D201331A96090A00D5F095 /* app_img_1136.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = app_img_1136.png; path = " Resource/images/start_img/app_img_1136.png"; sourceTree = ""; }; + 18D201341A96090A00D5F095 /* app_img_iOS8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = app_img_iOS8.png; path = " Resource/images/start_img/app_img_iOS8.png"; sourceTree = ""; }; + 18D201381A960B6100D5F095 /* app_img_768x1024.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = app_img_768x1024.png; path = " Resource/images/start_img/app_img_768x1024.png"; sourceTree = ""; }; + 18D201391A960B6100D5F095 /* app_img_1024x768.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = app_img_1024x768.png; path = " Resource/images/start_img/app_img_1024x768.png"; sourceTree = ""; }; + 18D2013A1A960B6100D5F095 /* app_img_1536x2048.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = app_img_1536x2048.png; path = " Resource/images/start_img/app_img_1536x2048.png"; sourceTree = ""; }; + 18D2013B1A960B6100D5F095 /* app_img_2048x1536.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = app_img_2048x1536.png; path = " Resource/images/start_img/app_img_2048x1536.png"; sourceTree = ""; }; + 18D201401A96143300D5F095 /* ThirdViewControllerViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThirdViewControllerViewModel.h; path = iOSStudy/ViewModel/ThirdViewControllerViewModel.h; sourceTree = ""; }; + 18D201411A96143300D5F095 /* ThirdViewControllerViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ThirdViewControllerViewModel.m; path = iOSStudy/ViewModel/ThirdViewControllerViewModel.m; sourceTree = ""; }; + 18D4ECA41AD17F56009FE9F0 /* EntityConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EntityConstants.h; path = Constants/EntityConstants.h; sourceTree = ""; }; + 18D4ECA51AD17F56009FE9F0 /* EntityConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EntityConstants.m; path = Constants/EntityConstants.m; sourceTree = ""; }; + 18D908A51A8A205600B42A42 /* ThirdTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThirdTableViewController.h; sourceTree = ""; }; + 18D908A61A8A205600B42A42 /* ThirdTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThirdTableViewController.m; sourceTree = ""; }; + 18DF6D391A80CF76005751E8 /* Constants .h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Constants .h"; path = "iOSStudy/Constants .h"; sourceTree = ""; }; + 18DF6D3B1A80D3BC005751E8 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = ""; }; + 18DF6D3C1A80D3BC005751E8 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = ""; }; + 18DF6D3E1A80D40D005751E8 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 18E016A91ACAA898002A6E59 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 18E016E41ACAAB35002A6E59 /* iOSStudy.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = iOSStudy.xcdatamodel; sourceTree = ""; }; + 18E6A0B31ACCF7FD00B28D32 /* VersionBean.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VersionBean.h; path = Bean/versionBean/VersionBean.h; sourceTree = ""; }; + 18E6A0B41ACCF7FD00B28D32 /* VersionBean.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VersionBean.m; path = Bean/versionBean/VersionBean.m; sourceTree = ""; }; + 2E2CC00A58FD0A745C574BAD /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + E83ED1B8EA89BC57ACF91BA5 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 18B23B1C1A7A14D000E80854 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 18E016AA1ACAA898002A6E59 /* CoreData.framework in Frameworks */, + 18DF6D3F1A80D40D005751E8 /* SystemConfiguration.framework in Frameworks */, + 54A0444849F1931415392FC1 /* libPods.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 18B23B381A7A14D100E80854 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 184F48B51A93341B00C5C22F /* webBean */ = { + isa = PBXGroup; + children = ( + 184F48B21A93340F00C5C22F /* WebBean.h */, + 184F48B31A93340F00C5C22F /* WebBean.m */, + ); + name = webBean; + sourceTree = ""; + }; + 189EF82F1A83994B00F19327 /* Bean */ = { + isa = PBXGroup; + children = ( + 18E6A0B21ACCF7C600B28D32 /* VersionBean */, + 18AB47921A99965A00E4C030 /* videoBean */, + 184F48B51A93341B00C5C22F /* webBean */, + 189EF8301A83996500F19327 /* blogBean */, + 18AB47A91AA415A400E4C030 /* FavouriteBean.h */, + 18AB47AA1AA415A400E4C030 /* FavouriteBean.m */, + ); + name = Bean; + sourceTree = ""; + }; + 189EF8301A83996500F19327 /* blogBean */ = { + isa = PBXGroup; + children = ( + 189EF8311A8399B100F19327 /* BlogBean.h */, + 189EF8321A8399B100F19327 /* BlogBean.m */, + 18C8450A1ACD41C40053884F /* BlogJsonBean.h */, + 18C8450B1ACD41C40053884F /* BlogJsonBean.m */, + ); + name = blogBean; + sourceTree = ""; + }; + 189EF8371A83C37B00F19327 /* ViewColl */ = { + isa = PBXGroup; + children = ( + 189EF8381A83C3AF00F19327 /* BlogDetailViewController.h */, + 189EF8391A83C3AF00F19327 /* BlogDetailViewController.m */, + ); + name = ViewColl; + sourceTree = ""; + }; + 18A998901A7C7772002E7219 /* Tools */ = { + isa = PBXGroup; + children = ( + 18A998911A7C77D0002E7219 /* NetWorkTools.h */, + 18A998921A7C77D0002E7219 /* NetWorkTools.m */, + 189EF8341A839FC600F19327 /* JsonTools.h */, + 189EF8351A839FC600F19327 /* JsonTools.m */, + 18AB47A61A9DA40500E4C030 /* DBUtils.h */, + 18AB47A71A9DA40500E4C030 /* DBUtils.m */, + 18C845071ACCFC690053884F /* HttpVersionTools.h */, + 18C845081ACCFC690053884F /* HttpVersionTools.m */, + 18C8450D1ACE3E580053884F /* CoreDataUtils.h */, + 18C8450E1ACE3E580053884F /* CoreDataUtils.m */, + ); + name = Tools; + sourceTree = ""; + }; + 18AB47921A99965A00E4C030 /* videoBean */ = { + isa = PBXGroup; + children = ( + 18AB47931A99969600E4C030 /* VideoBean.h */, + 18AB47941A99969600E4C030 /* VideoBean.m */, + ); + name = videoBean; + sourceTree = ""; + }; + 18AB479C1A9C5D7300E4C030 /* Cell */ = { + isa = PBXGroup; + children = ( + 18AB479D1A9C5E3300E4C030 /* VideoCell.h */, + 18AB479E1A9C5E3300E4C030 /* VideoCell.m */, + ); + name = Cell; + sourceTree = ""; + }; + 18B23B161A7A14D000E80854 = { + isa = PBXGroup; + children = ( + 18AB479C1A9C5D7300E4C030 /* Cell */, + 18CECC0B1A91ACD6005598E4 /* ViewModel */, + 189EF8371A83C37B00F19327 /* ViewColl */, + 189EF82F1A83994B00F19327 /* Bean */, + 18DF6D3A1A80D3A4005751E8 /* libs */, + 18DF6D391A80CF76005751E8 /* Constants .h */, + 18D4ECA41AD17F56009FE9F0 /* EntityConstants.h */, + 18D4ECA51AD17F56009FE9F0 /* EntityConstants.m */, + 18A998901A7C7772002E7219 /* Tools */, + 18B23B4E1A7A235E00E80854 /* Base */, + 18B23B211A7A14D000E80854 /* iOSStudy */, + 18B23B3E1A7A14D100E80854 /* iOSStudyTests */, + 18B23B201A7A14D000E80854 /* Products */, + A75E66DCB4F6E8ABD81B2B38 /* Pods */, + 910A021243EF9C731476BCA9 /* Frameworks */, + ); + sourceTree = ""; + }; + 18B23B201A7A14D000E80854 /* Products */ = { + isa = PBXGroup; + children = ( + 18B23B1F1A7A14D000E80854 /* iOSStudy.app */, + 18B23B3B1A7A14D100E80854 /* iOSStudyTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 18B23B211A7A14D000E80854 /* iOSStudy */ = { + isa = PBXGroup; + children = ( + 18C845101ACE4A580053884F /* WelcomeViewController.h */, + 18C845111ACE4A580053884F /* WelcomeViewController.m */, + 18B23B261A7A14D100E80854 /* AppDelegate.h */, + 18B23B271A7A14D100E80854 /* AppDelegate.m */, + 18B23B291A7A14D100E80854 /* FirstViewController.h */, + 18B23B2A1A7A14D100E80854 /* FirstViewController.m */, + 18B23B2C1A7A14D100E80854 /* SecondViewController.h */, + 18B23B2D1A7A14D100E80854 /* SecondViewController.m */, + 18D908A51A8A205600B42A42 /* ThirdTableViewController.h */, + 18D908A61A8A205600B42A42 /* ThirdTableViewController.m */, + 185EEB491A98DC9900BFDB79 /* SettingTableViewController.h */, + 185EEB4A1A98DC9900BFDB79 /* SettingTableViewController.m */, + 18AB47A31A9C82FA00E4C030 /* AddBlogTableViewController.h */, + 18AB47A41A9C82FA00E4C030 /* AddBlogTableViewController.m */, + 18B23B2F1A7A14D100E80854 /* Main.storyboard */, + 18B23B321A7A14D100E80854 /* Images.xcassets */, + 18B23B341A7A14D100E80854 /* LaunchScreen.xib */, + 18B23B221A7A14D000E80854 /* Supporting Files */, + 18E016E31ACAAB35002A6E59 /* iOSStudy.xcdatamodeld */, + 18C845131ACE56150053884F /* MainTabBarViewController.h */, + 18C845141ACE56150053884F /* MainTabBarViewController.m */, + ); + path = iOSStudy; + sourceTree = ""; + }; + 18B23B221A7A14D000E80854 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 18D200F71A95A1FB00D5F095 /* Resource */, + 18B23B231A7A14D100E80854 /* Info.plist */, + 18B23B241A7A14D100E80854 /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 18B23B3E1A7A14D100E80854 /* iOSStudyTests */ = { + isa = PBXGroup; + children = ( + 18B23B411A7A14D100E80854 /* iOSStudyTests.m */, + 18B23B3F1A7A14D100E80854 /* Supporting Files */, + ); + path = iOSStudyTests; + sourceTree = ""; + }; + 18B23B3F1A7A14D100E80854 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 18B23B401A7A14D100E80854 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 18B23B4E1A7A235E00E80854 /* Base */ = { + isa = PBXGroup; + children = ( + 18B23B4B1A7A234800E80854 /* BaseViewController.h */, + 18B23B4C1A7A234800E80854 /* BaseViewController.m */, + 18AB47961A99A51200E4C030 /* BaseTableViewCell.h */, + 18AB47971A99A51200E4C030 /* BaseTableViewCell.m */, + ); + name = Base; + sourceTree = ""; + }; + 18CECC0B1A91ACD6005598E4 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 18D201401A96143300D5F095 /* ThirdViewControllerViewModel.h */, + 18D201411A96143300D5F095 /* ThirdViewControllerViewModel.m */, + 18CECC081A91ACB6005598E4 /* FirstViewControllerViewModel.h */, + 18CECC091A91ACB7005598E4 /* FirstViewControllerViewModel.m */, + 184F48B01A93323F00C5C22F /* SecondViewControllerViewModel.h */, + 184F48AE1A93321700C5C22F /* SecondViewControllerViewModel.m */, + ); + name = ViewModel; + sourceTree = ""; + }; + 18D200F71A95A1FB00D5F095 /* Resource */ = { + isa = PBXGroup; + children = ( + 18D200F81A95A21A00D5F095 /* images */, + ); + name = " Resource"; + sourceTree = ""; + }; + 18D200F81A95A21A00D5F095 /* images */ = { + isa = PBXGroup; + children = ( + 18D201311A9608E600D5F095 /* startImg */, + 18D2010C1A95A6D500D5F095 /* tabBar */, + 18D2010B1A95A6C800D5F095 /* appIcon */, + ); + name = images; + sourceTree = ""; + }; + 18D2010B1A95A6C800D5F095 /* appIcon */ = { + isa = PBXGroup; + children = ( + 18D2010D1A95A6F400D5F095 /* icon_29.png */, + 18D2010E1A95A6F400D5F095 /* icon_40.png */, + 18D2010F1A95A6F400D5F095 /* icon_58.png */, + 18D201101A95A6F400D5F095 /* icon_76.png */, + 18D201111A95A6F400D5F095 /* icon_80.png */, + 18D201121A95A6F400D5F095 /* icon_87.png */, + 18D201131A95A6F400D5F095 /* icon_120.png */, + 18D201141A95A6F400D5F095 /* icon_152.png */, + 18D201151A95A6F400D5F095 /* icon_180.png */, + ); + name = appIcon; + sourceTree = ""; + }; + 18D2010C1A95A6D500D5F095 /* tabBar */ = { + isa = PBXGroup; + children = ( + 185EEB4C1A98E0BA00BFDB79 /* tabbar_setting.png */, + 185EEB4D1A98E0BA00BFDB79 /* tabbar_setting@2x.png */, + 185EEB4E1A98E0BA00BFDB79 /* tabbar_setting@3x.png */, + 18D201251A95A9D600D5F095 /* tabbar_video.png */, + 18D201261A95A9D600D5F095 /* tabbar_video@2x.png */, + 18D201271A95A9D600D5F095 /* tabbar_video@3x.png */, + 18D201281A95A9D600D5F095 /* tabbar_web.png */, + 18D201291A95A9D600D5F095 /* tabbar_web@2x.png */, + 18D2012A1A95A9D600D5F095 /* tabbar_web@3x.png */, + 18D2011F1A95A70900D5F095 /* tabbar_blog.png */, + 18D201201A95A70900D5F095 /* tabbar_blog@2x.png */, + 18D201211A95A70900D5F095 /* tabbar_blog@3x.png */, + ); + name = tabBar; + sourceTree = ""; + }; + 18D201311A9608E600D5F095 /* startImg */ = { + isa = PBXGroup; + children = ( + 18D201381A960B6100D5F095 /* app_img_768x1024.png */, + 18D201391A960B6100D5F095 /* app_img_1024x768.png */, + 18D2013A1A960B6100D5F095 /* app_img_1536x2048.png */, + 18D2013B1A960B6100D5F095 /* app_img_2048x1536.png */, + 18D201321A96090A00D5F095 /* app_img_640.png */, + 18D201331A96090A00D5F095 /* app_img_1136.png */, + 18D201341A96090A00D5F095 /* app_img_iOS8.png */, + ); + name = startImg; + sourceTree = ""; + }; + 18DF6D3A1A80D3A4005751E8 /* libs */ = { + isa = PBXGroup; + children = ( + 18AB47991A9C59CB00E4C030 /* UIImage+Resize.h */, + 18AB479A1A9C59CB00E4C030 /* UIImage+Resize.m */, + 18DF6D3B1A80D3BC005751E8 /* Reachability.h */, + 18DF6D3C1A80D3BC005751E8 /* Reachability.m */, + ); + name = libs; + sourceTree = ""; + }; + 18E6A0B21ACCF7C600B28D32 /* VersionBean */ = { + isa = PBXGroup; + children = ( + 18E6A0B31ACCF7FD00B28D32 /* VersionBean.h */, + 18E6A0B41ACCF7FD00B28D32 /* VersionBean.m */, + ); + name = VersionBean; + sourceTree = ""; + }; + 910A021243EF9C731476BCA9 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 18E016A91ACAA898002A6E59 /* CoreData.framework */, + 18DF6D3E1A80D40D005751E8 /* SystemConfiguration.framework */, + E83ED1B8EA89BC57ACF91BA5 /* libPods.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + A75E66DCB4F6E8ABD81B2B38 /* Pods */ = { + isa = PBXGroup; + children = ( + 05EB633B553B549AA5102110 /* Pods.debug.xcconfig */, + 2E2CC00A58FD0A745C574BAD /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 18B23B1E1A7A14D000E80854 /* iOSStudy */ = { + isa = PBXNativeTarget; + buildConfigurationList = 18B23B451A7A14D100E80854 /* Build configuration list for PBXNativeTarget "iOSStudy" */; + buildPhases = ( + 74FAA3BA176AE89704921297 /* Check Pods Manifest.lock */, + 18B23B1B1A7A14D000E80854 /* Sources */, + 18B23B1C1A7A14D000E80854 /* Frameworks */, + 18B23B1D1A7A14D000E80854 /* Resources */, + 2ACA4578B0EBE30E889C4283 /* Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iOSStudy; + productName = iOSStudy; + productReference = 18B23B1F1A7A14D000E80854 /* iOSStudy.app */; + productType = "com.apple.product-type.application"; + }; + 18B23B3A1A7A14D100E80854 /* iOSStudyTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 18B23B481A7A14D100E80854 /* Build configuration list for PBXNativeTarget "iOSStudyTests" */; + buildPhases = ( + 18B23B371A7A14D100E80854 /* Sources */, + 18B23B381A7A14D100E80854 /* Frameworks */, + 18B23B391A7A14D100E80854 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 18B23B3D1A7A14D100E80854 /* PBXTargetDependency */, + ); + name = iOSStudyTests; + productName = iOSStudyTests; + productReference = 18B23B3B1A7A14D100E80854 /* iOSStudyTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 18B23B171A7A14D000E80854 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0610; + ORGANIZATIONNAME = chenguandong; + TargetAttributes = { + 18B23B1E1A7A14D000E80854 = { + CreatedOnToolsVersion = 6.1.1; + }; + 18B23B3A1A7A14D100E80854 = { + CreatedOnToolsVersion = 6.1.1; + TestTargetID = 18B23B1E1A7A14D000E80854; + }; + }; + }; + buildConfigurationList = 18B23B1A1A7A14D000E80854 /* Build configuration list for PBXProject "iOSStudy" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 18B23B161A7A14D000E80854; + productRefGroup = 18B23B201A7A14D000E80854 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 18B23B1E1A7A14D000E80854 /* iOSStudy */, + 18B23B3A1A7A14D100E80854 /* iOSStudyTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 18B23B1D1A7A14D000E80854 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 18D201351A96090A00D5F095 /* app_img_640.png in Resources */, + 18B23B311A7A14D100E80854 /* Main.storyboard in Resources */, + 18D201371A96090A00D5F095 /* app_img_iOS8.png in Resources */, + 185EEB501A98E0BA00BFDB79 /* tabbar_setting@2x.png in Resources */, + 18D2012D1A95A9D600D5F095 /* tabbar_video@3x.png in Resources */, + 18D201181A95A6F400D5F095 /* icon_58.png in Resources */, + 185EEB511A98E0BA00BFDB79 /* tabbar_setting@3x.png in Resources */, + 18D2011D1A95A6F400D5F095 /* icon_152.png in Resources */, + 18D201191A95A6F400D5F095 /* icon_76.png in Resources */, + 18D2011E1A95A6F400D5F095 /* icon_180.png in Resources */, + 18D2012B1A95A9D600D5F095 /* tabbar_video.png in Resources */, + 18D2013F1A960B6100D5F095 /* app_img_2048x1536.png in Resources */, + 185EEB4F1A98E0BA00BFDB79 /* tabbar_setting.png in Resources */, + 18D2013D1A960B6100D5F095 /* app_img_1024x768.png in Resources */, + 18D201161A95A6F400D5F095 /* icon_29.png in Resources */, + 18D2013C1A960B6100D5F095 /* app_img_768x1024.png in Resources */, + 18D2011B1A95A6F400D5F095 /* icon_87.png in Resources */, + 18D2012E1A95A9D600D5F095 /* tabbar_web.png in Resources */, + 18D201301A95A9D600D5F095 /* tabbar_web@3x.png in Resources */, + 18D2012C1A95A9D600D5F095 /* tabbar_video@2x.png in Resources */, + 18D2012F1A95A9D600D5F095 /* tabbar_web@2x.png in Resources */, + 18D201171A95A6F400D5F095 /* icon_40.png in Resources */, + 18D201361A96090A00D5F095 /* app_img_1136.png in Resources */, + 18D2011C1A95A6F400D5F095 /* icon_120.png in Resources */, + 18D201221A95A70900D5F095 /* tabbar_blog.png in Resources */, + 18B23B361A7A14D100E80854 /* LaunchScreen.xib in Resources */, + 18D2011A1A95A6F400D5F095 /* icon_80.png in Resources */, + 18D2013E1A960B6100D5F095 /* app_img_1536x2048.png in Resources */, + 18D201241A95A70900D5F095 /* tabbar_blog@3x.png in Resources */, + 18D201231A95A70900D5F095 /* tabbar_blog@2x.png in Resources */, + 18B23B331A7A14D100E80854 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 18B23B391A7A14D100E80854 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2ACA4578B0EBE30E889C4283 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 74FAA3BA176AE89704921297 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 18B23B1B1A7A14D000E80854 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 18AB47981A99A51200E4C030 /* BaseTableViewCell.m in Sources */, + 18E016E51ACAAB35002A6E59 /* iOSStudy.xcdatamodeld in Sources */, + 18AB479F1A9C5E3300E4C030 /* VideoCell.m in Sources */, + 18B23B2E1A7A14D100E80854 /* SecondViewController.m in Sources */, + 18B23B4D1A7A234800E80854 /* BaseViewController.m in Sources */, + 18A998931A7C77D0002E7219 /* NetWorkTools.m in Sources */, + 18AB47A81A9DA40500E4C030 /* DBUtils.m in Sources */, + 18AB47A51A9C82FA00E4C030 /* AddBlogTableViewController.m in Sources */, + 18D908A71A8A205600B42A42 /* ThirdTableViewController.m in Sources */, + 18C8450C1ACD41C40053884F /* BlogJsonBean.m in Sources */, + 18AB479B1A9C59CB00E4C030 /* UIImage+Resize.m in Sources */, + 18D201421A96143300D5F095 /* ThirdViewControllerViewModel.m in Sources */, + 18AB47951A99969600E4C030 /* VideoBean.m in Sources */, + 18CECC0A1A91ACB7005598E4 /* FirstViewControllerViewModel.m in Sources */, + 189EF8361A839FC600F19327 /* JsonTools.m in Sources */, + 18D4ECA61AD17F56009FE9F0 /* EntityConstants.m in Sources */, + 18C845091ACCFC690053884F /* HttpVersionTools.m in Sources */, + 18E6A0B51ACCF7FD00B28D32 /* VersionBean.m in Sources */, + 18DF6D3D1A80D3BC005751E8 /* Reachability.m in Sources */, + 18B23B281A7A14D100E80854 /* AppDelegate.m in Sources */, + 184F48AF1A93321700C5C22F /* SecondViewControllerViewModel.m in Sources */, + 18B23B2B1A7A14D100E80854 /* FirstViewController.m in Sources */, + 189EF83A1A83C3AF00F19327 /* BlogDetailViewController.m in Sources */, + 185EEB4B1A98DC9900BFDB79 /* SettingTableViewController.m in Sources */, + 18C845121ACE4A580053884F /* WelcomeViewController.m in Sources */, + 18B23B251A7A14D100E80854 /* main.m in Sources */, + 18AB47AB1AA415A400E4C030 /* FavouriteBean.m in Sources */, + 184F48B41A93340F00C5C22F /* WebBean.m in Sources */, + 18C845151ACE56150053884F /* MainTabBarViewController.m in Sources */, + 18C8450F1ACE3E580053884F /* CoreDataUtils.m in Sources */, + 189EF8331A8399B100F19327 /* BlogBean.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 18B23B371A7A14D100E80854 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 18B23B421A7A14D100E80854 /* iOSStudyTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 18B23B3D1A7A14D100E80854 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 18B23B1E1A7A14D000E80854 /* iOSStudy */; + targetProxy = 18B23B3C1A7A14D100E80854 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 18B23B2F1A7A14D100E80854 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 18B23B301A7A14D100E80854 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 18B23B341A7A14D100E80854 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 18B23B351A7A14D100E80854 /* Base */, + 18CECC101A921272005598E4 /* zh-Hans */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 18B23B431A7A14D100E80854 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 18B23B441A7A14D100E80854 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 18B23B461A7A14D100E80854 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 05EB633B553B549AA5102110 /* Pods.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + INFOPLIST_FILE = iOSStudy/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 18B23B471A7A14D100E80854 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2E2CC00A58FD0A745C574BAD /* Pods.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + INFOPLIST_FILE = iOSStudy/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 18B23B491A7A14D100E80854 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = iOSStudyTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iOSStudy.app/iOSStudy"; + }; + name = Debug; + }; + 18B23B4A1A7A14D100E80854 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = iOSStudyTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iOSStudy.app/iOSStudy"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 18B23B1A1A7A14D000E80854 /* Build configuration list for PBXProject "iOSStudy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 18B23B431A7A14D100E80854 /* Debug */, + 18B23B441A7A14D100E80854 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 18B23B451A7A14D100E80854 /* Build configuration list for PBXNativeTarget "iOSStudy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 18B23B461A7A14D100E80854 /* Debug */, + 18B23B471A7A14D100E80854 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 18B23B481A7A14D100E80854 /* Build configuration list for PBXNativeTarget "iOSStudyTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 18B23B491A7A14D100E80854 /* Debug */, + 18B23B4A1A7A14D100E80854 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + 18E016E31ACAAB35002A6E59 /* iOSStudy.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 18E016E41ACAAB35002A6E59 /* iOSStudy.xcdatamodel */, + ); + currentVersion = 18E016E41ACAAB35002A6E59 /* iOSStudy.xcdatamodel */; + path = iOSStudy.xcdatamodeld; + sourceTree = ""; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = 18B23B171A7A14D000E80854 /* Project object */; +} diff --git a/iOSStudy/iOSStudy/iOSStudy.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iOSStudy/iOSStudy/iOSStudy.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..b180e9c --- /dev/null +++ b/iOSStudy/iOSStudy/iOSStudy.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/iOSStudy/iOSStudy/iOSStudy.xcworkspace/contents.xcworkspacedata b/iOSStudy/iOSStudy/iOSStudy.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..b388a74 --- /dev/null +++ b/iOSStudy/iOSStudy/iOSStudy.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_120.png b/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_120.png new file mode 100644 index 0000000000000000000000000000000000000000..aa81067a8577f84f8fc92bd38a322c27c1016784 GIT binary patch literal 16782 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 literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_152.png b/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_152.png new file mode 100644 index 0000000000000000000000000000000000000000..cc11df5974d772fa5f7f8a42e53427e8ac26a028 GIT binary patch literal 13716 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 literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_180.png b/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_180.png new file mode 100644 index 0000000000000000000000000000000000000000..90fbb4ca352bda78e08ea3522c04b6b43d90d05f GIT binary patch literal 16237 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

!CY~s#Ih`te##bahC3s_T9Jg`3OAN* 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 G=>Gy8P@4h( literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_29.png b/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_29.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8269a4831f924edeadbde0a52258063eab2da8 GIT binary patch literal 2670 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 GV*dpO4zO7O literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_40.png b/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_40.png new file mode 100644 index 0000000000000000000000000000000000000000..8992f311974b7374bd39c44c7fba7a7c209a9de6 GIT binary patch literal 3764 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 KL8-peo&N&HWVZPL literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_58.png b/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_58.png new file mode 100644 index 0000000000000000000000000000000000000000..da710e03d9c6ecbed7eac30ba2ed6946ceba9c65 GIT binary patch literal 5964 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 literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_87.png b/iOSStudy/iOSStudy/iOSStudy/ Resource/images/appicon/icon_87.png new file mode 100644 index 0000000000000000000000000000000000000000..72333c25a90642bf04fed64a388e545c0a94c40a GIT binary patch literal 10300 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 DicV?7 literal 0 HcmV?d00001 diff --git a/iOSStudy/iOSStudy/iOSStudy/ Resource/images/start_img/app_img_1024x768.png b/iOSStudy/iOSStudy/iOSStudy/ Resource/images/start_img/app_img_1024x768.png new file mode 100644 index 0000000000000000000000000000000000000000..94f7fb0f1f261002dc3e3467da3dd58e21f607b0 GIT binary patch literal 652016 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 z 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

W-p<8C+$lZx~cg-t>23` zFxFVVcLi6>q+Hg&uGY*K@YN5L#FlI#;sb~DsD z0bG+twN{-*RZeGu1onRMMMy3_YioE80D;K|=~|%UpmC-)=~9d2RpTvf0Ae*#XbSU)G2S6Z6@MxcrX`4D}IZ)@h$;#-OanM`5YL z#D(7mJ#kR>3JBY5&9ZsRNuI|%R5V{en~l0iNfU&K=i{b}S-Xy2rX@U{EKrl1GVi+h zUk+~eohJPigxZ3rF$Qwm5V!uLg8oOw4(fdLkQWg4l1BDT?i|&L8y^E~q=~opiSC^U z@QCR8TH>)f@Q7_NA2}4;!mATTijUJ!T*b!0oi{=0XR35=)QQP?#Cm0se4?(c$zYUD zKs*MHV=>E3xwx{Yj@g-ykuw#Y2lJ7O*6D^nJwsbY27CBUoAO5t8e_wKTT&%fQi+|E z^cBl6*z@kALeVA=o-__gB>I!vV6!Pr!Z079TpL3?S+%j3k<1k@hP`5_1EVo@HIH8` zo2%Xn^u=mj!qO&xeL+)-Ax{0K@QVsdb64dXSI^5s*Y1{|`|%IUM{)80^4n+RpW>1K zU;6x6`MaNdK<>HYki2~CEqUP^r)3#GTzuWNOLG5_8|6m4gJA&|F~`rZ%V)m&mVD*e zSLA`c^RfrO%y4;mS-y@_fopO7j|Us^Prbvouu3$8BvA}I>X12O=zScjHA|g>TCcS- zZ7nXQ9fpSuBB<4dO$DfltB)C;VA=(jjrcY$O&FC%$boZK*FQYAiLX-l#g6Mu!Z7bF zUT(vEiJgrP<<6K!rI2rH$H$hbTA%jC2+e5B^O&xJt6Ccm$IyDWW2dH0Bqv}0T(`u) zC1vk%D-z4;IN=6=v6;Fa%agd84YZUacfQ6Jv`H9E_4Laqa+Y~2IhXj}Yhu6oST-N6 zritG;46loOVPEW#+5nqpZZOy38Q>a_bS#Fp{;^*BihUjlgnSc*S6iR*d^{x%91WyfncPcR&-K&Z#|sA@&o`o< zt~wDTDaJN9XZe)`;!WejDLsBVV9TEEL=37qAHT-+7%GGf9L@Ts3B&8ScYhr(cT`ZC zMEX$69X~zRVCw#^*NZMP@e6@U$5tKgh zuh_$F#nCg@2796u48yE#!I>BqniQw3GQl=r!_wMUur#SP9+2y&b8>mTjUCv18s^v@PXI!6OhWL%zwrDpN+dc;Z5+{5YMI zr}As@vx=b&a$LYp@v!H3#!U;GKh9Ed8*CF}i$<(xp2l1YG6=Mzjy4;7j@hKA)+UFK zh(CJ(s|);w+nIOL2tJ2)*nWbxd4(Rp?Nr9h)&w2X+AEd0tTt(!001ZfKLKW3V(`B* z#KyRC{AJAv7}V1+t3hgO6Ax6oFs;d8T`)7aS}Q-RuW@yZ>;p1Nn4dNgt_sOm8+2@| z$QV1f;IV^cU<4b>J6D!W2VVk%u39*NHH5A81A(od)b*g{huFx8&FY+|3vh-gM3~-O z*I%GOKKV{^DCit2>xQ>B6Wmdyn!h<+rIUx-sm62-W&xBAcZL*ydR)DLm zYE^ZTVb~R}5eo|DWA0xAE4T&`V^*{GHq z!LWfYfJet_J4R@o)HMEhvL_E;b8aoz002M$Nkl)P-ay268SHYF za}EwFQM#?e1+Yb<(tfs!7!X3A@#lpS&LQ=nLkx|HV%2>zplZx&T-8_b;Hg<7FUN3F zHG37CEcQQn(a+?g_AQB4xi}{GqZsO}`bXCdkNz_%aNf`$cU$XU*49&nv#wQm-;Sy! zejP9zv(8iJDLC=Jox2e;fhVKbe#uvOrs(thk5RHjA#jo6`CqEDCbUp6t*&fo&;OZG z>ssX)Sl3`~KG4ek@u^!qg%I8R%1 zhT9ho<{wY;$yXmy-eUaR&pZ#5Y#QgW;jwu`vGs(CHn-Rx=6k!bw_n%rXq7$%CU5RE zfKI}Q@z=!{0)^p4ta3HZ?D#sC^QiKp7RQSH@d*VTKcv@S&>*V9RZ58g2oh6mCk3%$ zUoF_UhRpF2=c?9(5`)D!QEea>v-NgRN_;ft%%h6EVGgUdE8CtN>TNSPkWrg{a<3vB zcc%4Nk2=m3)+9Xxv#rK93Or9N=(C=f+AcDhcNyg=wc@yf?-Tz#e=+{Hnv4^-iG{Y| zOxw|2L#n5xRH%tVUp} z0**y}0qFMmo4X`us!et&+5E6IKhIg>r9SF{F{0zP*k{ZUrTzkY!iekj@bhQyQ`_5m zm^luNBR_o0V;C5WX~yjDCM?prMJ$wj-N(W;3@!D8@&dNse7ACcNczS<^5P$_Njv#V zXLz*_4yKQ{9&V3cxG$hSYTW+9WemCCR%*aK(bSIkl#b zGSD^k(iGt*FZlGvQbVgQ0t({6PEQi%^;FCNi9mM0HJbL3pL1aVQ)e)8i6gCvt*FS4 z#x!DiTP_0=wV|)9bCO=KvQbEi;e+nRYz#8#ReF1pZKa;h=2k*(V*6&~SfLNdohNAp zEaO*gSaSQCN~4^EpOYY_Ci^B?)rR4+bC5ROHhBeyg%qc>Lr3$jAvuCAHc1}MD!z@j zqmvKgPfz-}a5Z8$;HZ65Oo^EWA>zkN6;Dm}tQ(cn$i^}EoSXO#aMH_jM`1^8y*1mH zdfxA&e}KbIvq`n+RBh{}COxhR##P4(3zZaYV!ooJ>koSoNac_H%Mu9l^J$FpIyh?^ zWKqQU<7O%}n{~&@)hKMdE%H)txgYU37$EC5l$N}X5lA$6c-OkRt}4K7MJ)DIwFH^E z%YIE>`oK|zXcO~puX`Zi;?JHzHblL=BcM&dk6gRbRato1bBv^nMyA-`8p~~zUnyAhi-B>Ms=;K zS z$w2#9e}~c~5vfiqV!2)olVe8F-8S09yxVi%CNDb5PR~;zLmMScvW@kXeD2>a?OS`% zo_(OKv`_Trdm$Ba(I)1DO3i;AHtJ&Zllo2eO|mLBp8(*+C;rs|lVY1Z;xG?AB3NhW zj^}?mPdKI{=OGSQiadTZ9)ro~2cMcOB)eZYRu7&${A zBkMdT;c?P7`U0U&=!|bjoJw6&D|Q0_`If0s6sj1daT|ZogYP+yVjq6~;9`!Jj<Tr1oBIiywdOqmrtCsH!wjQSDPul+@Np6McZ7%OS@< zCi`wYbHjLY{bR~u*eW?it8z3ETjH#i1No%LweoM3w_#S9Is=Izsk4DgCC!Yp(cM`j>l3O@y`4# z&Q8`j=8@-e&n~aY zkKTWy{P=g@gO>nq$Z!A2bMp6p{WQouE?$vGAA1?!RTMe2ZDcAFJyh^(~GzPkOI^HCj54D+6X6qw#eP?On|B))IZ( z8p5dc_5tSkyG`-4p7rC&DD%D&>sy->K9>jg$@X_d%^mj35Oz(+2+kQ^d=9`2eOX){ z!mH+9^3HpA5F*zokg}bRW1A!9YyS|^F54!`{nk+M!9Si6&CkurGT!{p4=!+;q9-=| zKuTBWk@Yn-HesjSV9T#JjPL??djfzxHLwA;ufW9MsThb~#b=0%^K*(hqd)6}Q!LyN zU>p1#iwa^@bGi%dxc+2e- zJgSa%aF=RzZCQ??={+;}i97uK;04@mzitkg8>@{KY$8VB-duHU!`SbGZ z(G$RUMIO0zuN=PS8hQ8J8TqrfF3Mf_e&bcW@xz-qd}p_<=z)dvnb?h~+CTg>eu2jY=&$3QG5Tm2?1|$DJm{rU*MvxXJUO;HElX3Y z^7Z9QvU(mj3-I0VLreHH8J||1#9i|jUOq0LdH$5#dd&{JM};?_(a_Z?dFK2I?i5VP zZMZPK1s9+ExxsaOe|eh>Z|h98z*J=(xU8I+9kjC!U_4GK6#Jq z-8(Ixe-4lTpIMg0>vqdBIrC-@{&x`TdeyrAb%hOnl6EL|MQGI15Nst5+eIX>D}hUHqKz%b zFW_%`7V#UonCRZfc6Mj?R=23Rg>L`dOx}>|hwk8XB8eoRs0l>!{e4t@% z;vwJLsw@i`pY5d31OjfOXBDc8FCawk8H|LXMAcRmMi!rl_qp!qoue|iQBt{&WAiHmWja$r+5Yzj}!aDjSy>V|#u+Vs!<&XaQgUVb87+(LUKfdpa7nT$FWMb)xRu!;6T z!*LNY;9A^D{GwvSa(R<1)mf-Q%&6PMHDb^)(7=tA8T`9~uR`otnwG!zi92Nf!u;mH zdh{82?Ac3GKlC&2l~<3wBY*z*bDNv%({f^MG8ud{y2)eL+6=_*dnv zb8DLmI~VY_|GiT`@}1wZxntKZdHIdE5dSH8@a}`S#jqitef|`>e~w+xpOiuK7G5&Z z&kEet#`s0lkwmZ+ypjE)LjR>zDs%(LFx z8NdFSkD&>N%J#7>$4oL``>?kZ>tjBHBGV?1I?TIX_xKkZ<<}5D$ECl~FUsr5+mCuK zi=3jJ*V88EqmGS#UH>4q$Z<G(B&UdO%H6WjB#|DsM^9&wP@OE|h2_1ZAqHr9K-?x)KmuG`0b zU5^puIT?=iXZ zf+0Lh@krx`6%o+P8n*>Y!=h$I)@V}kZB&;HbBrhfD;PcGm1g2<*rWE)Qq$(PDP?^E zLD%|EM6t#V{lG(6J-Lp_tu2zZm);=5UztIr_EX(h%aLEqo3h$X#BktI`&R$0b9pY! zeYxLUNcNE(<=~0IMRUG5nZqsD1 z+B$W8;KjbQ3hFS3P4-PP(`T5-%+|Ozd+N4fu&$C6k*@MdX^!g2wh`O&X-EJ_Sz%pP zj*4eptl5!`+s6vX2oh7mwJwP^F&_;$hir}#ECUiCW2+P;(^G3?r)SrvE?hY)?>}^n z{73)J`{fXBD$nkom%q7V9WSDrmG|Cx?bPADxIu7oT^|3%Pfwk{a$f%0k?ZA0zUv-* zQoTd2+r3*JxaaiLoribGYiBp)6AvGjM?d!z9=Th^4GG);u&417*}$LNbdFI*PW)?1 z!KSsJO^2>JN*Q+%Gh(^CN#=Eo8S8-xzWSeyl%OWXh(QIsRFRJ#&g_(z@W}o@{=o<2 z{dZi4Pw~%A{i9DkBZqF9lcOh($*#Hm^8WW8nL4;@Ugj_$Pn|t4UwGq$ymI2K>{;3= z58Qa8yzib}QwvKAa{1C_c>_NM_~xnC<=;N>b$MvdHFDQ&?~&7I&&d~`dUNW);)1NX z^NAIA6e(quMV>04MyYmDWsiFHm8Le`Hn~}8U!bowmJDKMq=X$jwNc+i?6m%=SFq*y zF>b(6th#Zn9I;r%rqkR}UQH;`CgvkFFcgZA3>VKetiFsxYb#n=z73O5X2Y{7&1>MA z{A|aF?U5SCX4T6{wz1yxp%3_{nPi=D6 z8;+f2*j5{H(^gDZs9=K`<8OVSYrc)aHisP~?IRXVY)-I$+f%fO`HF?|V%#d@uFQ|5 z++^P*i`cApejMlI&A*r?VYn{Fi48*VBqobyYq+i#_YphhO~=?!&N&k8n)0Leu$y3o z`V8Er+a`yH^jGbb9}4PqAlGhdN~NCX*?G({ez|{(P5^Gm*7fK*W##&Bv>&2P%tv_6 zD;ve;FYAcSzmzNnLEsf_m~ICUxT?G~dOjB2p8HV@>ianvE%bwOpzvjuJpWcGTIw|+ z-VUhzh*eJ!JLbtL>FWB&JZ_|*PuQM40pJ?krwSFh4;df!a&4Bz2 zZUXS<|EBb3-e{9<1TY)zQ7$P})D@JM6Disi9u!w_;iTdiuky055yhlu@`~>i)%{gj z>KfFsjRs~db}+7RO!ySn<%iPLgv`F8m~ zKlifi-!YFD0rJJP_?iF%GB(ix>yNQ&9V;1waDeY<)uIM4AA34ppk}da(N|wLWo~Ls zPF%%16!y={4}9!yjFTz(-N&BAh5eHJv!DJ}xqi=*emZgD;wAZur{0kBXI5m-j%och zfFJtA`(<+;W9#CEy!yr|`Nmr(@Pfb%x$C9_avk0i@aJc)%0GVOS~+;lynN;>Z^{?m zIxF`axCZY6UeR*`7+fS7j~ z_SP5N2i3rrW)%WWWK@ZIsD!Pbzpxoi&L<0!+_8L5u|Xs=J6|Ekn0!7f=}JW^xO&88 z75Guab5`}%ab3^%te%ul^@MU5npuLB71W7I+YJJ(_Y-TbH&(~TY)6c}GV%&gnvHe2 zZTgG?KGIT3juUO8oy*%~sCPFUO3&b280|dIJ(KHL$+o&46amMM{?0kUqrKa@te9xd zt9`F(!0@IsRuWo!_(zip2Fs39&$C=h#L$c4Bqx4ly=ubJMq!ZnrJZuC!D}&hk^4$%CZF<@ z)!H&1Sf6bHEPhhg8+9Aqb8RAy#mNR6#uw^l=h8a>lnj3zExo82_oN&u$C3C`b zkF{>DbWE*9VJrN+1;?cS8Ut*~{YTg8w^v?_o&NQ+t!u}jMy}d3#H}k%C`Wz$i9%p7 zahv-j$+Tj^hN{)R^)WNSa6+~FtDFY-S>PFemaHGj-h4K;MY~fjt*RcT9Jfx!%}RA1 z&be88oRnk2qDKt=RFd;7nQ``|PQ!+x_Afwe9D5v#-bfCHe5#P`@%xmIFIqUUt zF&Cmtour~a?}YFF%iM0c`=(uT%YkY6$sc@3u0OCx{>8s~LVoENzAXRb=RYc+dGby9 zFMjtaxozi^9ABH0zkK$XeD{4za`=v0JAC@WCHY(5cDvkm z_<(%rnd9=`{hJr$AO7$|vVx2L$DV&hPMp6gH|<)GyWVq1u6zG}*@y4U^!fVv@KeA9FJeCK)%@A@3aAuRP`;h^nd>U8q!!y5Yve zBetTcO)WMRe`+}12KS0VW#dfTgp`DplF8yWVHqFT@}v_8&F86(d+=e)L5|fJ9M7{d>V_j;V+P?m| ziE^y-q9RjPvSM{hqmWWNIfkJsXC2Q4UeCn{exxsd@H+_9Dyrp>*O)49zCR%*``t zPdz5Jhl#rjTZdSf+|6^3{}OY&;iS z4I*DpioIg7WyRE%(-Q#2j0_Av?PFD2ULUsx2`&;E3vBp%&H7RU$nb?sJaxcNpRG|R z(uPMlS@fXL3dNu*EAH_(2~)kd5RAn%A50~y=S-_>axCg`QXmjC30Je;dVIK-~>6TzvKyThcyFR0O?wV7oXL~$j}&)u5#N7K=9dM zwgb!uh=EsQR;>%okIw=`AEv8d(pj(r7xnV)noRG%3uHRt@tE* zr~J!LKOz6}iF0xuKSQ@6$K+c4BEX}^*5y`w=Ut|*fX)K`Cd5L0CC^NMyuV#)*(4pz ziG>L~vTij)dN!u*Cx18?V;rm6rL@d2>+p58o{J-EqCV@#abS%`d$wH|*PicP-!p0sJ}xxw)sl*AN$KV{@GUF=;3P zpwe8GGf}k~bFL*JR<;%zBfnWTK8~Ypa2?=ZNmdx|-zZMDXRH9|U(q5s5y$h&)|HG} zD!<~lx2%1FIxV}fV%=Owr*_KGH4LK%h#R)-tDL&vnvTs017)AE52Cf^qoAezBDTJW zvCrl?Q?xth(%`7z`hXdN3tPkDNI@coW^J8SS!L7ENEYRc0TG+FQCz_qSFrd|BQaCu zt>77e_X|+N{O}N}&csb|h_P$zixH=bO*=fXY{jB>#4R>maEi7Dp8>3yX|X1YR?YbY zq;aFM^^C8JneQarRL^;42;N%TnDct>$Ag#k&tBGRb9uZ?6DIAHodH;$A|yrYH(<;# zZFQ~D{3L&^UfaXXNqag+pZLeqc04ELJ@c#%EuXpZfM&@O|||^2!_M<)I^o<@BYC^8MfQusnFzN%>p9 z`eiw^dk()!vnKc8H}2QaE`EJiKmBhU(K_qNF8m*fXNj<0Ae%;NF?*W}ol^YXyKB{{dUiLZ0mIupkdX=$06iOD?i z3v{Y$MB!_9jMPZ#V;{?LaBDRT26 zQ&VXv8W&a?NAH^!^-f~LBwp-~$gvBI*&Bp=>=?f9f>YPgh;yu^K>5C|*SB2n&*8YG z52{^lW2ImJvR~l|{;YqIr|*58Ytjb@vGuD7mDQ<9d9sXapY}OGHFkX+WfLi2bUCKM zeL=kRH8&qO#I5&rY^!TNkMCg6kEhRF#tR_qWA9n;_89cTOk`5*ZJcnf1d;=@dHf}A zy?L=O=v2iw^aVxuQ;I{00@I#sG^Ft`h%#S?j|T0hk1+=}aea&z<_m9*<8NyHDh`tC z+8_G#B>BO>!HW&hqKIeO|<`P8SM z#Lvxb$bNh${rK5sxr`sYTgB68I84b#{-KBQJ(arH0)>Dkio*g|v&!Sf1LLY`&oQP$hn+$CxZpmX|B<=ZjcI&Lm9I5pR61AL6agn@wnj_a^tC|y$0XSH z1V-R}{#Pv7-$d)%F;Sm@n8Up>)R(qR@wQE)tK822xIXi|3jVTNBLA*Hw6@N*)xdyy zShuJW2Y-V-M*I^k9TmjUGTgOq2~~Q$g+!A$aUwSY@~=nSsLI&e@Zfbcu8*yN#<2cT zf#u#QMGCe?$;Wn*1CMV%GSUR^$Gee^`8}mS{Wm=|BP%$;SX{(mpN}-G;gcRRVfzyT zM1SeH`aVIoi3n|d5PI;MWKFh{WEppoV&8i07v1!=tm$ijRp#NYDRd|njEXYj3W4_H zfPQf-#?a%a1KcaNxYscQjO~abXC0@u@&sQ_QeJfSD=T&`h4bz+Ddz~y_U6V(j zeoa1tcP329vMlW0BR_D@{jzh%EMmJZuYcohdGq*-vW^$~?!R`QeB=Z7%Yh~I4(8CC zr!L5oFTO07F09HQJn^=C{q(Xt_75MCJ@Yg2htIw#pMU+lyzja_a%lzMZR9!w4mDZ> zJdRxhG#^JE%K?Z!_6Skn`Y=tN!I(KF;uL>N&T6}F^=pqcapmUcqoh`ezgXV6~fo;uHV&2BY5*Scx<&|-Jwk<-I&M74}FAAhE@ zl_(NH32I+hZlvK}0>+Vvhhe(_>t)`kJXL$CEQe9Q6g*4gI`afyh3gNRDFpN^8=L`H z3gIw_Or`{>;PISr;5w5)h{~0a&6E~~QKgk0+X8lfBx95uOThy_5ZuaoYLpZNe&(Py z&})ta*LJ>qcYa|3A5ff=m6fY_`X8Uo&+<8W+>qf1>oBz^Wg1{xL@87`_P+k9zpx>j z*-=WPk{0|dPGMyfEdXd?mY@1_GNN*ozx%_MX6-;>Elg;Kqt87cS>&soM0+N--juw) zsSYx29vj`aVKm#Sw$ih~lSWXpau4YQ#yyaVKRStFsn{M*3MZyE9bW_|0<XU0(9kj5m zA-0udStZsvEcaQV-bQu+O028b)7TSqvwDMGsy1!bbFR@Kq|Ae|28_B?4{pFnsyPG! zlG!zUl7HvooLt0({;z%E6*N6BNAO7b3VxgZ&CAQOcM)G5*qD(=Uwj)Et&4K^jyaiG zT#^~yOrPF|=g(GfadH7)F~H3Lro_|OH}N$8Oxd@U03>0OwGpqx$J?>vpaOtL9(Us~ zj3}IO4Chq#s^al4V#_6We9ge27%xFwlb?S07P;-lgYwF&Z_2Meaa?}$Z+xdb_~1?Q z;_Gk8(@(!4$Bv$s#hr_C^X=Emhdy+#+;-Eoa`K&b<)t@H%9p-&8t)2NmK$+%JyK}!hzBS1>DQh%}6vKJESke&8o0?T0>0`yI@QHF}nP%2fHNVYMy z`E;e3WAk zzZvivC$0ev;;}sHl^K#_Mn7b!YYZz#Uwe4j+*qEt$zPO*u7B!g`Y=ghDQHY>avN*( zi678R;pxO_d_9jHVdI8tcDrq3Q$d(rjWXs@p}DrXGWr5yQ+NmdFVMXh|A9WkP6Rjws$NP`@! zwb5=so?uK{0u9EoNvtWQQKinHru*rscJ(N^0X~HH_*@F;r~s1;~x*bbD&$|9yV6ghDzg} zqqvfiQI(uL z|FT?pIUI!P1v61%Xb4}#21w2mJlw!{Fw*GYuo+EKj8%K%q?s@)1>D=6$EZ`{syAc6QU10cr zq*;A`Qg<}d)HN^AGS7;DxylWIA+Fa+DFz>t_SFk47I6b$`6_;A89xt5r+DY8yr!*= zfHG`+P_x$hjdT-3>`ay=rH%&FqpB(eJFT-#34^JdG~oxmQF*e=t4jrG#Im=*DP;WK z2rzIEgg^%-wxFqZ_exa)9uZXJtgU$1rk<=i?cm$U>CBe=^;V7T2xqVExYvaMx{O)z zz2rK=w5a8o(Nf<-%$VgdPCH=th@;1edr!=}TxGG+mD={IYt~AuMb9JI2JQ9Sx9KSK zm`cZ>UPUbtV|~dEah;xwVZQLCetbHt*m`t)pL}rM*iYjo0FN7&@wbUb$*1O*Wp)GKV8fAQ z15ca1c40+6cF%%*|0nL2fAR;Xs&G&g!(Ks3@iS!jpoAYSq*6;*i<0WE`3o|9t#^85jS8pZ2@&@E%#c zvLc^<;i&xhhYrh!-gm3)-LpgX?%E}1E}WCEz48`5$-f|L_-_C0hjz=iK8Wx8?>!(> z=!0W#zb#*T>4cm)e_6ix@=^Kpm(R=Z{N3-8JFnj-fA#De@^>D6S?!WgC?I_I|5d&x<)w|}7pCzbp&Za%w$-heD2^SIe+{8Iad zmyT^)#bn&<6TSi7RZZ+%l*a>f$5we&pi}1#>|^$49&g^)0e>K@4!PX70dL#0+Yrmb zv%j~rpnZv>o>6VlP2(}T?FmZ&d@!v^i55>OBWG=68)9gUblLLeHO_7H!MIs`4S=u6 zweuuS4)Zy2>&vU^ULxa&R?Ig5bkL)LQVnYYbZAr$cQnMGw#i9^lMLqh{e@M$EQnA3 zse*1xD@B^xgFu^QMVf#NkWEU{VSP?XCzm~wc~{%AYHPu9385!s6<`Mnd-?|*A1KBt z;McjZY7(ZyCm4tDHoUrZ-_}O1|u&h6fv&PS3;6d$zqdGQrtLn)aVnx4VzG~1?vKZ=9CoLMC#Aui9 zkxuT96a!MyG>#i>Rf#v`=n|FLAGH%XRWeNjZP!Mf$C1=_3GcnZGF1+wDz>CSss<9c|idt!?XA z^D*Tkb|3;Bv`zx`1`DLl51S*ZSj|wP1jv7C*HXzfAsQ6`Fr2>u-vqB zkG%NC8}jI>cVr1a*>lr1`{i5iyH)n=S&%u{oPKv%{^ILT%jJu!a^uo2x&6iiasyr@ z@Oyvtn*7`kJs{urk;8Hv?*jPefB1Egb5~_y|AJg#-=LqT(Qm7Kl*5U(2d5fY1foss#c$k^@edY{}i|nMA0QF?E}YSmA6pT`sOr-ZnOno9fCo#_>m{1 zXkbe$$;kn&$E{mRgB^2mrgb#wpyuP(=Z2L#7`lr3$M2Y99P5X+b{<3=!%RVR{SN#3 zDAV|FL*EjIKRv7oeZqVybzoIfNjNwfa>ytS&wI72!}(v$s-;-Q92GkEfgbDO0nUAR z%;6LA8@Ncmik~XxPXU^97JuyvWVMvI5AmJ$Otkg@Fk?J3z!>Ji69~!V0WxGJlMIsp86F_Sgn_^lAj}MQfY@dkz!=*Yx7BX< zu5L-)YDukq->!7`E$@3yovN?uuloP0|H{UbP}2SDTh4jE_ndF3s;{cPiaQsCV@eET zi}KlZj0<_OAj|e&H^k%dKFaV4VOdrlGMJ}0uAQ#L7$X}{aacqXGI=p}n65TwB|`y* z%{scoIT}`!l@*WUrdLD6^HHpQ7R3_G522kQFB%laBM|T>m)M6$c5cem%PQLEK)R@Q zX4bJ@1-R{=+r&PqU-Ht0`T!AfEsIE7-Cp{{FldO?JNK!D)auyiWwNHcJ|&eUXOz@%LDLA3tSf~H2(#bYpo)S*PN5u0 zH{48yb;6LT7-y=6e2byH9N$Af>cpC&;izA0g3E=7d1=Z(h4hhX4B**Ch(ZLgO-I96 zrrg-xsDCJ5$Tze%@Tq!<7hJmG0OMFu3U|490Y)Gi2fcq7KF0_}it{xPr15Cd8XaJ# zu`p~OK6zsYJs`ABBixO)!q5NV0v+SvTr2trVmd~|TyOyy6=Mf(eo7Fplg~{`D~}6! z%b#D-nZU(n8$LmcLn#*2!TdH4uK4sICHNFU&^w40ZA#W7xqG!0IrLYq&+64}jF^<8 zK4hB?#y=BFWMVZBXjYwkaNyWv3zfo;;Oe~58^Ie-OQ1}w<0n(o^RjpKpez~emZuJ0 zkn7{~^4zHla(QAxwk+?Kx9`~{OP8Wv@G8YItoXnG;0?KcV@@_AZO7^XS-E_*EM2@v zE?m4SfBKit*!6zPhkV7At$H}H{ zaoxIs)%I2wIpbbw822Ui5f>lZ={IdF%u+m;Z49nHho9~Ei~6A5x_NCh#>h%2pH$mp zJIqSei^qlpW4+1i@TXuX1^@HgcO7i#vd#JV9wm)iC4xx-Q090_9$p`YSsl;EDr+m& zcNtF76*(!pL`eM=$SEr`I7qD)O!I@T9^k8CWTn0Ru`plp8pZsDx;yzdcz5dXsyth!5TRTB5EkNM7?ph9Jwk|2(-VyA5h zOEW|DAOOO8B13M41d21f9Jdojs-2AUk0+vaN=4@{U61oZNVQk2-8%9 zcD0BHd9vNungzza3O^sX$cb2O+D9#HX|%igMqJhc>qG0OIz*u1HDg??9VQ$D!3IHV zvvj=G2N|+{E#5%6AUo|HV)1XG8!_1TX7R_qk~}hB!JDAw>_~|=8@H%Ef@F23(fEz} zW&hIg&%g^z4*05Hc!0A_>k;iu+X}~F9)wXPt?{Hq7Baw!ve-Y(3iu0H)FrNtTiRo7 zEYQB2g=-iOY>jMme>PODCjcza8`ciGtbKA!5&P(SesJ@TKC3< zzh-w5uNI2x1xh?OU|pvti^`x`TQXlI@;d%S^+J|@?vY582*EhEH$NVg&}b||8_`AR zH?jz|^RIi)G8?s716{4L4g6(MqY}M&o6Z zG3p^=EOd)2GV(rlw*ywsWjG1%=YQ-lO>DH;`5%`-DU2yCk(Zr2Ykf9-ARHJ2MT6Jl{h^X8}ytmOt;}{fZh?Z z@2VL5xo@9{uc2Jp}8YIbc7Ps1n9l16XZybhV zqKh_%cA{;jSv-~)0lJMd;8!!LK!=psh=ncMsoxyS@zW9(EBtjlHV!x}JSl9-e{n%p z!^D`zqq&BKh?Wxz)en#o{SPU(jr)1rq2;C}AZ`P0WQgWue<+#Wh@NuT?*ITm07*na zR6|=i$nw#q<{C?YNnTNOdK!adw0ZmVc%!}9XWS@DeYO|YI9hj8Jc&sh?z!891pOP-(2e~9&^K<7-+j3 zk7uwxOe@-AaLlWV=$S2ZY-8ZTMdpCVRzkdSw2^r%s>5>UaJ&gGhF!Pxo;+Eh+RQO2 zqqdjU&Jm2-8gh7nIS1RTw&NO5;IKA04v?SUIdxp-aq30=gS8P*vaDLsCsR1#JA3+u zbWV-SYe!DY#mhHvn4ZL|0YmcG{kvpn5Hk4o=7sZ@8%$}9M_}ZJ& z-rFI+|D$h{`|emTubvr|pZmk7QGH@=7-vG z|Fr?IG7K>y&!LJD(!Xf@L#FjZn?x!LPE4PeAV2HBWwrC<$jj1c=2SHPdEMq|6s5V1 z)FoEzKNi3=Dl((OW!|SwIvg08um8pKQi$4OpfY9?#VUE zYX+M*dj1!+mu4_RYn4~TX`$zT#8p156P%yw`5(fplxBF68}*!Hne#u+#d1jFtEe-$ zLC$md&dzq70N^A5XsNY2UZMT*oW>_Um{WR-?6UJ8v(LsqyQvgE0YLJU<)&p@u)?o5 z7pMTpXO#K0K?lA$G=-TUBC}CoG%3K1N``lIUW%=oTCsCOW?@*RRMvi&XN}mnM6yc3 zcv!RdaG=jd5Fn+4#@j30BrT0Srds3ivawf)2+a#u9xjt+(Ku#$3gwjwCHJGb)eEYJ zro>FZl!)So+8jOgT# ziTsQG5GvLQt2}iRnUH6aT0La^$d@M#<^&cKxuYB)eWv}bZG_VZ10%>$_aFhKa;6tcCdAb%_Oz zaWi4u^BPh~1mG|0AJk=i0JJ%`DW4cvsTd!%nV2Q%QPe2d$x9Nqy6}Uh*NfLzTy}$i zVS^3=&2;~Kcz~fotPMvcEEHTT*y@F4#?gQPpTA@M>Fan{FJaBnewiI>kuw*^WYzGX z^bB;#zO@@E-AKRiFe^=Q1; z5)doGqhK17{<6E8Ob0WymvW9_=~+FCXJx2IdDaW^*jCKY2rn$#ab1Ud$75L8=r6;D zB zGMqrl!woT5n&G*9+Wxe@qmnekIk_(P*)3~FlpkT4UCt-OqnxKR?0Lq^?X~K(G;NJe zm@2W3MuML#uKCQzPAv&P>NnSlD~7qw!85scOwUj9oTE|8<}+>^eXjk9SoqIt-7#F` zbIj}Df<|r|_pYYN^~Nqo_kDz8q>zZXf^qK~J_AVOwbGGhCnU@agNVjFL#Wj@f5-gS>wvQrQsN7=460^(>or?5U&U9NGyVJLG%PJSg(esILHMWo2=a zILlYRQ=SLS2!}ni6)Vkmpv{>Nfs64}!?aiXOoG!W-+ z`SVxK$;jB4Ebp3=9UGR*zHNJC(eM%(ADfYb2Va-p{ZB8+*|skEJ7yVOS^f?UWMfMyTbeqB*Kb;6=`*D5iA1YG{FcJb5K-54!9n%huLy=Np^%mQo_AUCfs*TxVY#iXlDj_*e0KW2OI;Ke5%wCK^ ztQ#a(H`nSSO(beVnwXcLmQKgg^5n?l@50aj4A*ToJUh?#R|V5NieiStw#Pc9|NMNs zNTYE&F!5g}lF{F^1maV%nM&3IjVH$g)~TNl`Gs-$KF8w{r%6eL{lV}!9wcqL`Zcgl_^4&iXyOlGJQagB9RwT6vJ_N3{Plp#wP%~uwdW#^n^?y?ZCmKGJfW?46j}$ z`?jx;r9=JFfe-fGyfG%PpBRznzjRPOk5Bs@KQt}xdvcZhUmv|s9@?==&Rn`FzwqgA z$S0pVDtiW(;<10TqXUx-_SA&ci@oEB`arhVf!S>}jw;j5v@Klkml(w2`2MB!zJtvzNS$dzHFXjhL^W zE3hqUd$c0r{KkO{UIo9`$0i@x6}3N?P1n1p*4ta#)A0}9B0V1qtF)1H3C2ymPxGU5 zwzN#uSi}=}dI2B#k*U?H1m{z(3kUl7kfDQ9)Ai#vvu{|qX{f+8v@NWM>X@v6gd4GH zFxZevZHZiX?o2@AnB4iwzro9L;5;6j7x0ve*3c*r9R zH&m}HKqOWx+o5gEVaNS9st`x3TX>1gm{tkdDk5s7I<_j)w13opQNh|*nrzK!-Ed&?yF4w2&)t&! zC$4jLMgGOd_sYlLw?j5B8dTJH&9Ff?~+RNh1R=Zd-t`$hcqG4TnxVryixHv$cg~#FI_8zMg2CPo# zD}^EFbVNzB`{5s9^`6#26tY#XPnmLq~qV7lL{TghX+9rNh-4xA6%yg7=s0Js(s z(5%Cu1=|xTJ~8F4G+%hEc<=nIm(k`l)7lAuW}JZX{S-zWiXQ@_N#T({%rfXB2T0%v zirU8a9XQQlWQvWk0ixKvdO2xB*>uWnl;fZ4d)VWo9fb=aLk!nv>8{{dp6BsI!a|-O z>N1?jCtSlc%49a}HJ(OX$L5|J_3L4{oC@E*AM$c43qW;t-1Fqo7Zz*^GI9fVj!T>{ z+!XGD0g_S^sCspl$d?JRS%=NUn|T@CL?+88VVcM^7rH%2j)Hw?Y;%-qv~0j-8CgHn zh&D`!>m!DW0}XXU0k>Ew#Suz0i3h)F+bGpQSRi{Oj%kqRL64u~(+fP7&+Mokc*0hi z6R=uvJekJb)^@$qEplaK3XiGJ$@v?$pdj8u(Thl;vY6(qh2p|{K0%TV_O{|`Trbz@ zOSK>D^kP5pSFAu8{Btq#p(pLsfD5jfb#p$!;)+Oin^~4k571vNavAUF&trn5yK7!n zcelu;(OG%s@ELjKBo+b0;(c?S-7-1dCzo$rl>O(f$lu$!MtFe?k7>;Bj31_sZnlgr3gm-5)%L%DIIWe45c2kOzkqW@d|wGQCV*rKo!cMZvkr$x;HsG7_mIy&FtKTpUpo3bzl47s@3<~7HUMN0)7gRJ}vFtQpcO>#A`#EqqxG!SB)M)i`{b{c5M z*)?8b0-d1vu~?;m`!G?8yjfFNB9Rvg#T|1Ywptls9fl?3F({YjD52ZfKdN&zr1(_{ z0J_~)*CF>Z+ycKl$uepUWD=;Vd}@IcEN{)VGNn_TPU5uEs>OmF1$eBmZb3PQy(q@Z zZt3=5brYjC)m~V#@zW67OIOqK0fH{UN9F$=KpR&D&UxZm2i zUf;6F$Q*SS`xOImM=Qt4b@;yBm6;Z~8!Os>_#NBijtz_D$G&5${I8!sF5_4^w;huJ zJbAEMXCW1Rsr;bD0~jZ;m2^3dMN&NA&tesQPGGd*c*x1~d3|L8>zDA+dB%BsRIbL| zS?jxl;6OUmr^qZW{Gq9Tyd%yKH*5t5X+>X8xvaNO5ZM2$DwFQL5 zmk2KyAis>;!Yv=VnN)U3zSW{b-~vrnbsfLFE`8q&vs#_oi{?#)ZQIJ?sH~2tExI5j zaaa;65dF4ECetQ8xd7E-^Aj#fs93sQ4)ts5A>f>wUkA{xaZSL+zZ&$6cC7`90V(z` zXXhw94zeorEWi^fR(h)~FI26a0H`k?>ZZd=E>YH#7aYL3K$ETkziThc*v70mf5}$TQ099js}9nnG%8rbeVhLdeU* zCDh7@+#Z5CB`v5TGI+Pg=D4lIflM(4QFRe?)S^t&$V3YeELl%R(KtJC5!{0b=h2xq zxqIsx*}ZN^E}mZ|rzVcbW~_8?PaWX!S&^p~o_H$>dEP?yn6r>JT)6WZR~H;boR{u% zSSXhvyA!~}zWrlatq|7tc%j1!=ovjbuvY*$&CxcGi+a-JcX#Py{Ly~iMQFiY`S})n zauFBdSZ)a4lAFgJ{t4;o8VcpL0 zsfSjSj|Gj$U%y7c36D9vk^lkLDIb5N36y0k;iQ6XOeIRu#{6%eEpBc~nZ|+J0x25A z0ztlsE{aXms#-YD81FW6j#+6yi7p5|uIB}zWRzo)ne@Mv=r@T>%5e*?2X{>tsd^jA z(YQ@6$U%16e@lBe%$bGpg;8>(g`v1M(a13wLM^6Am40%0#b9<`Vx`21)$p}|gm0}f z%iu9Rv4zKJKg!Wg&5vf>a{1PRmP*O9NGAYn7Q>6m6RVGJcSlS=MhOhy$qeoXz+&X$ zD6jGgSzH$H?C3j+aEFZ*a0|~6Ds1TsH|iQY!dMjR7~qiN=su zOoz14w#|NPJI&y_J{OVU1zM_%Chay%Q#M~#Z!=nlP>yYay?WDF9pJuLK-~bF@1`XO zuLj1le2DPfbneYA)Cc=NF8H)!G*K%C67{&5%$!WfAZ|1tI6H^$)Stjz>LGa+tJurv zg!J@u%LraUbADE8J@)d%%PU+&Ed)T4>Fi9~nH7nQgOyhMtfg!x(4>?`g2(KM* z{Q>EjhF+TtfQX3QAH^f+Zqu zF+@`pT|%`9k!nTYQFJ~3vx01KQI1#P*wBpSUaw6UkgH-G5?&Buogle#)yDY5#KA^u z*6{sYxLSKm`h&KWhJ%5%CHIh(>?OkQw2P-h{>Tj&YP*h@Vpn0qSb~D+CoRDOs_zTQ z);XncS>OiR7hhA}z*kQ|BY2)Kz|$gm0ZT$RL9WTzsz;@|qjg}beQ^KCRXhWcjIPyzjKS+W~vd;VewN=mnc zB>s1y|GYgARBckt-`Yy%^-DXC131df^1@KJkXTt4Lk9!+R7;m0Q)FgbzINcatlGFt z{_4;fT;SrdbljP?m3^)6HrIoloA1l=t0M=fR!mIrxY≻ZEEYpPU+(!;@e*IjP*a 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 z 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%0AoO$zxGeX;X_`B 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 _Kk4o76E^ub+mq;!(Y2XzN~&0Sg$$rK_zQ%pL}9 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

+s&;?y8Y^!+C6(siXQ=EL+)QG*zu+ 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̓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

5pGOcdj%t{QBLa^Hl5b({oO{=_ggIk`<2|9a&XC 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

9#8)Z0H0=LWYic%%zOK+FA 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%0ANI~oWZWN8bJb3cMk-CBlXgrCEZjMcxd##X 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 e*w0Icn<)g;d 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

UY0HqW7+&;L4g1p)pX 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

nWnQ} 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Ƀ@m zKt<CT+D0 zd?T&n#p{S4`1!1Xv8!&<^W~)rv%1Wdb<}60@XFA%iGIsG>pj%wtZCz(ub`HB#+JP! zrkY49ly&T*{WQEl_Ry6_o@Dt+H~Y!}gQ(_=dan!u{K7$58~#uRK5}Y& zX6yr9isA=sm669BF9PoYHfGD^Kk(@2)M5Z^M74edOPwnUK!n9GOwH+!Ax_|$tDeFV zi-KTZ^OeGPTvE3ElqY2tJDz0(s4UHjFhY~`-Gz|i#5+dlE53|DPU662+Y=|r);qL0 zmxojBM{(eAkWT#KK2&WLWube8Rj*j`Nj&86zMMgks?1;^uYGc@`=AnFnk)x0YKC-( z@e6!yNc;@hq^yk6tlR@*=8*N6*Y-@|kdVO`(sYTNC7MxL? zVPjIbXJp_%HBhY$fNBt2eQXql zFb1j6*NiE?c`aCh(b2Zb$$ZbfJt~jL94j#8K;XJO4USQSSaP;94c;zinNH-^HJr07 z3FK^GyqD$MZy%Nqads}PZ(PU!?zIe|>hzbQw6(q$ftDgb-#YOaS0nW7bn472 zmq@`Oi!*Y`+3WjUI1B>091L5j;v(k77kjN>ixX#V^YH4r^KR(ND(tar%RcP9xD2ZZ zbnotM_F2HS%2GH>OTWo^c7X#VI zj-kRJfp&`akB%p=%5?@|7O!kmXE+mdY~!eQ^V$Wz7+B@&3!9{0t;D9fAo>#QBeiYP zC3H}tTxH$;6_%bkMQ>+8#x)Hesu1aj7(9_S#EH6a;LqUrto2yiDxI+#Zj*b89NPQL zkw+ZqK9`*EM7OoN!OZxVZsuO@efV+t>u*^5=a40uj@g3)ruXmOq#g1N270@p?m3^= zoVhoKZOXwMmV$D5qeBKy4rnavbj%A3kZB{^h|5kboH8Iqy)V;_4q1}tkgp;93d$E` zm%cio{`UByW5=bRR<7}t!Hc-&+#K2KXN`fJ1-~X@V}f%U$p z>7ZfIj`nPOUy9aYJ)d)Z?C!8!5AvoRadq~G03l>AOWzO9;LS-~$^+ObofI>5);R4h7nC(s!t|_q9s|t==)JuCk0>fb z{e`oD^P57_PyX$4nL!))&g9la;%AW@rB!7!R_j@r0`?M-BD<5frmIb=r5b)vtcPI+ zJjvi2x>tVnIB|lsoYCOn1)*SMM7o2KOfN^IJ@g@z z=`$|k4D~QXDvY$Fr69vBpAK-A^q880gn?9K3~9?Tr^W)R88mgSCP13jXH0P}q~RYn z^c?rh4no@eQpDgFz|^m0K6n_&i@pTNSW48aDBzIDnZD%Q+pUiWxVl8B=eTCW=48sd zm3m6tx7NSI&BiIcL4Nf$Ex&dR1&_u*`2~=0EuxIWwU&jPds(~eh)Szzn4(mD$ZTRj zzi~)LQzDhp0H4KEIg`v#-tf#1`H4Km*{hbyWC-$#amM9A?VWPMpmTwPaTf zp)ip@A@M6ELqGYd8|NW}t~Di0y;t<2jIe{O9gehub|_K%0@Hn%@gYzkorDom@EQ9w zn4ZS#?)^R7+&KIcZ^~l|D@@<-RJ}s60kqN}Z#H`K)ArfoB+%5UV^awUYoL4F`=R_znQ-sX4rlxmL&zR4!z1s(}n z4bW2c)KDsJ>L@SbJ)P7$uqYd32%0T55Sw8!n*cuRZzLjq?I#8wVTV=Qc;%6N^W1@5 zh|a)ZL+dF9E}9);qLA`*m?>M>T|Fl{jme7D+ek8r*O9DwU48Nt8C9hfqgs)ntNK8d z`ZTYn`KEYCHwrt@G?H~Wqg%)@xevXG$)r4ZhMlV&l2<4j^sAHlGQG^NR;@B>%Y>cU z*%!BodLfPY>J@n4N8mKCUQ+)`J2_R9Ab>xI8mjgR$)FBR{l!7ANo$*`41@c?vqq{- zQ~u=HxC9;J)BG%d(>Zh<_*WhBT_S1585n(bA#w^6-Zv%3U~!WUoFOyW7Y0+OCXN!$z(P?{^k*1|1mh^xzg9?BC7oV4#cfV6^uHP&>Eb+1ItZLWKM~0AX zM$u|7bv%crV>Ljkg+q4b6eqo#zS>!S``}^O!ux;k-aTf0AK)Bhyel38K+=Kkdh48r z!4#PVVb9h%cA>{RW#iiy$aCU`wahFQ>|l4FC2Ag)-}v;sSQh0bp6)Z2@X;|HUqom> zaOA!cYF?(LTAtGCNLtRufldg)|`C3n~W z7<-;FTmI_i8Z-WJHoNgGg92A@h--6ea=0dZ&qwAZ9M>@@qHg@@uwC~{1~fWg$)N|- z-ztMUPaZxmYb@7ui?1`j*!jBr+KnZaWmzfr?p!VZ$!~tI{L|n0ArAkY^7QGea>kb) z3&?$&+1}UrJv%rl&#;GsMh@oevw`ka)~3I`b+v4>6wPDsj#xi`0Y|v?qT|(#cDbaH z0;fNEEx2sX8BStm*q19?<;T}<;Y{aCh!@YwUw-vv`TEgLx&IG8VMh55n=QX6KluQ%h3)S0v|FP{N8)zi-+HqS2)Dqx%V*x z6+3Xm%(_CyFXHS!d&$PT3}~=-#L_um2w?jY_B`03 z4i}g;j^NN@fQl*UXI!r*IHpf@N^jmQ-@JSp8!O*siJM)&M)2C89XR2|Mnm*sXnEoA z2F8tmwUPr!Zusm5-FD#1Y<}w&3D&AZ1bz{77K2I5+-E@GXMg=|dGWhHEn9b%${+pd zUzXqe@u%g7pWbKFUmV>Zy-*E3+kjQ(>56$*n1 z4v6_R$uR>_=h$JFje<8e+2`QKJJjcTED5y2Aj<*+154P$y%#pP?zU-P-|+Ru)8p&t za8`cnr{8BoWq^WSo{$i_%bG zw`w~JGCPb4o*`(5kxj&Z>zxaS{s3_V3Jvo^UjfW>BGPKntdMMXaHZUU0=m7p` zi;Fl}_F7sKoAi7x!%LW`{pb|OoO!Wne>pX&U5E8%W6H9`$@FMC1{RSyo_;j3zZMd9 zNUIxtciMBtb^_5i$MaJn^k;Bea~^WTo~EV+=7mi4Y}@IBx`ciyVC$fwwJ76-Q1OEw zeaSAY>F%gv1-Y(#`v%dV{vy;Q2mZmk87TElbIB{?6U>>UlZm{G58(omZ@+}lx9aS2 zz^RkI0#Pi{-o9JKpr$yNgwfs=AXKQNBg3eDUtD`b10chHc~BlQRrI$$PWgJv^&Vk= zmGzkCc|(qr1pzUs1|9kQ*<%X-fHbG8A|m%RDb4Nfa51t2FXCMt+*^ZGDN zXIbXgMulypjg&Hs*(=bAhv+t%=*->3(Rj(GUU#)|D4$L~XI6Vtj0e!hFmVU|)zq1c zv$80MH=(TjG+^K-(;2KwD!;+x16ZO+Pg-%)gpKyoAzEkbLkq2CuO4SHyO>76I{de{ zSh9v0>3{X*H)Uh%R{7CK@A8?|ae2kM;)i%UG}8i0o-Fch3n~O%R!qmye#i`SJ}H6k z&D&e$>N;*lW@(?Z8SpjM55I!*o3(jxOglpwL|(o&a7Zt)?)@H{1v`s*#V--~3PC5} z_y9K6b+wUA6nv|n2JR<@YH1ya>FnzxoVKoue#*>Z9hLD}OY2nYy6Yfon{cGob`<2A z-Cb{6hp)5Jo!Y*D-fn<;%Cb1yIHuoa2LBb7EV_OBYWa_U>-+Fwopz0h!#yqloYXFz z^S$@B%D3CcEHm?jw!$XE%%lbi-C0u|$KwHX&yn|sAKoh~|KV>ibN&WvvXjq-s~gvF z#PUVK@$p*u(OuSFXOLiX7Eu~Z6czW+CW@YAxf@d2~&Ps<1IESDd=%U%sHAG6%iM%iM}=7?RMcNhp*=0k+l zd#h!K4UBiF<7H>y(`HtfJ#K9rvQGUWHg`t$4ucvuZ(J?E_VEYQ!TqwvsM0xKFkD%< zR$j8{^CphrUZcQ?!L z{rLUz*{fG!{`^de+{sr!9ut0?z(}=y^t~f*9HcBt&r+LPs-oYl}Kk3?+coEh1 z?A3{w46q%sKD`?+OJ$8Vb%hZC`=988uzT#+L67dW{FKj2UheFdmHVu*|IV#)hrt-H zqkZJNj_miYZIoXgJu5d^nkY8D_WPi-84V4l>Alk3Qgpfq)y_7_Tk4X93s3!VYysdzBlywaZ@fM~FU{nEj1B zvfO&hvI_a;W2G-<7bNIK8CPhR-$g5*s$=x!$f48Nem?v54*Y^#;zyf{M$e;)`AwiU1Du8#z-b&RbGnYX@#t&vZ{I|CC%E1C8OQz&-X^!I>?L53jwWC(AqsA7I2qf{;0>rffZYXp#UF7#-{*pNUN3)`556C=-@Q z;HjteX@0cf&>V{VYl|==buCUf5J0VMkvwqHUh*)^M3#hv*lA<(_?-ZAoS?*-W0z;Q@erWL*#Il4|%2yd9Lwlv!oL;LBqd3m_Po!?q|z; z*oae{G%92}b~Z|$7jWU_)h330q4N5|7W!yM^Z6NqMkZ?3cmzi~2psj(bePsnqwtBN8~x-jQX4@kgk9InsAVy9Lh6CHm2T zXb1DVv`q|kLS9L|N%ldHW<=9jPeYmVwDM%trxQNQJgY@7SL6-44QjUgEjoH{w4HZ+ z(pGVwB!5aznrW|yPY(4RM@cTquXM7Khq`2a3p>>(bm`<0CPUi6x|zxs5_g$SGU#b1 zZqo96SzhLMd)wNXX8ChOMJJ;AP<+32pcxLRC{zrs!S4P<~-;G zq23Nto{5zCdCq*#wwL}E(U)Bs*M?o8@+imK)Mu8X?A#%Eu2ZVYWNjGgGKYNYf-3o9M@ZcM%IEmdaWwC!u`o%Hb1z58*V>RE)-T|^E05QI zgnWPGJ;Fs|LTUL72)n>ZuV+c}(^^TQTrJCzB2*%RNtd zPw6CjU++DB*usw4fBHyj%Z@189Gl33o4LS%5-4XLn;{6847a% zRvstbP=bN3Qjm=kPF&8yi%g?7n!?N4myOs!mL)i12A>9(_ho?xprjEXBm-Wj7y8(F zD35}~i#`|sg@@>*?F&l-AB1fg@i3`X+qrfAZ7v8=tT)`rga(7$bZI=mC!Ot=qSm8Gl+{;D}vjqg^*Pb@Nr1 zVshqq8g9_4*?A#f+_*EMUULFkA6Hl}{At<4;kSP8HmkB6l$DK*a56eWSemhX4UR-A zcW6sQLI+v}Fld8K9H7zByTPLRuET6QIl_VIGAh^E)OdlVNIrc3R{3Yh4FXm{X4kF9 z?2fc7lXvIpO8M;BcKP;@{T5hz9=9sCW)ofpT6Wn#z?sTREW7iMetft5-Vbik=GavC zg&VUTl$*C!$}8;RM$B8#`TF^3xxv=~rzbC2lBL>R9m2sSL+r~T{>~V@(AjIbZFLdd zuR`aS-@GVCe8KPzPT?JD?jkFz$1fb3_Axxe<`?_SNWabu{KfL_&Ff_i$Nk>v0nXxO+7fM+_Hh5B zo8`BU-Y;MM%Rgr0>AmvZd+(IL|LgCT`*+sLH^2OfFB&%4h<2AxhxqCO2ep>i<*R^I z9nUy|F*3{I@P!6x_wDeq(5?r^FU#rfcKNLz+%LcRldCa+u*{bZezmdx%C9a?$~E?D z*km7xKm4~3%Afw?3!L5Bb3Ja-KB)6SL=399iLU#D=s;g$AmrGuIA{zyuxq_=>Oypk z^d(+D;p(To*ouy+i&!_4ne}dZ%j!I|?>dmhc!r7SD_l0nrH4MFZ9V79i-pBI3`j8u zaAQ5Ly(6B~ZeCq1AKYH&g@SeXkEk`iXmGy|8WGnS`vl-%_vf-k;ao;|zj9EIMdV+{ zTYi&`PyfPftS1S z^~~83ErTxycBz8{t|1?wyiD-Y$8~4hageQcU)GO(75ee^wuxPLxDHqNtwG}ix$Q4q zx~R4}jKY@$wtolo&X8#l`!BH^nb+4ox*zZr!HsojF^IR!Acf0!?K?aGU;Du552KU8 z=FpD**}kRGz|7}9hngT*M?k&`~?O^ENfU~v4O)+?3H#<1wv@H^ z#>POLOhnxBENn0VGB1+?trxSWI#}sM_h?=?DZLkR4WMhlcd#?8v`JTHR9zzwu_mYW z?F*AMZDY14H;GS}kb~=As^0Cq3u&dWW!T8R!8~=gEmZn>j)Hbbnwi(9Bd#Ze(C24c zmV;{aWx`HFlvi;oLLws9JekCoN0!yId}^DX(tn$DuteCL73IsZVGzZ*d1hEA)Tz;U zP~a5J!~+eW4h%H{Kn0wZFpD1$V$KbgRJz3cClQZ&%@#6JU(Zu2+R-xCl8?CZ5aI}m zl1MLpri8aV06auWloqO_p$|YpWL+k&YH><}Ms1JrtOKmqf)x9i=-%2x{>H(Rl!IQx z>!Xf%K4tVu zk$`EOOjpv8YnzI;EHCShGB>cd4h>-!GE>ILj6U!Y0P5f}?Kxrlygsgu@=aR8XFSj5#V@W??h#gXlQmB0 z-6W0do<`5>vbglTazhq?D<$`=YG)Y;5r z2HTzYhDJ4H4)r)x@ulhWHxTU?*LN_gR4U(kt>-|Mc^Qm_SmdQ0f_Ta*FKak(D!*FZ z^5mPux^uvbBOMO51>fJZwS_STgUAHf;L#CjQEB

`wiR(Svrr_qsm4N8>pmX#%! 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

r~%_`N$H5QL2Pf7aDh6~@NO{)TX4IXW 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


(PO#xQL{V`e-XqM7 zZ3a$WoyFw^`MB`V?SC%yks|~JPOVnDEjp-I`Kv3Xl4cAM{Wbm9=(6Nl+Np}C{3o;@ z85|Zs86-GfS_z6Cxp(sUtN0N-Y7mnjl?RB>-CR3`OW+t>0hl&C;j%WZA1M8Uy%65?FS9I! zCB3ax4dXudfix(wCfh>oU zfHlOof1Qzl)^7_|sxJ@H+|iCu98xYGo~zUmQglBx`WKBdYGw%G@#qSJ6oYS5HWY`X z$HQaln6vd9ijL5fHF)FUkaEe?F*I<5qgakh9$PQCQa9QWiYFe9 zXmDQNa226#jWS0i_J@`cc-s8X2v3>bphscKP|{RUTmXsnU(PhJpK>MhXPpe_n(M|_ zWAm8ZyTG5f(11$gzvuJ}gLNf1+u6p3mljn9sgMphW`aTc{K?SUF0+rUZS;? z{_h*=(be8Y<9;>e$F@2v)k}K(3QD2qESXvC4OJDutbb0iW?x9{yaAyb&{5=iTXl^ZHfZaN^ z3!;t&_=7XA+SPEpFB1!-l|6jNNttQ7{VC2X#x({G?rg3^ z2PatCxx=A|J5+qs;|=Z`&Xz1-En0NLCb@ZeS(Mkcobwnr{yCvLVxw`9S;I(SyvM*80LBi*C6 z5y|V4gX!n53x9OHBANK_vC-?lfjQ}J>?GkU=_Xkx8L4W}@;5{6m_}X_<=aj|y2lQS zCJSqZBrOAY;7Ig4B~ZbE3mbX|pd|}JuxCoruai?7?$`F9$XqW*e*(m(7*Q-W=?l z?%`kl^FM_<+l#;ZKmILRDr(TtT?a3Npl)rip%PBkI>mzgn##!zvA+C?nYo5ZL7$pmDI<#RO9|fRKR^gg5b+1-{P;nnMN=D-nTG_?S~KV z)2Dp}4fW-mh^Q5}^jKrrujtz5+4uy0`D~a$e9yTGzKTJ3Z=s99ncwMeM^jTixN(5) zi_S2)afoLu|Eove;`Hc?q?VAi9+=1p=1`e*ur=NWW*5$;+i?I!SMS8z}IfX5* zyw9WCn_HZC_~5hmaeIIh1OR?Ofxq?nYGUMoF#%qV9b;&Hfx&=B@ViH&sN?Q{UQSNj zxxon#20IoRN)Y9ZtqUyEEzrdD0vAkh z+bc>SP7_=a`VXc0?}-$IjVnDYuGU`i9;)mG^1k6e%)7I>&-mFQCF7_whcNREuhc99 z@06L7;hT!-^(nAvUe%{%7tL!NTQbr*neRpxTN!QUj3V>%7)iKJ(P4u_Pd1lyZON^t zYQ>4fPZPDZl?c1H8sTbJkvNP8F>@0Dp`F+CZgy;Cbn**HR`<(xP#tW}h|W|N7Wp%E z<8c=?-w)4#k6JE68L6~ff~1)jq94AIE

x2goE34gEDjzKK1TJei-5hM)*aw?DvT^q8wKM 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
^@gJ-5%g5Ztq-<#_5$mIt>4DR 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ìkt7a0n*JcF63p zd`j66OS5*1EypGT2Te->9Lo%i*1}nel!oEJqg4$n38or{jQE)?&OzgfCx6ozNx9?5 zA&#Qmo;avS7MpIQ;Qo4c4pZinv835~5VqoxzB@xc{1-hv93PnRC}HetONFk!^M)XH z#B53dz)GAqxhXXO6$EUMrrjDttXu%l(Nxf`TnJ!kz#vx;+5X+GfG>D5#VAIK^5CPKS2<{6NT$+SiB;&hMcPxwh zHR5vO(VL(Y2yoOp$l>xwT=VQMfxroDoZrQFtcASWFu?Ju;xI1n1||rx9A(FP#eIfS z$R!IWhf=)~iopVv9Sxrt^1X7dTgKN>`P%TlSAzQG7+GSm4agA-eWq(nop zz|`bBKYpE$LsA?9<3lX|;*(?!-`9>f0@C+C=BLz07v2TXAP))L$=&@lBKo}C#}E3W z_bf>RC?5caG7`WZHp>wW;?xHp0Co;V@N`h5wUBH>h{1sZo8@~LWN=`#Q67gw(%93& z5cP0L4Ft=yg0RzN$>PIBy8!jALM$eY%Irx4=8%0Dt8^hvA)(9Dp@=dPSfj_skeZg0 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