Minimum Window Substring

Minimum Window Substring

题目大意:
给定一个字符串S 和 另一个字符串T,在S中找到一个最短长度的子串包含T中所有的字母。 时间期望是O(N)
如:
S = "ADOBECODEBANC"
T = "ABC"
最短子串是 "BANC"

提示:

  • 如果没有找到子串,则返回""空串
  • 如果有多个满足条件的字串,题目保证最短子串只有唯一的一个

思路:
维护一个计数数组CountTable统计字符串T所出现的所有字母次数,再开始遍历字符串S,同时开始统计T所出现的字母在S所出现的次数。 如果遍历过程中统计的字母次数和T的长度相同,说明我们遍历的得到的这个子串就是一个 Window Substring,满足条件!记录这个subString,开始缩小这个Window Substring,直到条件不满足 继续遍历寻找下一个 Window Substring。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public:
string minWindow(string s, string t) {
string ans = "";
if(t.length() > s.length()) return ans;

vector<int> countTable(256,0);

for_each(t.begin(), t.end(), [&](const char ch){
countTable[ch]++;
});

vector<int> foundTable(256,0);
queue<unsigned long> Q;
unsigned long maxLen(s.length()),count(0);
for(size_t i = 0;i<s.length();i++){
if(countTable[s[i]] > 0){
foundTable[s[i]] ++;
Q.push(i);
if(foundTable[s[i]] <= countTable[s[i]]) count++;
if(count == t.length()){
unsigned long idx;
do {
idx = Q.front();
Q.pop();
foundTable[s[idx]]--;
} while (foundTable[s[idx]] >= countTable[s[idx]]);
if(i-idx < maxLen) ans = s.substr(idx,i-idx+1),maxLen = ans.length();
count --;
}
}
}
return ans;
}
};

Accepted

为iOS建立 Travis CI

为iOS建立 Travis CI

我给自己的GMYHotSpotView项目 关联了这个 持续集成的工具 .travis.yml文件编写如下

1
2
language: objective-c
script: xcodebuild -workspace GMYHotSpotView.xcworkspace -scheme GMYHotSpotView

Building an Objective-C Project

我后面遇到的一个比较麻烦的问题是:

1
2
Check dependencies
Code Sign error: No code signing identities found: No valid signing identities.

最后修改.travis.yml文件,主要是新增了 CODE_SIGN_IDENTITY=”” CODE_SIGNING_REQUIRED=NO

1
2
3
4
5
## http://lint.travis-ci.org/
language: objective-c
xcode_workspace: GMYHotSpotView.xcworkspace
xcode_scheme: GMYHotSpotView
script: xcodebuild -workspace GMYHotSpotView.xcworkspace -scheme GMYHotSpotView CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO

CI

指示灯是可以拿来使用的 Build Status

GitHub上还有一个很完善的YAML配置 https://github.com/BoltsFramework/Bolts-iOS/blob/master/.travis.yml 这个没啥卵用

构建iOS持续集成平台(三)——CI服务器与自动化部署 @infoQ

http://stackoverflow.com/questions/27671854/travis-ci-fails-to-build-with-a-code-signing-error

http://stackoverflow.com/questions/27671854/travis-ci-fails-to-build-with-a-code-signing-error

Vaild Number

Vaild Number

判断给定的一个字符串是否是数字。

Note: 题目对于数字的合法定义没有给出具体限定,你应该根据判断返回结果来调整自己的程序。 (这个超坑的,我差不多错误提交了8次。有些后台TestCase的合理性是有待讨论的吐槽传送门)

言归正传。这类题目,我们一般称为 模拟题。是因为该题目没有对应具体算法和数据结构,我们只能按照题目描述的分支情况,模拟实现。其实,这个题目我在杭电OJ上做过了。。。

Is It a Number

accetped

当时我就是当模拟题做的,现在看来这种解法不太优雅。 看了一下 Discuss,发现大多数人使用 DFA(有限状态自动机)。城!会!玩!

