Give ASMultiplexImageNodeDataSources an opportunity to provide PHAssets quicker

This commit is contained in:
Adlai Holler
2015-10-06 16:35:50 -07:00
parent fffc76a353
commit 6d73cee9fd
2 changed files with 25 additions and 9 deletions

View File

@@ -212,6 +212,18 @@ didFinishDownloadingImageWithIdentifier:(id)imageIdentifier
*/
- (NSURL *)multiplexImageNode:(ASMultiplexImageNode *)imageNode URLForImageIdentifier:(id)imageIdentifier;
/**
* @abstract A PHAsset for the specific asset local identifier
* @param imageNode The sender.
* @param assetLocalIdentifier The local identifier for a PHAsset that this image node is loading.
*
* @discussion This optional method can improve image performance if your data source already has the PHAsset available.
* If this method is not implemented, or returns nil, the image node will request the asset from the Photos framework.
* @note This method may be called from any thread.
* @return A PHAsset corresponding to `assetLocalIdentifier`, or nil if none is available.
*/
- (PHAsset *)multiplexImageNode:(ASMultiplexImageNode *)imageNode assetForLocalIdentifier:(NSString *)assetLocalIdentifier;
@end
#pragma mark -

View File

@@ -546,19 +546,23 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent
// Each ASMultiplexImageNode can have max 1 inflight Photos image request operation
[_phImageRequestOperation cancel];
__weak __typeof(self)weakSelf = self;
__weak __typeof(self) weakSelf = self;
NSOperation *newImageRequestOp = [NSBlockOperation blockOperationWithBlock:^{
__strong __typeof(weakSelf)strongSelf = weakSelf;
__strong __typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf == nil) { return; }
// Get the PHAsset itself.
[phRequestLock lock];
PHAsset *imageAsset;
// -[PHFetchResult dealloc] plays a role in the deadlock mentioned above, so we make sure the PHFetchResult is deallocated inside the critical section
@autoreleasepool {
imageAsset = [PHAsset fetchAssetsWithLocalIdentifiers:@[request.assetIdentifier] options:nil].firstObject;
// Try to get the asset immediately from the data source.
PHAsset *imageAsset = [strongSelf.dataSource multiplexImageNode:strongSelf assetForLocalIdentifier:request.assetIdentifier];
// Fall back to locking and getting the PHAsset.
if (imageAsset == nil) {
[phRequestLock lock];
// -[PHFetchResult dealloc] plays a role in the deadlock mentioned above, so we make sure the PHFetchResult is deallocated inside the critical section
@autoreleasepool {
imageAsset = [PHAsset fetchAssetsWithLocalIdentifiers:@[request.assetIdentifier] options:nil].firstObject;
}
[phRequestLock unlock];
}
[phRequestLock unlock];
if (imageAsset == nil) {
// Error.