mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-11 17:00:02 +00:00
Reduce usage of autorelease pools (#968)
* Reduce reliance on the autorelease pool * changelog * A few more places * Use it in another place
This commit is contained in:
parent
a4dd19d808
commit
a11506564a
@ -6,6 +6,7 @@
|
|||||||
- Internal housekeeping on the async transaction (rendering) system. [Adlai Holler](https://github.com/Adlai-Holler)
|
- Internal housekeeping on the async transaction (rendering) system. [Adlai Holler](https://github.com/Adlai-Holler)
|
||||||
- Add new protocol `ASLocking` that extends `NSLocking` with `tryLock`, and allows taking multiple locks safely. [Adlai Holler](https://github.com/Adlai-Holler)
|
- Add new protocol `ASLocking` that extends `NSLocking` with `tryLock`, and allows taking multiple locks safely. [Adlai Holler](https://github.com/Adlai-Holler)
|
||||||
- Make the main thread ivar deallocation system available to other classes. Plus a little optimization. See `ASMainThreadDeallocation.h`. [Adlai Holler](https://github.com/Adlai-Holler) [#959](https://github.com/TextureGroup/Texture/pull/959)
|
- Make the main thread ivar deallocation system available to other classes. Plus a little optimization. See `ASMainThreadDeallocation.h`. [Adlai Holler](https://github.com/Adlai-Holler) [#959](https://github.com/TextureGroup/Texture/pull/959)
|
||||||
|
- Reduce usage of autorelease pools. [Adlai Holler](https://github.com/Adlai-Holler) [#968](https://github.com/TextureGroup/Texture/pull/968)
|
||||||
|
|
||||||
## 2.7
|
## 2.7
|
||||||
- Fix pager node for interface coalescing. [Max Wang](https://github.com/wsdwsd0829) [#877](https://github.com/TextureGroup/Texture/pull/877)
|
- Fix pager node for interface coalescing. [Max Wang](https://github.com/wsdwsd0829) [#877](https://github.com/TextureGroup/Texture/pull/877)
|
||||||
|
|||||||
@ -303,7 +303,7 @@ static NSString * const kReuseIdentifier = @"_ASCollectionReuseIdentifier";
|
|||||||
_proxyDataSource = [[ASCollectionViewProxy alloc] initWithTarget:nil interceptor:self];
|
_proxyDataSource = [[ASCollectionViewProxy alloc] initWithTarget:nil interceptor:self];
|
||||||
super.dataSource = (id<UICollectionViewDataSource>)_proxyDataSource;
|
super.dataSource = (id<UICollectionViewDataSource>)_proxyDataSource;
|
||||||
|
|
||||||
_registeredSupplementaryKinds = [NSMutableSet set];
|
_registeredSupplementaryKinds = [[NSMutableSet alloc] init];
|
||||||
_visibleElements = [[NSCountedSet alloc] init];
|
_visibleElements = [[NSCountedSet alloc] init];
|
||||||
|
|
||||||
_cellsForVisibilityUpdates = [NSHashTable hashTableWithOptions:NSHashTableObjectPointerPersonality];
|
_cellsForVisibilityUpdates = [NSHashTable hashTableWithOptions:NSHashTableObjectPointerPersonality];
|
||||||
@ -1729,7 +1729,7 @@ static NSString * const kReuseIdentifier = @"_ASCollectionReuseIdentifier";
|
|||||||
NSArray<ASCellNode *> *nodes = [_cellsForLayoutUpdates allObjects];
|
NSArray<ASCellNode *> *nodes = [_cellsForLayoutUpdates allObjects];
|
||||||
[_cellsForLayoutUpdates removeAllObjects];
|
[_cellsForLayoutUpdates removeAllObjects];
|
||||||
|
|
||||||
NSMutableArray<ASCellNode *> *nodesSizeChanged = [NSMutableArray array];
|
NSMutableArray<ASCellNode *> *nodesSizeChanged = [[NSMutableArray alloc] init];
|
||||||
|
|
||||||
[_dataController relayoutNodes:nodes nodesSizeChanged:nodesSizeChanged];
|
[_dataController relayoutNodes:nodes nodesSizeChanged:nodesSizeChanged];
|
||||||
[self nodesDidRelayout:nodesSizeChanged];
|
[self nodesDidRelayout:nodesSizeChanged];
|
||||||
@ -2005,7 +2005,7 @@ static NSString * const kReuseIdentifier = @"_ASCollectionReuseIdentifier";
|
|||||||
- (NSArray<NSString *> *)dataController:(ASDataController *)dataController supplementaryNodeKindsInSections:(NSIndexSet *)sections
|
- (NSArray<NSString *> *)dataController:(ASDataController *)dataController supplementaryNodeKindsInSections:(NSIndexSet *)sections
|
||||||
{
|
{
|
||||||
if (_asyncDataSourceFlags.collectionNodeSupplementaryElementKindsInSection) {
|
if (_asyncDataSourceFlags.collectionNodeSupplementaryElementKindsInSection) {
|
||||||
NSMutableSet *kinds = [NSMutableSet set];
|
auto kinds = [[NSMutableSet<NSString *> alloc] init];
|
||||||
GET_COLLECTIONNODE_OR_RETURN(collectionNode, @[]);
|
GET_COLLECTIONNODE_OR_RETURN(collectionNode, @[]);
|
||||||
[sections enumerateIndexesUsingBlock:^(NSUInteger section, BOOL * _Nonnull stop) {
|
[sections enumerateIndexesUsingBlock:^(NSUInteger section, BOOL * _Nonnull stop) {
|
||||||
NSArray<NSString *> *kindsForSection = [_asyncDataSource collectionNode:collectionNode supplementaryElementKindsInSection:section];
|
NSArray<NSString *> *kindsForSection = [_asyncDataSource collectionNode:collectionNode supplementaryElementKindsInSection:section];
|
||||||
|
|||||||
@ -767,10 +767,10 @@ ASLayoutElementStyleExtensibilityForwarding
|
|||||||
|
|
||||||
NSArray<ASDisplayNode *> *removedSubnodes = [context removedSubnodes];
|
NSArray<ASDisplayNode *> *removedSubnodes = [context removedSubnodes];
|
||||||
NSMutableArray<ASDisplayNode *> *insertedSubnodes = [[context insertedSubnodes] mutableCopy];
|
NSMutableArray<ASDisplayNode *> *insertedSubnodes = [[context insertedSubnodes] mutableCopy];
|
||||||
NSMutableArray<ASDisplayNode *> *movedSubnodes = [NSMutableArray array];
|
auto movedSubnodes = [[NSMutableArray<ASDisplayNode *> alloc] init];
|
||||||
|
|
||||||
NSMutableArray<_ASAnimatedTransitionContext *> *insertedSubnodeContexts = [NSMutableArray array];
|
auto insertedSubnodeContexts = [[NSMutableArray<_ASAnimatedTransitionContext *> alloc] init];
|
||||||
NSMutableArray<_ASAnimatedTransitionContext *> *removedSubnodeContexts = [NSMutableArray array];
|
auto removedSubnodeContexts = [[NSMutableArray<_ASAnimatedTransitionContext *> alloc] init];
|
||||||
|
|
||||||
for (ASDisplayNode *subnode in [context subnodesForKey:ASTransitionContextToLayoutKey]) {
|
for (ASDisplayNode *subnode in [context subnodesForKey:ASTransitionContextToLayoutKey]) {
|
||||||
if ([insertedSubnodes containsObject:subnode] == NO) {
|
if ([insertedSubnodes containsObject:subnode] == NO) {
|
||||||
|
|||||||
@ -80,7 +80,7 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (_yogaChildren == nil) {
|
if (_yogaChildren == nil) {
|
||||||
_yogaChildren = [NSMutableArray array];
|
_yogaChildren = [[NSMutableArray alloc] init];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up state in case this child had another parent.
|
// Clean up state in case this child had another parent.
|
||||||
|
|||||||
@ -178,7 +178,7 @@ static void _ASCollectDisplayNodes(NSMutableArray *array, CALayer *layer)
|
|||||||
|
|
||||||
extern NSArray<ASDisplayNode *> *ASCollectDisplayNodes(ASDisplayNode *node)
|
extern NSArray<ASDisplayNode *> *ASCollectDisplayNodes(ASDisplayNode *node)
|
||||||
{
|
{
|
||||||
NSMutableArray *list = [NSMutableArray array];
|
NSMutableArray *list = [[NSMutableArray alloc] init];
|
||||||
for (CALayer *sublayer in node.layer.sublayers) {
|
for (CALayer *sublayer in node.layer.sublayers) {
|
||||||
_ASCollectDisplayNodes(list, sublayer);
|
_ASCollectDisplayNodes(list, sublayer);
|
||||||
}
|
}
|
||||||
@ -203,7 +203,7 @@ static void _ASDisplayNodeFindAllSubnodes(NSMutableArray *array, ASDisplayNode *
|
|||||||
|
|
||||||
extern NSArray<ASDisplayNode *> *ASDisplayNodeFindAllSubnodes(ASDisplayNode *start, BOOL (^block)(ASDisplayNode *node))
|
extern NSArray<ASDisplayNode *> *ASDisplayNodeFindAllSubnodes(ASDisplayNode *start, BOOL (^block)(ASDisplayNode *node))
|
||||||
{
|
{
|
||||||
NSMutableArray *list = [NSMutableArray array];
|
NSMutableArray *list = [[NSMutableArray alloc] init];
|
||||||
_ASDisplayNodeFindAllSubnodes(list, start, block);
|
_ASDisplayNodeFindAllSubnodes(list, start, block);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -629,20 +629,20 @@
|
|||||||
} else {
|
} else {
|
||||||
// First try to load the path directly, for efficiency assuming a developer who
|
// First try to load the path directly, for efficiency assuming a developer who
|
||||||
// doesn't want caching is trying to be as minimal as possible.
|
// doesn't want caching is trying to be as minimal as possible.
|
||||||
UIImage *nonAnimatedImage = [UIImage imageWithContentsOfFile:URL.path];
|
auto nonAnimatedImage = [[UIImage alloc] initWithContentsOfFile:URL.path];
|
||||||
if (nonAnimatedImage == nil) {
|
if (nonAnimatedImage == nil) {
|
||||||
// If we couldn't find it, execute an -imageNamed:-like search so we can find resources even if the
|
// If we couldn't find it, execute an -imageNamed:-like search so we can find resources even if the
|
||||||
// extension is not provided in the path. This allows the same path to work regardless of shouldCacheImage.
|
// extension is not provided in the path. This allows the same path to work regardless of shouldCacheImage.
|
||||||
NSString *filename = [[NSBundle mainBundle] pathForResource:URL.path.lastPathComponent ofType:nil];
|
NSString *filename = [[NSBundle mainBundle] pathForResource:URL.path.lastPathComponent ofType:nil];
|
||||||
if (filename != nil) {
|
if (filename != nil) {
|
||||||
nonAnimatedImage = [UIImage imageWithContentsOfFile:filename];
|
nonAnimatedImage = [[UIImage alloc] initWithContentsOfFile:filename];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the file may be an animated gif and then created an animated image.
|
// If the file may be an animated gif and then created an animated image.
|
||||||
id<ASAnimatedImageProtocol> animatedImage = nil;
|
id<ASAnimatedImageProtocol> animatedImage = nil;
|
||||||
if (_downloaderFlags.downloaderImplementsAnimatedImage) {
|
if (_downloaderFlags.downloaderImplementsAnimatedImage) {
|
||||||
NSData *data = [NSData dataWithContentsOfURL:URL];
|
auto data = [[NSData alloc] initWithContentsOfURL:URL];
|
||||||
if (data != nil) {
|
if (data != nil) {
|
||||||
animatedImage = [_downloader animatedImageWithData:data];
|
animatedImage = [_downloader animatedImageWithData:data];
|
||||||
|
|
||||||
|
|||||||
@ -238,14 +238,12 @@ static void runLoopSourceCallback(void *info) {
|
|||||||
|
|
||||||
- (void)drain
|
- (void)drain
|
||||||
{
|
{
|
||||||
@autoreleasepool {
|
_lock.lock();
|
||||||
_lock.lock();
|
auto q = std::move(_queue);
|
||||||
auto q = std::move(_queue);
|
_lock.unlock();
|
||||||
_lock.unlock();
|
for (auto ref : q) {
|
||||||
for (auto ref : q) {
|
// NOTE: Could check that retain count is 1 and retry later if not.
|
||||||
// NOTE: Could check that retain count is 1 and retry later if not.
|
CFRelease(ref);
|
||||||
CFRelease(ref);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -758,7 +758,7 @@ static NSString * const kCellReuseIdentifier = @"_ASTableViewCell";
|
|||||||
NSArray<ASCellNode *> *nodes = [_cellsForLayoutUpdates allObjects];
|
NSArray<ASCellNode *> *nodes = [_cellsForLayoutUpdates allObjects];
|
||||||
[_cellsForLayoutUpdates removeAllObjects];
|
[_cellsForLayoutUpdates removeAllObjects];
|
||||||
|
|
||||||
NSMutableArray<ASCellNode *> *nodesSizeChanged = [NSMutableArray array];
|
auto nodesSizeChanged = [[NSMutableArray<ASCellNode *> alloc] init];
|
||||||
[_dataController relayoutNodes:nodes nodesSizeChanged:nodesSizeChanged];
|
[_dataController relayoutNodes:nodes nodesSizeChanged:nodesSizeChanged];
|
||||||
if (nodesSizeChanged.count > 0) {
|
if (nodesSizeChanged.count > 0) {
|
||||||
[self requeryNodeHeights];
|
[self requeryNodeHeights];
|
||||||
|
|||||||
@ -854,7 +854,7 @@ static CGRect ASTextNodeAdjustRenderRectForShadowPadding(CGRect rendererRect, UI
|
|||||||
ASLockScopeSelf();
|
ASLockScopeSelf();
|
||||||
|
|
||||||
NSArray *rects = [[self _locked_renderer] rectsForTextRange:textRange measureOption:measureOption];
|
NSArray *rects = [[self _locked_renderer] rectsForTextRange:textRange measureOption:measureOption];
|
||||||
NSMutableArray *adjustedRects = [NSMutableArray array];
|
auto adjustedRects = [[NSMutableArray<NSValue *> alloc] init];
|
||||||
|
|
||||||
for (NSValue *rectValue in rects) {
|
for (NSValue *rectValue in rects) {
|
||||||
CGRect rect = [rectValue CGRectValue];
|
CGRect rect = [rectValue CGRectValue];
|
||||||
|
|||||||
@ -259,7 +259,7 @@
|
|||||||
* Create a new set by mapping `collection` over `work`, ignoring nil.
|
* Create a new set by mapping `collection` over `work`, ignoring nil.
|
||||||
*/
|
*/
|
||||||
#define ASSetByFlatMapping(collection, decl, work) ({ \
|
#define ASSetByFlatMapping(collection, decl, work) ({ \
|
||||||
NSMutableSet *s = [NSMutableSet set]; \
|
NSMutableSet *s = [[NSMutableSet alloc] init]; \
|
||||||
for (decl in collection) {\
|
for (decl in collection) {\
|
||||||
id result = work; \
|
id result = work; \
|
||||||
if (result != nil) { \
|
if (result != nil) { \
|
||||||
@ -271,9 +271,11 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new ObjectPointerPersonality NSHashTable by mapping `collection` over `work`, ignoring nil.
|
* Create a new ObjectPointerPersonality NSHashTable by mapping `collection` over `work`, ignoring nil.
|
||||||
|
*
|
||||||
|
* capacity: 0 is taken from +hashTableWithOptions.
|
||||||
*/
|
*/
|
||||||
#define ASPointerTableByFlatMapping(collection, decl, work) ({ \
|
#define ASPointerTableByFlatMapping(collection, decl, work) ({ \
|
||||||
NSHashTable *t = [NSHashTable hashTableWithOptions:NSHashTableObjectPointerPersonality]; \
|
NSHashTable *t = [[NSHashTable alloc] initWithOptions:NSHashTableObjectPointerPersonality capacity:0]; \
|
||||||
for (decl in collection) {\
|
for (decl in collection) {\
|
||||||
id result = work; \
|
id result = work; \
|
||||||
if (result != nil) { \
|
if (result != nil) { \
|
||||||
@ -287,7 +289,7 @@
|
|||||||
* Create a new array by mapping `collection` over `work`, ignoring nil.
|
* Create a new array by mapping `collection` over `work`, ignoring nil.
|
||||||
*/
|
*/
|
||||||
#define ASArrayByFlatMapping(collection, decl, work) ({ \
|
#define ASArrayByFlatMapping(collection, decl, work) ({ \
|
||||||
NSMutableArray *a = [NSMutableArray array]; \
|
NSMutableArray *a = [[NSMutableArray alloc] init]; \
|
||||||
for (decl in collection) {\
|
for (decl in collection) {\
|
||||||
id result = work; \
|
id result = work; \
|
||||||
if (result != nil) { \
|
if (result != nil) { \
|
||||||
|
|||||||
@ -245,7 +245,7 @@ static const char *kContextKey = NSStringFromClass(ASBasicImageDownloaderContext
|
|||||||
// cause significant performance issues.
|
// cause significant performance issues.
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||||
// associate metadata with it
|
// associate metadata with it
|
||||||
NSMutableDictionary *callbackData = [NSMutableDictionary dictionary];
|
NSMutableDictionary *callbackData = [[NSMutableDictionary alloc] init];
|
||||||
callbackData[kASBasicImageDownloaderContextCallbackQueue] = callbackQueue ? : dispatch_get_main_queue();
|
callbackData[kASBasicImageDownloaderContextCallbackQueue] = callbackQueue ? : dispatch_get_main_queue();
|
||||||
|
|
||||||
if (downloadProgress) {
|
if (downloadProgress) {
|
||||||
|
|||||||
@ -159,7 +159,7 @@ elementToLayoutAttributesTable:[NSMapTable elementToLayoutAttributesTable]];
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use a set here because some items may span multiple pages
|
// Use a set here because some items may span multiple pages
|
||||||
NSMutableSet<UICollectionViewLayoutAttributes *> *result = [NSMutableSet set];
|
auto result = [[NSMutableSet<UICollectionViewLayoutAttributes *> alloc] init];
|
||||||
for (id pagePtr in pages) {
|
for (id pagePtr in pages) {
|
||||||
ASPageCoordinate page = (ASPageCoordinate)pagePtr;
|
ASPageCoordinate page = (ASPageCoordinate)pagePtr;
|
||||||
NSArray<UICollectionViewLayoutAttributes *> *allAttrs = [_pageToLayoutAttributesTable objectForPage:page];
|
NSArray<UICollectionViewLayoutAttributes *> *allAttrs = [_pageToLayoutAttributesTable objectForPage:page];
|
||||||
@ -216,7 +216,7 @@ elementToLayoutAttributesTable:[NSMapTable elementToLayoutAttributesTable]];
|
|||||||
for (UICollectionViewLayoutAttributes *attrs in attrsInPage) {
|
for (UICollectionViewLayoutAttributes *attrs in attrsInPage) {
|
||||||
if (CGRectIntersectsRect(rect, attrs.frame)) {
|
if (CGRectIntersectsRect(rect, attrs.frame)) {
|
||||||
if (intersectingAttrsInPage == nil) {
|
if (intersectingAttrsInPage == nil) {
|
||||||
intersectingAttrsInPage = [NSMutableArray array];
|
intersectingAttrsInPage = [[NSMutableArray alloc] init];
|
||||||
}
|
}
|
||||||
[intersectingAttrsInPage addObject:attrs];
|
[intersectingAttrsInPage addObject:attrs];
|
||||||
}
|
}
|
||||||
@ -245,7 +245,7 @@ elementToLayoutAttributesTable:[NSMapTable elementToLayoutAttributesTable]];
|
|||||||
contentSize:(CGSize)contentSize
|
contentSize:(CGSize)contentSize
|
||||||
pageSize:(CGSize)pageSize
|
pageSize:(CGSize)pageSize
|
||||||
{
|
{
|
||||||
NSMutableArray<UICollectionViewLayoutAttributes *> *unmeasuredAttrs = [NSMutableArray array];
|
NSMutableArray<UICollectionViewLayoutAttributes *> *unmeasuredAttrs = [[NSMutableArray alloc] init];
|
||||||
for (ASCollectionElement *element in table) {
|
for (ASCollectionElement *element in table) {
|
||||||
UICollectionViewLayoutAttributes *attrs = [table objectForKey:element];
|
UICollectionViewLayoutAttributes *attrs = [table objectForKey:element];
|
||||||
if (element.nodeIfAllocated == nil || CGSizeEqualToSize(element.nodeIfAllocated.calculatedSize, attrs.frame.size) == NO) {
|
if (element.nodeIfAllocated == nil || CGSizeEqualToSize(element.nodeIfAllocated.calculatedSize, attrs.frame.size) == NO) {
|
||||||
|
|||||||
@ -123,7 +123,7 @@ typedef void (^ASDataControllerSynchronizationBlock)();
|
|||||||
_mainSerialQueue = [[ASMainSerialQueue alloc] init];
|
_mainSerialQueue = [[ASMainSerialQueue alloc] init];
|
||||||
|
|
||||||
_synchronized = YES;
|
_synchronized = YES;
|
||||||
_onDidFinishSynchronizingBlocks = [NSMutableSet set];
|
_onDidFinishSynchronizingBlocks = [[NSMutableSet alloc] init];
|
||||||
|
|
||||||
const char *queueName = [[NSString stringWithFormat:@"org.AsyncDisplayKit.ASDataController.editingTransactionQueue:%p", self] cStringUsingEncoding:NSASCIIStringEncoding];
|
const char *queueName = [[NSString stringWithFormat:@"org.AsyncDisplayKit.ASDataController.editingTransactionQueue:%p", self] cStringUsingEncoding:NSASCIIStringEncoding];
|
||||||
_editingTransactionQueue = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
|
_editingTransactionQueue = dispatch_queue_create(queueName, DISPATCH_QUEUE_SERIAL);
|
||||||
@ -214,7 +214,7 @@ typedef void (^ASDataControllerSynchronizationBlock)();
|
|||||||
return @[];
|
return @[];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSMutableArray<NSIndexPath *> *indexPaths = [NSMutableArray array];
|
auto indexPaths = [[NSMutableArray<NSIndexPath *> alloc] init];
|
||||||
if ([kind isEqualToString:ASDataControllerRowNodeKind]) {
|
if ([kind isEqualToString:ASDataControllerRowNodeKind]) {
|
||||||
std::vector<NSInteger> counts = [self itemCountsFromDataSource];
|
std::vector<NSInteger> counts = [self itemCountsFromDataSource];
|
||||||
[sections enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) {
|
[sections enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) {
|
||||||
@ -671,7 +671,7 @@ typedef void (^ASDataControllerSynchronizationBlock)();
|
|||||||
[layoutDelegateClass calculateLayoutWithContext:layoutContext];
|
[layoutDelegateClass calculateLayoutWithContext:layoutContext];
|
||||||
completion();
|
completion();
|
||||||
} else {
|
} else {
|
||||||
NSMutableArray<ASCollectionElement *> *elementsToProcess = [NSMutableArray array];
|
auto elementsToProcess = [[NSMutableArray<ASCollectionElement *> alloc] init];
|
||||||
for (ASCollectionElement *element in newMap) {
|
for (ASCollectionElement *element in newMap) {
|
||||||
ASCellNode *nodeIfAllocated = element.nodeIfAllocated;
|
ASCellNode *nodeIfAllocated = element.nodeIfAllocated;
|
||||||
if (nodeIfAllocated.shouldUseUIKitCell) {
|
if (nodeIfAllocated.shouldUseUIKitCell) {
|
||||||
|
|||||||
@ -121,7 +121,7 @@ extern NSPointerArray *ASPageCoordinatesForPagesThatIntersectRect(CGRect rect, C
|
|||||||
ASPageCoordinate page = (ASPageCoordinate)pagePtr;
|
ASPageCoordinate page = (ASPageCoordinate)pagePtr;
|
||||||
NSMutableArray<UICollectionViewLayoutAttributes *> *attrsInPage = [result objectForPage:page];
|
NSMutableArray<UICollectionViewLayoutAttributes *> *attrsInPage = [result objectForPage:page];
|
||||||
if (attrsInPage == nil) {
|
if (attrsInPage == nil) {
|
||||||
attrsInPage = [NSMutableArray array];
|
attrsInPage = [[NSMutableArray alloc] init];
|
||||||
[result setObject:attrsInPage forPage:page];
|
[result setObject:attrsInPage forPage:page];
|
||||||
}
|
}
|
||||||
[attrsInPage addObject:attrs];
|
[attrsInPage addObject:attrs];
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
if (insertions) {
|
if (insertions) {
|
||||||
NSArray *commonObjects = [self objectsAtIndexes:commonIndexes];
|
NSArray *commonObjects = [self objectsAtIndexes:commonIndexes];
|
||||||
NSMutableIndexSet *insertionIndexes = [NSMutableIndexSet indexSet];
|
NSMutableIndexSet *insertionIndexes = [[NSMutableIndexSet alloc] init];
|
||||||
for (NSInteger i = 0, j = 0; i < commonObjects.count || j < array.count;) {
|
for (NSInteger i = 0, j = 0; i < commonObjects.count || j < array.count;) {
|
||||||
if (i < commonObjects.count && j < array.count && comparison(commonObjects[i], array[j])) {
|
if (i < commonObjects.count && j < array.count && comparison(commonObjects[i], array[j])) {
|
||||||
i++; j++;
|
i++; j++;
|
||||||
@ -47,7 +47,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (deletions) {
|
if (deletions) {
|
||||||
NSMutableIndexSet *deletionIndexes = [NSMutableIndexSet indexSet];
|
NSMutableIndexSet *deletionIndexes = [[NSMutableIndexSet alloc] init];
|
||||||
for (NSInteger i = 0; i < self.count; i++) {
|
for (NSInteger i = 0; i < self.count; i++) {
|
||||||
if (![commonIndexes containsIndex:i]) {
|
if (![commonIndexes containsIndex:i]) {
|
||||||
[deletionIndexes addIndex:i];
|
[deletionIndexes addIndex:i];
|
||||||
@ -90,7 +90,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NSMutableIndexSet *common = [NSMutableIndexSet indexSet];
|
NSMutableIndexSet *common = [[NSMutableIndexSet alloc] init];
|
||||||
NSInteger i = selfCount, j = arrayCount;
|
NSInteger i = selfCount, j = arrayCount;
|
||||||
while(i > 0 && j > 0) {
|
while(i > 0 && j > 0) {
|
||||||
if (comparison(self[i-1], array[j-1])) {
|
if (comparison(self[i-1], array[j-1])) {
|
||||||
|
|||||||
@ -34,6 +34,4 @@
|
|||||||
/// Returns all the section indexes contained in the index paths array.
|
/// Returns all the section indexes contained in the index paths array.
|
||||||
+ (NSIndexSet *)as_sectionsFromIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
|
+ (NSIndexSet *)as_sectionsFromIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
|
||||||
|
|
||||||
- (NSArray<NSIndexPath *> *)as_filterIndexPathsBySection:(id<NSFastEnumeration>)indexPaths;
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
- (NSIndexSet *)as_indexesByMapping:(NSUInteger (^)(NSUInteger))block
|
- (NSIndexSet *)as_indexesByMapping:(NSUInteger (^)(NSUInteger))block
|
||||||
{
|
{
|
||||||
NSMutableIndexSet *result = [NSMutableIndexSet indexSet];
|
NSMutableIndexSet *result = [[NSMutableIndexSet alloc] init];
|
||||||
[self enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) {
|
[self enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) {
|
||||||
for (NSUInteger i = range.location; i < NSMaxRange(range); i++) {
|
for (NSUInteger i = range.location; i < NSMaxRange(range); i++) {
|
||||||
NSUInteger newIndex = block(i);
|
NSUInteger newIndex = block(i);
|
||||||
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
- (NSIndexSet *)as_intersectionWithIndexes:(NSIndexSet *)indexes
|
- (NSIndexSet *)as_intersectionWithIndexes:(NSIndexSet *)indexes
|
||||||
{
|
{
|
||||||
NSMutableIndexSet *result = [NSMutableIndexSet indexSet];
|
NSMutableIndexSet *result = [[NSMutableIndexSet alloc] init];
|
||||||
[self enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) {
|
[self enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) {
|
||||||
[indexes enumerateRangesInRange:range options:kNilOptions usingBlock:^(NSRange range, BOOL * _Nonnull stop) {
|
[indexes enumerateRangesInRange:range options:kNilOptions usingBlock:^(NSRange range, BOOL * _Nonnull stop) {
|
||||||
[result addIndexesInRange:range];
|
[result addIndexesInRange:range];
|
||||||
@ -49,7 +49,7 @@
|
|||||||
|
|
||||||
+ (NSIndexSet *)as_indexSetFromIndexPaths:(NSArray<NSIndexPath *> *)indexPaths inSection:(NSUInteger)section
|
+ (NSIndexSet *)as_indexSetFromIndexPaths:(NSArray<NSIndexPath *> *)indexPaths inSection:(NSUInteger)section
|
||||||
{
|
{
|
||||||
NSMutableIndexSet *result = [NSMutableIndexSet indexSet];
|
NSMutableIndexSet *result = [[NSMutableIndexSet alloc] init];
|
||||||
for (NSIndexPath *indexPath in indexPaths) {
|
for (NSIndexPath *indexPath in indexPaths) {
|
||||||
if (indexPath.section == section) {
|
if (indexPath.section == section) {
|
||||||
[result addIndex:indexPath.item];
|
[result addIndex:indexPath.item];
|
||||||
@ -89,22 +89,11 @@
|
|||||||
|
|
||||||
+ (NSIndexSet *)as_sectionsFromIndexPaths:(NSArray<NSIndexPath *> *)indexPaths
|
+ (NSIndexSet *)as_sectionsFromIndexPaths:(NSArray<NSIndexPath *> *)indexPaths
|
||||||
{
|
{
|
||||||
NSMutableIndexSet *result = [NSMutableIndexSet indexSet];
|
NSMutableIndexSet *result = [[NSMutableIndexSet alloc] init];
|
||||||
for (NSIndexPath *indexPath in indexPaths) {
|
for (NSIndexPath *indexPath in indexPaths) {
|
||||||
[result addIndex:indexPath.section];
|
[result addIndex:indexPath.section];
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSArray<NSIndexPath *> *)as_filterIndexPathsBySection:(id<NSFastEnumeration>)indexPaths
|
|
||||||
{
|
|
||||||
NSMutableArray *result = [NSMutableArray array];
|
|
||||||
for (NSIndexPath *indexPath in indexPaths) {
|
|
||||||
if ([self containsIndex:indexPath.section]) {
|
|
||||||
[result addObject:indexPath];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -142,8 +142,8 @@ static void CollectUIAccessibilityElementsForNode(ASDisplayNode *node, ASDisplay
|
|||||||
static void CollectAccessibilityElementsForContainer(ASDisplayNode *container, _ASDisplayView *view, NSMutableArray *elements) {
|
static void CollectAccessibilityElementsForContainer(ASDisplayNode *container, _ASDisplayView *view, NSMutableArray *elements) {
|
||||||
UIAccessibilityElement *accessiblityElement = [ASAccessibilityElement accessibilityElementWithContainer:view node:container containerNode:container];
|
UIAccessibilityElement *accessiblityElement = [ASAccessibilityElement accessibilityElementWithContainer:view node:container containerNode:container];
|
||||||
|
|
||||||
NSMutableArray<ASAccessibilityElement *> *labeledNodes = [NSMutableArray array];
|
NSMutableArray<ASAccessibilityElement *> *labeledNodes = [[NSMutableArray alloc] init];
|
||||||
NSMutableArray<ASAccessibilityCustomAction *> *actions = [NSMutableArray array];
|
NSMutableArray<ASAccessibilityCustomAction *> *actions = [[NSMutableArray alloc] init];
|
||||||
std::queue<ASDisplayNode *> queue;
|
std::queue<ASDisplayNode *> queue;
|
||||||
queue.push(container);
|
queue.push(container);
|
||||||
|
|
||||||
@ -268,7 +268,7 @@ static void CollectAccessibilityElementsForView(_ASDisplayView *view, NSMutableA
|
|||||||
return _accessibleElements;
|
return _accessibleElements;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSMutableArray *accessibleElements = [NSMutableArray array];
|
NSMutableArray *accessibleElements = [[NSMutableArray alloc] init];
|
||||||
CollectAccessibilityElementsForView(self, accessibleElements);
|
CollectAccessibilityElementsForView(self, accessibleElements);
|
||||||
SortAccessibilityElements(accessibleElements);
|
SortAccessibilityElements(accessibleElements);
|
||||||
_accessibleElements = accessibleElements;
|
_accessibleElements = accessibleElements;
|
||||||
|
|||||||
@ -236,10 +236,10 @@ static std::atomic_bool static_retainsSublayoutLayoutElements = ATOMIC_VAR_INIT(
|
|||||||
queue.push_back({sublayout, sublayout.position});
|
queue.push_back({sublayout, sublayout.position});
|
||||||
}
|
}
|
||||||
|
|
||||||
NSMutableArray *flattenedSublayouts = [NSMutableArray array];
|
NSMutableArray *flattenedSublayouts = [[NSMutableArray alloc] init];
|
||||||
|
|
||||||
while (!queue.empty()) {
|
while (!queue.empty()) {
|
||||||
const Context context = queue.front();
|
const Context context = std::move(queue.front());
|
||||||
queue.pop_front();
|
queue.pop_front();
|
||||||
|
|
||||||
ASLayout *layout = context.layout;
|
ASLayout *layout = context.layout;
|
||||||
|
|||||||
@ -160,7 +160,7 @@
|
|||||||
self.style.descender = stackChildren.back().style.descender;
|
self.style.descender = stackChildren.back().style.descender;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSMutableArray *sublayouts = [NSMutableArray array];
|
auto sublayouts = [[NSMutableArray<ASLayout *> alloc] init];
|
||||||
for (const auto &item : positionedLayout.items) {
|
for (const auto &item : positionedLayout.items) {
|
||||||
[sublayouts addObject:item.layout];
|
[sublayouts addObject:item.layout];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -208,7 +208,7 @@
|
|||||||
|
|
||||||
if (shouldBeginRasterizing) {
|
if (shouldBeginRasterizing) {
|
||||||
// Collect displayBlocks for all descendants.
|
// Collect displayBlocks for all descendants.
|
||||||
NSMutableArray *displayBlocks = [NSMutableArray array];
|
NSMutableArray *displayBlocks = [[NSMutableArray alloc] init];
|
||||||
[self _recursivelyRasterizeSelfAndSublayersWithIsCancelledBlock:isCancelledBlock displayBlocks:displayBlocks];
|
[self _recursivelyRasterizeSelfAndSublayersWithIsCancelledBlock:isCancelledBlock displayBlocks:displayBlocks];
|
||||||
CHECK_CANCELLED_AND_RETURN_NIL();
|
CHECK_CANCELLED_AND_RETURN_NIL();
|
||||||
|
|
||||||
|
|||||||
@ -87,7 +87,7 @@ typedef NSMutableDictionary<NSString *, NSMutableDictionary<NSIndexPath *, ASCol
|
|||||||
- (void)insertEmptySectionsOfItemsAtIndexes:(NSIndexSet *)sections
|
- (void)insertEmptySectionsOfItemsAtIndexes:(NSIndexSet *)sections
|
||||||
{
|
{
|
||||||
[sections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
|
[sections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
|
||||||
[_sectionsOfItems insertObject:[NSMutableArray array] atIndex:idx];
|
[_sectionsOfItems insertObject:[[NSMutableArray alloc] init] atIndex:idx];
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ typedef NSMutableDictionary<NSString *, NSMutableDictionary<NSIndexPath *, ASCol
|
|||||||
} else {
|
} else {
|
||||||
NSMutableDictionary *supplementariesForKind = _supplementaryElements[kind];
|
NSMutableDictionary *supplementariesForKind = _supplementaryElements[kind];
|
||||||
if (supplementariesForKind == nil) {
|
if (supplementariesForKind == nil) {
|
||||||
supplementariesForKind = [NSMutableDictionary dictionary];
|
supplementariesForKind = [[NSMutableDictionary alloc] init];
|
||||||
_supplementaryElements[kind] = supplementariesForKind;
|
_supplementaryElements[kind] = supplementariesForKind;
|
||||||
}
|
}
|
||||||
supplementariesForKind[indexPath] = element;
|
supplementariesForKind[indexPath] = element;
|
||||||
@ -120,7 +120,7 @@ typedef NSMutableDictionary<NSString *, NSMutableDictionary<NSIndexPath *, ASCol
|
|||||||
// Note: it's tempting to update the dictionary in-place but because of the likely collision between old and new index paths,
|
// Note: it's tempting to update the dictionary in-place but because of the likely collision between old and new index paths,
|
||||||
// subtle bugs are possible. Note that this process is rare (only on section-level updates),
|
// subtle bugs are possible. Note that this process is rare (only on section-level updates),
|
||||||
// that this work is done off-main, and that the typical supplementary element use case is just 1-per-section (header).
|
// that this work is done off-main, and that the typical supplementary element use case is just 1-per-section (header).
|
||||||
NSMutableDictionary *newSupps = [NSMutableDictionary dictionary];
|
NSMutableDictionary *newSupps = [[NSMutableDictionary alloc] init];
|
||||||
[supps enumerateKeysAndObjectsUsingBlock:^(NSIndexPath * _Nonnull oldIndexPath, ASCollectionElement * _Nonnull obj, BOOL * _Nonnull stop) {
|
[supps enumerateKeysAndObjectsUsingBlock:^(NSIndexPath * _Nonnull oldIndexPath, ASCollectionElement * _Nonnull obj, BOOL * _Nonnull stop) {
|
||||||
NSInteger oldSection = oldIndexPath.section;
|
NSInteger oldSection = oldIndexPath.section;
|
||||||
NSInteger newSection = [mapping integerForKey:oldSection];
|
NSInteger newSection = [mapping integerForKey:oldSection];
|
||||||
|
|||||||
@ -71,7 +71,7 @@ void ASDeleteElementsInTwoDimensionalArrayAtIndexPaths(NSMutableArray *mutableAr
|
|||||||
|
|
||||||
NSArray<NSIndexPath *> *ASIndexPathsForTwoDimensionalArray(NSArray <NSArray *>* twoDimensionalArray)
|
NSArray<NSIndexPath *> *ASIndexPathsForTwoDimensionalArray(NSArray <NSArray *>* twoDimensionalArray)
|
||||||
{
|
{
|
||||||
NSMutableArray *result = [NSMutableArray array];
|
NSMutableArray *result = [[NSMutableArray alloc] init];
|
||||||
NSInteger section = 0;
|
NSInteger section = 0;
|
||||||
NSInteger i = 0;
|
NSInteger i = 0;
|
||||||
for (NSArray *subarray in twoDimensionalArray) {
|
for (NSArray *subarray in twoDimensionalArray) {
|
||||||
@ -87,7 +87,7 @@ NSArray<NSIndexPath *> *ASIndexPathsForTwoDimensionalArray(NSArray <NSArray *>*
|
|||||||
|
|
||||||
NSArray *ASElementsInTwoDimensionalArray(NSArray <NSArray *>* twoDimensionalArray)
|
NSArray *ASElementsInTwoDimensionalArray(NSArray <NSArray *>* twoDimensionalArray)
|
||||||
{
|
{
|
||||||
NSMutableArray *result = [NSMutableArray array];
|
NSMutableArray *result = [[NSMutableArray alloc] init];
|
||||||
NSInteger i = 0;
|
NSInteger i = 0;
|
||||||
for (NSArray *subarray in twoDimensionalArray) {
|
for (NSArray *subarray in twoDimensionalArray) {
|
||||||
ASDisplayNodeCAssert([subarray isKindOfClass:[NSArray class]], @"This function expects NSArray<NSArray *> *");
|
ASDisplayNodeCAssert([subarray isKindOfClass:[NSArray class]], @"This function expects NSArray<NSArray *> *");
|
||||||
|
|||||||
@ -473,7 +473,7 @@ dispatch_semaphore_signal(_lock);
|
|||||||
if (!cgPath) FAIL_AND_RETURN
|
if (!cgPath) FAIL_AND_RETURN
|
||||||
|
|
||||||
// frame setter config
|
// frame setter config
|
||||||
frameAttrs = [NSMutableDictionary dictionary];
|
frameAttrs = [[NSMutableDictionary alloc] init];
|
||||||
if (container.isPathFillEvenOdd == NO) {
|
if (container.isPathFillEvenOdd == NO) {
|
||||||
frameAttrs[(id)kCTFramePathFillRuleAttributeName] = @(kCTFramePathFillWindingNumber);
|
frameAttrs[(id)kCTFramePathFillRuleAttributeName] = @(kCTFramePathFillWindingNumber);
|
||||||
}
|
}
|
||||||
@ -886,7 +886,7 @@ dispatch_semaphore_signal(_lock);
|
|||||||
+ (NSArray *)layoutWithContainers:(NSArray *)containers text:(NSAttributedString *)text range:(NSRange)range {
|
+ (NSArray *)layoutWithContainers:(NSArray *)containers text:(NSAttributedString *)text range:(NSRange)range {
|
||||||
if (!containers || !text) return nil;
|
if (!containers || !text) return nil;
|
||||||
if (range.location + range.length > text.length) return nil;
|
if (range.location + range.length > text.length) return nil;
|
||||||
NSMutableArray *layouts = [NSMutableArray array];
|
NSMutableArray *layouts = [[NSMutableArray alloc] init];
|
||||||
for (NSUInteger i = 0, max = containers.count; i < max; i++) {
|
for (NSUInteger i = 0, max = containers.count; i < max; i++) {
|
||||||
ASTextContainer *container = containers[i];
|
ASTextContainer *container = containers[i];
|
||||||
ASTextLayout *layout = [self layoutWithContainer:container text:text range:range];
|
ASTextLayout *layout = [self layoutWithContainer:container text:text range:range];
|
||||||
@ -1959,7 +1959,7 @@ dispatch_semaphore_signal(_lock);
|
|||||||
range = [self _correctedRangeWithEdge:range];
|
range = [self _correctedRangeWithEdge:range];
|
||||||
|
|
||||||
BOOL isVertical = _container.verticalForm;
|
BOOL isVertical = _container.verticalForm;
|
||||||
NSMutableArray *rects = [NSMutableArray array];
|
NSMutableArray *rects = [[NSMutableArray<NSValue *> alloc] init];
|
||||||
if (!range) return rects;
|
if (!range) return rects;
|
||||||
|
|
||||||
NSUInteger startLineIndex = [self lineIndexForPosition:range.start];
|
NSUInteger startLineIndex = [self lineIndexForPosition:range.start];
|
||||||
|
|||||||
@ -237,7 +237,7 @@ NSString *NSStringFromASHierarchyChangeType(_ASHierarchyChangeType changeType)
|
|||||||
- (NSIndexSet *)indexesForItemChangesOfType:(_ASHierarchyChangeType)changeType inSection:(NSUInteger)section
|
- (NSIndexSet *)indexesForItemChangesOfType:(_ASHierarchyChangeType)changeType inSection:(NSUInteger)section
|
||||||
{
|
{
|
||||||
[self _ensureCompleted];
|
[self _ensureCompleted];
|
||||||
NSMutableIndexSet *result = [NSMutableIndexSet indexSet];
|
auto result = [[NSMutableIndexSet alloc] init];
|
||||||
for (_ASHierarchyItemChange *change in [self itemChangesOfType:changeType]) {
|
for (_ASHierarchyItemChange *change in [self itemChangesOfType:changeType]) {
|
||||||
[result addIndexes:[NSIndexSet as_indexSetFromIndexPaths:change.indexPaths inSection:section]];
|
[result addIndexes:[NSIndexSet as_indexSetFromIndexPaths:change.indexPaths inSection:section]];
|
||||||
}
|
}
|
||||||
@ -278,7 +278,7 @@ NSString *NSStringFromASHierarchyChangeType(_ASHierarchyChangeType changeType)
|
|||||||
[self _ensureCompleted];
|
[self _ensureCompleted];
|
||||||
|
|
||||||
if (_itemMappings == nil) {
|
if (_itemMappings == nil) {
|
||||||
_itemMappings = [NSMutableArray array];
|
_itemMappings = [[NSMutableArray alloc] init];
|
||||||
auto insertMap = [_ASHierarchyItemChange sectionToIndexSetMapFromChanges:_originalInsertItemChanges];
|
auto insertMap = [_ASHierarchyItemChange sectionToIndexSetMapFromChanges:_originalInsertItemChanges];
|
||||||
auto deleteMap = [_ASHierarchyItemChange sectionToIndexSetMapFromChanges:_originalDeleteItemChanges];
|
auto deleteMap = [_ASHierarchyItemChange sectionToIndexSetMapFromChanges:_originalDeleteItemChanges];
|
||||||
NSInteger oldSection = 0;
|
NSInteger oldSection = 0;
|
||||||
@ -302,7 +302,7 @@ NSString *NSStringFromASHierarchyChangeType(_ASHierarchyChangeType changeType)
|
|||||||
[self _ensureCompleted];
|
[self _ensureCompleted];
|
||||||
|
|
||||||
if (_reverseItemMappings == nil) {
|
if (_reverseItemMappings == nil) {
|
||||||
_reverseItemMappings = [NSMutableArray array];
|
_reverseItemMappings = [[NSMutableArray alloc] init];
|
||||||
for (NSInteger newSection = 0; newSection < _newItemCounts.size(); newSection++) {
|
for (NSInteger newSection = 0; newSection < _newItemCounts.size(); newSection++) {
|
||||||
NSInteger oldSection = [self oldSectionForNewSection:newSection];
|
NSInteger oldSection = [self oldSectionForNewSection:newSection];
|
||||||
ASIntegerMap *table;
|
ASIntegerMap *table;
|
||||||
@ -751,7 +751,7 @@ NSString *NSStringFromASHierarchyChangeType(_ASHierarchyChangeType changeType)
|
|||||||
NSMutableArray *result = [[NSMutableArray alloc] init];
|
NSMutableArray *result = [[NSMutableArray alloc] init];
|
||||||
|
|
||||||
__block ASDataControllerAnimationOptions currentOptions = 0;
|
__block ASDataControllerAnimationOptions currentOptions = 0;
|
||||||
NSMutableIndexSet *currentIndexes = [NSMutableIndexSet indexSet];
|
auto currentIndexes = [[NSMutableIndexSet alloc] init];
|
||||||
|
|
||||||
BOOL reverse = type == _ASHierarchyChangeTypeDelete || type == _ASHierarchyChangeTypeOriginalDelete;
|
BOOL reverse = type == _ASHierarchyChangeTypeDelete || type == _ASHierarchyChangeTypeOriginalDelete;
|
||||||
NSEnumerationOptions options = reverse ? NSEnumerationReverse : kNilOptions;
|
NSEnumerationOptions options = reverse ? NSEnumerationReverse : kNilOptions;
|
||||||
@ -790,7 +790,7 @@ NSString *NSStringFromASHierarchyChangeType(_ASHierarchyChangeType changeType)
|
|||||||
|
|
||||||
+ (NSMutableIndexSet *)allIndexesInSectionChanges:(NSArray<_ASHierarchySectionChange *> *)changes
|
+ (NSMutableIndexSet *)allIndexesInSectionChanges:(NSArray<_ASHierarchySectionChange *> *)changes
|
||||||
{
|
{
|
||||||
NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];
|
auto indexes = [[NSMutableIndexSet alloc] init];
|
||||||
for (_ASHierarchySectionChange *change in changes) {
|
for (_ASHierarchySectionChange *change in changes) {
|
||||||
[indexes addIndexes:change.indexSet];
|
[indexes addIndexes:change.indexSet];
|
||||||
}
|
}
|
||||||
@ -865,7 +865,7 @@ NSString *NSStringFromASHierarchyChangeType(_ASHierarchyChangeType changeType)
|
|||||||
// will become: {@0 : [0, 1], @2 : [5]}
|
// will become: {@0 : [0, 1], @2 : [5]}
|
||||||
+ (NSDictionary *)sectionToIndexSetMapFromChanges:(NSArray<_ASHierarchyItemChange *> *)changes
|
+ (NSDictionary *)sectionToIndexSetMapFromChanges:(NSArray<_ASHierarchyItemChange *> *)changes
|
||||||
{
|
{
|
||||||
NSMutableDictionary *sectionToIndexSetMap = [NSMutableDictionary dictionary];
|
NSMutableDictionary *sectionToIndexSetMap = [[NSMutableDictionary alloc] init];
|
||||||
for (_ASHierarchyItemChange *change in changes) {
|
for (_ASHierarchyItemChange *change in changes) {
|
||||||
for (NSIndexPath *indexPath in change.indexPaths) {
|
for (NSIndexPath *indexPath in change.indexPaths) {
|
||||||
NSNumber *sectionKey = @(indexPath.section);
|
NSNumber *sectionKey = @(indexPath.section);
|
||||||
@ -935,10 +935,10 @@ NSString *NSStringFromASHierarchyChangeType(_ASHierarchyChangeType changeType)
|
|||||||
[allIndexPaths sortUsingSelector:sorting];
|
[allIndexPaths sortUsingSelector:sorting];
|
||||||
|
|
||||||
// Create new changes by grouping sorted changes by animation option
|
// Create new changes by grouping sorted changes by animation option
|
||||||
NSMutableArray *result = [[NSMutableArray alloc] init];
|
auto result = [[NSMutableArray<_ASHierarchyItemChange *> alloc] init];
|
||||||
|
|
||||||
ASDataControllerAnimationOptions currentOptions = 0;
|
ASDataControllerAnimationOptions currentOptions = 0;
|
||||||
NSMutableArray *currentIndexPaths = [NSMutableArray array];
|
auto currentIndexPaths = [[NSMutableArray<NSIndexPath *> alloc] init];
|
||||||
|
|
||||||
for (NSIndexPath *indexPath in allIndexPaths) {
|
for (NSIndexPath *indexPath in allIndexPaths) {
|
||||||
ASDataControllerAnimationOptions options = [animationOptions[indexPath] integerValue];
|
ASDataControllerAnimationOptions options = [animationOptions[indexPath] integerValue];
|
||||||
|
|||||||
@ -33,8 +33,8 @@ NSString * const ASTransitionContextToLayoutKey = @"org.asyncdisplaykit.ASTransi
|
|||||||
@implementation _ASTransitionContext
|
@implementation _ASTransitionContext
|
||||||
|
|
||||||
- (instancetype)initWithAnimation:(BOOL)animated
|
- (instancetype)initWithAnimation:(BOOL)animated
|
||||||
layoutDelegate:(id<_ASTransitionContextLayoutDelegate>)layoutDelegate
|
layoutDelegate:(id<_ASTransitionContextLayoutDelegate>)layoutDelegate
|
||||||
completionDelegate:(id<_ASTransitionContextCompletionDelegate>)completionDelegate
|
completionDelegate:(id<_ASTransitionContextCompletionDelegate>)completionDelegate
|
||||||
{
|
{
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if (self) {
|
if (self) {
|
||||||
@ -69,7 +69,7 @@ NSString * const ASTransitionContextToLayoutKey = @"org.asyncdisplaykit.ASTransi
|
|||||||
|
|
||||||
- (NSArray<ASDisplayNode *> *)subnodesForKey:(NSString *)key
|
- (NSArray<ASDisplayNode *> *)subnodesForKey:(NSString *)key
|
||||||
{
|
{
|
||||||
NSMutableArray<ASDisplayNode *> *subnodes = [NSMutableArray array];
|
NSMutableArray<ASDisplayNode *> *subnodes = [[NSMutableArray alloc] init];
|
||||||
for (ASLayout *sublayout in [self layoutForKey:key].sublayouts) {
|
for (ASLayout *sublayout in [self layoutForKey:key].sublayouts) {
|
||||||
[subnodes addObject:(ASDisplayNode *)sublayout.layoutElement];
|
[subnodes addObject:(ASDisplayNode *)sublayout.layoutElement];
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user