按照这个思路,我们来动手实践一下。 首先是状态的划分,因为 鉴别是否是数字,字符集{‘0’-‘9’,’+’,’-‘,’.’,’E’}。根据数字的定义,状态是有限的。 所以我们大体划分出这么集中状态:

1. UnkownState 起始状态,没有任何字符输入。能接受的下一步字符为 数字|正负号|小数点
2. NumberState 输入数字状态,能接受的下一步字符为 数字|小数点|科学计数法(E,e)
3. OnlyNumberState 数字接着输入小数点状态,能接受下一步字符为 数字|科学计数法(E,e)
4. OperatorState 输入运算法状态,能接受下一步字符为 数字|小数点
5. DecimalPointState 输入小数点状态,能接受下一步字符为 数字
6. ScientificState 输入科学计数法状态,能接受下一步字符为 数字|正负号
7. NoscientificState 科学计数法接着输入正负号状态,能接受下一步字符为 数字
8. IllegalState 非法输入状态 
9. EndState 终态 能接受下一步字符 为数字

这里的状态命名比较随意。 状态之间的转移是关键。最后,我们认为 2,3,9状态为合法状态。停留在其他状态的输入情况,不能认为是数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h>
#include <string.h>

typedef enum State{
UnkownState = 0,
NumberState = 1,
OnlyNumberState = 2,
OperatorState = 3,
DecimalPointState = 4,
ScientificState = 5,
NoscientificState = 6,
IllegalState = 7,
EndState,
}State;

int isNumber(char* s) {
State state = UnkownState;
while (*s == ' ') s++;
char *p = (s+strlen(s)-1);
while (*p == ' ') --p;
*(p+1) = 0;


while (*s) {
switch (state) {
case UnkownState:{
state = IllegalState;
if(*s == '+' || *s == '-') state = OperatorState;
if(*s >= '0' && *s <= '9') state = NumberState;
if(*s == '.') state = DecimalPointState;
break;
}
case NumberState:{
state = IllegalState;
if(*s >= '0' && *s <= '9') state = NumberState;
if(*s == '.') state = OnlyNumberState;
if(*s == 'e' || *s == 'E') state = ScientificState;
break;
}
case OnlyNumberState:{
state = IllegalState;
if(*s >= '0' && *s <= '9') state = OnlyNumberState;
if(*s == 'e' || *s == 'E') state = ScientificState;
break;
}
case OperatorState:{
state = IllegalState;
if(*s >= '0' && *s <= '9') state = NumberState;
if(*s == '.' ) state = DecimalPointState;
break;
}
case DecimalPointState:{
state = IllegalState;
if(*s >= '0' && *s <= '9') state = OnlyNumberState;
break;
}
case ScientificState:{
state = IllegalState;
if(*s == '+' || *s == '-') state = NoscientificState;
if(*s >= '0' && *s <= '9') state = EndState;
break;
}
case NoscientificState:{
state = IllegalState;
if(*s >= '0' && *s <='9') state = EndState;
break;
}
case EndState:{
state = IllegalState;
if(*s >= '0' && *s <='9') state = EndState;
break;
}
case IllegalState:{
return 0;
}
}
s++;
}


return (state == NumberState || state == OnlyNumberState || state == EndState);

}

int main(){
char str[1024];
while(gets(str)){
printf("%s %s\n",str,isNumber(str) ? "is a Number":"isn't a Number");
}
return 0;
}

accepeted

Reveal 调试模拟器

使用Reveal进行视图分析

Reveal比Xcode自带的Debug View Hierarchy要给力一些。好吧,这句话我收回-。- Xcode7中的视图调试貌似改进了很多,还支持debug。言归正传,说一下如何使用 Reveal

官方有三种使用方法:

  1. Static Linking

    • Linking Reveal’s static library into your iOS application is the quickest and easiest way to enable Reveal introspection.
  2. Dynamic Loading

    • Dynamic loading allows third party libraries to be loaded into an iOS application on demand, at runtime. In this scenario the library is not linked in to the executable, but is instead included in the app bundle and can be loaded on demand. This approach allows developers to maintain full control over when the Reveal library is loaded, and when the service is started and stopped within their application.
  3. CocoaPods
    • CocoaPods is a dependency management system for iOS and OSX projects. It automates the configuration of workspaces to manage 3rd party library dependencies in Xcode projects.

