- 父類:NSObject
從一個(gè)Photos的獲取方法中返回的有序的資源或者集合的列表茵宪。
一梧宫、概述
當(dāng)你使用PHAsset困食、PHCollection荆残、PHAssetCollection和PHCollectionList 類的方法來(lái)獲取對(duì)象,Photos會(huì)提供一個(gè)PHFetchResult
類的一個(gè)對(duì)象作為結(jié)果亿笤。你訪問(wèn)結(jié)果中的內(nèi)容可以像使用NSArray
類的方法獲取內(nèi)容一樣來(lái)獲取PHFetchResult
中的內(nèi)容翎迁。與NSArray
對(duì)象不同的是,一個(gè)PHFetchResult
對(duì)象中的內(nèi)容是動(dòng)態(tài)加載的净薛,如果你需要一些內(nèi)容它才會(huì)去照片庫(kù)中去獲取對(duì)應(yīng)的內(nèi)容汪榔,這可以在處理大量的結(jié)果的時(shí)候提供一個(gè)最佳的性能。
獲取結(jié)果對(duì)它包含的內(nèi)容提供線程安全的訪問(wèn)罕拂。在一次獲取之后揍异,獲取結(jié)果的count
屬性值是一個(gè)常量,獲取結(jié)果中包含的所有對(duì)象會(huì)保持相同的localIdentifier
屬性值爆班。(為了得到一次獲取的內(nèi)容更新衷掷,需要為共享的PHPhotoLibrary對(duì)象注冊(cè)一個(gè)監(jiān)聽(tīng)變化的監(jiān)聽(tīng)器。)
獲取結(jié)果會(huì)緩存它里面的內(nèi)容柿菩,會(huì)存儲(chǔ)最近訪問(wèn)過(guò)的大多數(shù)內(nèi)容戚嗅。由于這些對(duì)象之外的其他的對(duì)象不會(huì)被緩存,所以訪問(wèn)未被緩存的對(duì)象需要重新獲取這些對(duì)象枢舶。這個(gè)過(guò)程可能會(huì)導(dǎo)致之前在這些對(duì)象中獲取到的一些值的改變懦胞。
二、內(nèi)容
1. 查詢獲取結(jié)果
- (BOOL)containsObject:(ObjectType)anObject;
查詢給定的對(duì)象是否在獲取結(jié)果中凉泄。
這個(gè)方法會(huì)遍歷獲取結(jié)果躏尉,對(duì)其中的每一個(gè)對(duì)象使用- (BOOL)isEqual:(id)object;
方法進(jìn)行比對(duì)。
@property (readonly) NSUInteger count;
獲取結(jié)果中的對(duì)象的數(shù)量后众。
- (NSUInteger)countOfAssetsWithMediaType:(PHAssetMediaType)mediaType;
返回獲取結(jié)果中指定類型的資源的數(shù)量胀糜。
第一次調(diào)用這個(gè)方法Photos會(huì)枚舉每一個(gè)對(duì)象進(jìn)行匹配,并將匹配的結(jié)果數(shù)量進(jìn)行緩存蒂誉,之后所有的該方法的調(diào)用都只返回緩存的結(jié)果教藻。
這個(gè)方法只會(huì)記錄PHAsset類的對(duì)象的數(shù)量,如果獲取結(jié)果中只有PHAssetCollection類的對(duì)象或PHCollectionList類的對(duì)象右锨,則該方法會(huì)返回0括堤。
PHAssetMediaType
typedef NS_ENUM(NSInteger, PHAssetMediaType) {
PHAssetMediaTypeUnknown = 0, // 未知
PHAssetMediaTypeImage = 1, // 圖片
PHAssetMediaTypeVideo = 2, // 視頻
PHAssetMediaTypeAudio = 3, // 音頻
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
@property (nonatomic, readonly, nullable) ObjectType firstObject;
獲取結(jié)果中的第一個(gè)對(duì)象。如果獲取結(jié)果為空則返回nil
绍移。
@property (nonatomic, readonly, nullable) ObjectType lastObject;
獲取結(jié)果中的最后一個(gè)對(duì)象悄窃。如果獲取結(jié)果為空則返回nil
。
- (ObjectType)objectAtIndex:(NSUInteger)index;
返回指定索引位置的對(duì)象蹂窖。如果索引值index
超出了獲取結(jié)果的數(shù)量范圍會(huì)引發(fā)一個(gè)異常(NSRangeException
)轧抗。
- (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx;
返回指定索引位置的對(duì)象。與上面的方法相同恼策,即下面兩種用法一樣:
NSLog(@"First object: %@", [fetchResult objectAtIndex:0]);
NSLog(@"First object: %@", fetchResult[0]);
- (NSArray<ObjectType> *)objectsAtIndexes:(NSIndexSet *)indexes;
返回獲取結(jié)果中指定的索引集合對(duì)應(yīng)所有對(duì)象組成的數(shù)組。如果索引集合中任何一個(gè)索引超出了獲取結(jié)果的數(shù)量范圍,就會(huì)引發(fā)一個(gè)異常(NSRangeException)涣楷。
2. 在獲取結(jié)果中查找對(duì)象
- (NSUInteger)indexOfObject:(ObjectType)anObject;
返回獲取結(jié)果中與指定對(duì)象相同的對(duì)象的索引值分唾,如果有多個(gè),則返回最小的索引值狮斗。
這個(gè)方法將從索引為0處開(kāi)始枚舉獲取結(jié)果中的對(duì)象绽乔,并使用- (BOOL)isEqual:(id)object;
方法進(jìn)行比對(duì),直到找到第一個(gè)與給定對(duì)象相同的對(duì)象碳褒,則終止枚舉折砸,并返回這個(gè)索引值。如果沒(méi)有找到與給定對(duì)象相同的對(duì)象沙峻,則返回NSNotFound睦授。
- (NSUInteger)indexOfObject:(ObjectType)anObject inRange:(NSRange)range;
返回獲取結(jié)果中在指定范圍內(nèi),與指定對(duì)象相同的對(duì)象的索引值摔寨,如果有多個(gè)去枷,則返回最小的索引值。
這個(gè)方法將從給定的范圍的起始位置開(kāi)始枚舉獲取結(jié)果中的對(duì)象是复,并使用- (BOOL)isEqual:(id)object;
方法進(jìn)行比對(duì)删顶,直到找到第一個(gè)與給定對(duì)象相同的對(duì)象,則終止枚舉淑廊,并返回這個(gè)索引值逗余。如果沒(méi)有找到與給定對(duì)象相同的對(duì)象,則返回NSNotFound季惩。
如果給定的范圍超出了獲取結(jié)果的數(shù)量范圍录粱,就會(huì)引發(fā)一個(gè)異常(NSRangeException)。
3. 在獲取結(jié)果中執(zhí)行對(duì)對(duì)象的操作
- (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;
- s NSIndexSet - 要枚舉的范圍蜀备。
- opts NSEnumerationOptions - 快速枚舉的設(shè)置
- block - 快速枚舉的操作
- obj ObjectType - 被枚舉的對(duì)象
- idx NSUInteger - 被枚舉的對(duì)象的索引
- stop BOOL - 在block中設(shè)置為
YES
將會(huì)取消當(dāng)前對(duì)獲取結(jié)果的處理关摇。
快速枚舉獲取結(jié)果中指定范圍內(nèi)的所有對(duì)象。
該方法默認(rèn)是順序枚舉碾阁,設(shè)置opts
會(huì)改變枚舉順序输虱。
該方法是同步方法,會(huì)阻塞主線程脂凶。
NSEnumerationOptions
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
NSEnumerationConcurrent = (1UL << 0), // 亂序進(jìn)行
NSEnumerationReverse = (1UL << 1), // 倒敘進(jìn)行
};
- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;
- block - 快速枚舉的操作
- obj ObjectType - 被枚舉的對(duì)象
- idx NSUInteger - 被枚舉的對(duì)象的索引
- stop BOOL - 在block中設(shè)置為
YES
將會(huì)取消當(dāng)前對(duì)獲取結(jié)果的處理宪睹。
快速枚舉獲取結(jié)果中的所有對(duì)象。
該方法是順序枚舉蚕钦,并且是同步方法亭病,會(huì)阻塞主線程。
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;
- opts NSEnumerationOptions - 快速枚舉的設(shè)置
- block - 快速枚舉的操作
- obj ObjectType - 被枚舉的對(duì)象
- idx NSUInteger - 被枚舉的對(duì)象的索引
- stop BOOL - 在block中設(shè)置為
YES
將會(huì)取消當(dāng)前對(duì)獲取結(jié)果的處理嘶居。
快速枚舉獲取結(jié)果中的所有對(duì)象罪帖。
該方法默認(rèn)是順序枚舉促煮,設(shè)置opts
會(huì)改變枚舉順序。
該方法是同步方法整袁,會(huì)阻塞主線程菠齿。
三、舉例
嗯坐昙,有待更新绳匀。等我把整個(gè)Photos寫(xiě)完吧。