我们不希望使用一个三方工具,还要修改代码。所以我们重点关注第二个Dynamic Loading。

下面是我直译版本:

在不修改工程项目的情况加载 Reveal

这个方法只是适用于项目运行在模拟器上

加载Reveal不需要修改工程项目是一个极好的办法。方便让你分析iOS App,不用去考虑修改工程所带来的隐患了。

  1. 使用Xcode打开你的项目,选择 View(视图)->Navigators(导航)->Show Breakpoint Navigator(断点导航栏)
  2. 在底部栏的左边有一个加号,点击添加符号断点(Symbolic Breakpoint) add-symbolic-breakpoint
  3. 右键编辑断点 输入UIApplicationMain 到Symbol输入框中
  4. 点击add action按钮,确认action设置为Debugger Command
  5. 复制下面的语句到输入框中 expr (Class)NSClassFromString(@"IBARevealLoader") == nil ? (void *)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2) : ((void*)0)
    • 需要确认你的Reveal安装路径是否一致
  6. 检查Automatically continue after evaluating actions.选项是否勾选setup-breakpoint-popup
  7. 右键点击这个最新创建的断点选择Move Breakpoint To-> Usermove-breakpoint-to-user
  8. 在Xcode编译并运行你的应用在iOS模拟器上。如果一切步骤设置ok的话,你在 Reveal 上切换选择你的App就可以愉快的开始

http://support.revealapp.com/

Different iOS SDK Version Compile

前言


我们在开发feature的时候依赖 iOS9 SDK中的新framework,注意这个framework只有iOS9才有。但是我们有两套打包环境

  • Xcode6 - iOS8
  • Xcode7 - iOS9

如果不做任何处理的话,在第一套打包环境下会出现 ‘XX.h’ file not found.

我们希望编写的代码能够兼容这两套打包环境. 在 iOS9下 编译我们的feature代码,在iOS9之前的系统版本不编译,不执行。

详细的定义在 usr/include/Availabilaty.h

1
2
3
4
5
6
7
8
9
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_2_2
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_1
// iPhone OS SDK 4.0 以后版本的处理
#else
// iPhone OS SDK 3.0 ~ 4.0 版本的处理
#endif
#else
// iPhone OS SDK 3.0 之前版本的处理
#endif

但是,这还是有一个坑。 我们来看一下 具体的宏定义在 AvailabilityInternal.h 中。

1
2
3
4
5
6
7
8
9
10
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
/* make sure a default max version is set */
#ifndef __IPHONE_OS_VERSION_MAX_ALLOWED
#define __IPHONE_OS_VERSION_MAX_ALLOWED __IPHONE_9_0
#endif
/* make sure a valid min is set */
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_2_0
#undef __IPHONE_OS_VERSION_MIN_REQUIRED
#define __IPHONE_OS_VERSION_MIN_REQUIRED __IPHONE_2_0
#endif

我查看的是iOS 9.0的定义,里面定义 __IPHONE_OS_VERSION_MAX_ALLOWED__IPHONE_9_0(90000)

相信每个iOS SDK发布,都会增加 一个宏来表示版本号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#define __IPHONE_2_0     20000
#define __IPHONE_2_1 20100
#define __IPHONE_2_2 20200
#define __IPHONE_3_0 30000
#define __IPHONE_3_1 30100
#define __IPHONE_3_2 30200
#define __IPHONE_4_0 40000
#define __IPHONE_4_1 40100
#define __IPHONE_4_2 40200
#define __IPHONE_4_3 40300
#define __IPHONE_5_0 50000
#define __IPHONE_5_1 50100
#define __IPHONE_6_0 60000
#define __IPHONE_6_1 60100
#define __IPHONE_7_0 70000
#define __IPHONE_7_1 70100
#define __IPHONE_8_0 80000
#define __IPHONE_8_1 80100
#define __IPHONE_8_2 80200
#define __IPHONE_8_3 80300
#define __IPHONE_8_4 80400
#define __IPHONE_9_0 90000
/* __IPHONE_NA is not defined to a value but is uses as a token by macros to indicate that the API is unavailable */

问题来了:如果兼容代码中使用的 宏定义为 __IPHONE_8_4 ,而我编译的iOS SDK使用的是 iOS8.3的话, __IPHONE_8_4 其实是没定义的。

1
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_8_4

这个比较语句其实取 __IPHONE_OS_VERSION_MAX_ALLOWED = __IPHONE_8_3 = 80300 和 __IPHONE_8_4 所表示的数字做比较,是没有作用的。正确做法 是直接使用数字

1
#if __IPHONE_OS_VERSION_MAX_ALLOWED > 80400

Regular Expression Matching

https://leetcode.com/problems/regular-expression-matching/

这个题目比较有意思,大意是实现正则表达式中的’*’和’.’这种两种操作符。

我们来看看 这两种操作符是做什么的

‘.’ Matches any single character.

‘*’ Matches zero or more of the preceding element.

意思是说,’.’这个操作符能匹配任意单个字符,’*‘ 这个操作符能匹配 任意次 在它前面的符号。恩,看起来’*‘是压缩连续字符串的。

我们再看看题目中的几个case,分析一下最后三个吧:

case 1 isMatch(“aa”, “.*”) → true

case 2 isMatch(“ab”, “.*”) → true

case 3 isMatch(“aab”, “cab”) → true

case 1比较好理解,’.’匹配第一个’a’,’*‘匹配了第二个’a’. 因为 ‘*‘前面一个字符是’a’

case 2 这个case,我一开始一直理解不了,一度以为是题目搞错了。重新读题的时候,才发现题意说的很明白,是我误解了题意。

‘*‘ Matches zero or more of the preceding element.

反复理解这句话,意思是指’*‘能表示任意个在它前面的字符。也就是说,它前面如果是’.’这种操作符的话,”.*“可以是”.”,”..”,”…”。

那么,之前case 1的理解也是错的,’*‘操作符的优先级比较高,匹配时要优先考虑’*‘的存在。

case 1应该是这么理解 先是’*‘表示了一个在它前面的’.’,使得模式串变成了”..”,最后再去匹配。

case 2也能这么解释。

case 3,第一个’*‘的存在把前面的’c’表示了0次,第二个’*‘的存在把前面的’a’表示了两次,把模式串变成了”aab”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
bool isMatch(char* s, char* p) {
if(*p == 0) return *s == 0;
/**
* 因为 '*'优先级较高,且影响前一个字符。所以优先考虑'*'存在的情况
* 如果 当前字符的下一个字符不是 '*'的话, 进行正常的匹配。 注意'.'的情况。
*/
if(*(p+1) != '*'){
// 当前字符匹配成功的条件是 *s 存在 且 *s和*p相同
if(*s && ((*s == *p) || (*p == '.'))){
return isMatch(s+1,p+1);
}
// 当前字符匹配不通过,无须匹配后面的字符了。
return false;
}
else{
// 枚举 '*'操作符 表示n次当前字符,直到当前字符失效(失效的意思就是说 '*'影响当前字符的所有情况都我们枚举过了,不能考虑'*'的意义了,做下一步工作吧)
while(*s && ((*s==*p) || (*p == '.'))){
if(isMatch(s, p+2)) return true;
s++;
}
// 放弃这个 '*'操作符的机会,也就是说'*'表示了前一次字符0次。
return isMatch(s, p+2);
}
}

Regular Expression Matching Accepted

Make Your App Searchable

1

2

How Does Apple Rank Apps In Apple Search?

Positive Ranking Factors

  • App Installation Status. Is the app is installed on the device? (installed apps seem to get preference)
  • Personalized App Engagement. Does the individual engage with the screen in the app? This is based on time spent with result that Apple determines from session analytics.
  • App Result Click-Through Rate. Do users frequently click through the search result vs. picking another result or searching again?
  • Keywords/ Title. Do keywords from the “keywords” and “title” designations in the app markup match up with the user’s query?
  • Aggregated Engagement. How many users engage with the app screen?
  • Structured Data on Web. Is structured data correctly implemented?
  • Canonical App IDs. Is the same screen associated with one unique ID or URL across multiple indexing methods (NSUserActivity, CoreSpotlight, and Web Markup)?
  • Strength/Popularity of Web URL. How popular is the website associated with the app deep links? (Presumably, this is based on Applebot’s crawl.)

Negative Ranking Factors

  • Low Engagement. Do very few users engage with the app screen? (engagement determined by session analytics)
  • Over-Indexing. Does the app have many screens in the index with low or no engagement?
  • Returns. Do users return to search results right after looking at the app?
  • Keywords Spamming. Are developers stuffing too many irrelevant keywords into the keyword field?
  • Interstitials. Is something covering the content in the app or preventing users from accessing it?
  • Javascript (web only). Is Javascript preventing Applebot from crawling your site to find new app deep links?
  • Low Star Ratings, Low Review Volume, Poor Reviews. Apple has not explicitly called these negative ranking factors for Apple Search, but they are negative ranking factors for the App Store, so we expect Apple to treat them similarly here.

Apple recommends pursuing multiple indexing methods to optimize app visibility, but the overlapping methods will inevitably create duplication across the various indexes. For example, private content could have both a NSUserActivity and CSSearchableItem indexed, and public content could have both a NSUserActivity and a Web Markup deep link indexed.

This is obviously not ideal for controlling Applebot’s efficiency, so Apple strongly recommends associating each NSUserActivity, CSSearchableItem, and Web Markup deep link with the same uniqueIdentifier and/or URL. This is Applebot’s version of a canonical, and it’s so important to Apple that they’ve even made it a ranking factor in the Apple Search algorithm.

CoreSpotlight Framework

How to use the new search API

如有任何知识产权、版权问题或理论错误,还请指正

转载请注明原作者及以上信息

Permutation Sequence

Permutation Sequence

题目大意:一个[1,2,3,…,n]n个数字的集合有 n!个唯一的排列组合。对这些排列组合排序我们能得到一个有序的数组,现在给你一个n和k求第k个顺序的排列。

ie,for n = 3,k = 4

  1. “123”
  2. “132”
  3. “213”
  4. “231”
  5. “312”
  6. “321”

应该返回第4个排列情况”231”。

Note 给定的n在[1,9]之间

解题思路:一开始我使用C++ STL自带的next_permutation API,以为能水过去。结果超时了(Time Limit Exceeded) 看来不能偷懒。

我们来重新看一下题目,n个数字有n!种排列情况,求第k个排列组合(排序之后)。大致能理解为 给n个数字,组成第k小的数。 这么想的话,我们可以思考一下 如果有n个数,求组成第k小的数,我们第一位数字应该如何选择呢?

还是这个(n = 3, k = 4)的case,我们手上有1,2,3这三个数字,我们要组成第4小的数,我们第一个数字应该选2,为什么选2需要解释一下:

我们要组成第4小的数,手上有3个数,有3!= 6种排列情况(组成情况)。要先选一个最高位数, 我们看一下 剩下有2个数,有2种组成情况。显然最高位选1的话,最多也是一个第2小的数。选3的话,怎么组成也是第5小的数起跳。选2的话,组成的数区间是第4-第5。所以我们选择2作为 第4小的数的最高位。

由此规律为:最高位数字是 (k-1)/(n-1)!
同理 选择次最高位思路是一样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public:
string getPermutation(int n, int k) {

string str = "";
if(k == factorial(n)){
for(int i=n;i>0;i--) str+=('0'+i);
return str;
}

vector<int> numbers;
for(int i=1;i<=n;i++) numbers.push_back(i);
for(int i=1;i<n;i++){
int num = factorial(n-i);
int index = (k-1)/num;
str += ('0' + numbers[index]);
numbers.erase(numbers.begin() + index);
k = k-index*num;
}
str+= ('0' + numbers[0]);
return str;
}
private:
int factorial(int n){
int ans = n;
while(--n) ans*=n;
return ans;
}
};

accepted

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。

iOS杂记

主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]]
Major_Version_Number.Minor_Version_Number[.Revision_Number[.Build_Number]]应根据下面的约定使用这些部分:

Major :具有相同名称但不同主版本号的程序集不可互换。例如,这适用于对产品的大量重写,这些重写使得无法实现向后兼容性。

Minor :如果两个程序集的名称和主版本号相同,而次版本号不同,这指示显著增强,但照顾到了向后兼容性。例如,这适用于产品的修正版或完全向后兼容的新版本。

Build :内部版本号的不同表示对相同源所作的重新编译。这适合于更改处理器、平台或编译器的情况。

Revision :名称、主版本号和次版本号都相同但修订号不同的程序集应是完全可互换的。这适用于修复以前发布的程序集中的安全漏洞。

程序集的只有内部版本号或修订号不同的后续版本被认为是先前版本的修补程序 (Hotfix) 更新。

GNU C的一大特色(却不被初学者所知)就是attribute机制。attribute可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。

编写工业级代码必不可少的装逼技能

对比http请求中 GET Method 和 POST Method两者的区别

编程思想值得借鉴学习,可以在 Demo项目中试用一下

笔者实践经验总结how not to crash

metaballs-and-marching-squares
demo

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。

ALAssetsLibrary

ALAssetsLibrary

一个资料库实例在与用户没有交互的情况下,能获取到相片和摄影资源

  • 在 iOS8及其以后,使用 Photos framework代替 Assets Libray framework。 Photos framework提供了更多的新功能和强大的性能。

这个资料库包含了 来着iTunes或拍摄 的已保存相册。你可以使用资料库来检索所有资料分组 和 保存相片和影像到已经存在的相册中。

Accessing Assets

authorizationStatus 返回照片数据授权权限

  • ALAuthorizationStatusNotDetermined 未授权
  • ALAuthorizationStatusRestricted 访问受限
  • ALAuthorizationStatusDenied 拒绝访问
  • ALAuthorizationStatusAuthorized 授权访问

Managing Notifications

disableSharedPhotoStreamSupport 关闭分享照片流,无视分享照片流的更新通知消息

Finding Assets

assetForURL:resultBlock:failureBlock: 使用一个文件的详细url(理解为访问路径)表示文件标示符来访问该文件

  • 注意该方法是异步的,当文件被访问时,会询问用户是否授权应用访问相册。 如果允许,resultBlock回调将执行。如果用户拒绝failureBlock回调将执行

Enumerating Assets

enumerateGroupsWithTypes:usingBlock:failureBlock: 遍历资源分组下的所有资源

  • 注意该方法是异步的,关于遍历资源需要用户授权访问。特殊注意事项,如果访问失败原因为 ALAssetsLibraryAccessGloballyDeniedError是因为用户没有启用地理信息服务

Saving Assets

  • [ ] writeVideoAtPathToSavedPhotosAlbum:completionBlock:
  • [ ] videoAtPathIsCompatibleWithSavedPhotosAlbum:
  • [ ] writeImageToSavedPhotosAlbum:orientation:completionBlock:
  • [ ] writeImageDataToSavedPhotosAlbum:metadata:completionBlock:
  • [ ] writeImageToSavedPhotosAlbum:metadata:completionBlock:

Managing Asset Groups

addAssetsGroupAlbumWithName:resultBlock:failureBlock: 新建资源分组到资源库中

  • name为新建资源组名字,不可重名。类型为ALAssetsGroupAlbum,可读写。同为异步方法,需要用户授权

groupForURL:resultBlock:failureBlock:使用资源分组url来访问该资源组

  • 同为异步方法

Constants

具体的资源类型、回调定义,权限类型,通知信息,错误信息。请参见 ALAssetsLibrary Class Reference(iOS 8.3 Documentation)

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。