diff --git a/AsyncDisplayKit.xcodeproj/project.pbxproj b/AsyncDisplayKit.xcodeproj/project.pbxproj index d4b8ec1a8f..4269a60b2e 100644 --- a/AsyncDisplayKit.xcodeproj/project.pbxproj +++ b/AsyncDisplayKit.xcodeproj/project.pbxproj @@ -257,6 +257,10 @@ 509E68661B3AEDD7009B9150 /* CGRect+ASConvenience.m in Sources */ = {isa = PBXBuildFile; fileRef = 205F0E201B376416007741D0 /* CGRect+ASConvenience.m */; }; 68B0277A1C1A79CC0041016B /* ASDisplayNode+Beta.h in Headers */ = {isa = PBXBuildFile; fileRef = 68B027791C1A79CC0041016B /* ASDisplayNode+Beta.h */; settings = {ATTRIBUTES = (Public, ); }; }; 68B0277B1C1A79D60041016B /* ASDisplayNode+Beta.h in Headers */ = {isa = PBXBuildFile; fileRef = 68B027791C1A79CC0041016B /* ASDisplayNode+Beta.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 68EE0DBD1C1B4ED300BA1B99 /* ASMainSerialQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 68EE0DBB1C1B4ED300BA1B99 /* ASMainSerialQueue.h */; }; + 68EE0DBE1C1B4ED300BA1B99 /* ASMainSerialQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 68EE0DBB1C1B4ED300BA1B99 /* ASMainSerialQueue.h */; }; + 68EE0DBF1C1B4ED300BA1B99 /* ASMainSerialQueue.mm in Sources */ = {isa = PBXBuildFile; fileRef = 68EE0DBC1C1B4ED300BA1B99 /* ASMainSerialQueue.mm */; }; + 68EE0DC01C1B4ED300BA1B99 /* ASMainSerialQueue.mm in Sources */ = {isa = PBXBuildFile; fileRef = 68EE0DBC1C1B4ED300BA1B99 /* ASMainSerialQueue.mm */; }; 6BDC61F61979037800E50D21 /* AsyncDisplayKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BDC61F51978FEA400E50D21 /* AsyncDisplayKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 92DD2FE31BF4B97E0074C9DD /* ASMapNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 92DD2FE11BF4B97E0074C9DD /* ASMapNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 92DD2FE41BF4B97E0074C9DD /* ASMapNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 92DD2FE21BF4B97E0074C9DD /* ASMapNode.mm */; }; @@ -662,6 +666,8 @@ 4640521C1A3F83C40061C0BA /* ASFlowLayoutController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASFlowLayoutController.mm; sourceTree = ""; }; 4640521D1A3F83C40061C0BA /* ASLayoutController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASLayoutController.h; sourceTree = ""; }; 68B027791C1A79CC0041016B /* ASDisplayNode+Beta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ASDisplayNode+Beta.h"; sourceTree = ""; }; + 68EE0DBB1C1B4ED300BA1B99 /* ASMainSerialQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASMainSerialQueue.h; sourceTree = ""; }; + 68EE0DBC1C1B4ED300BA1B99 /* ASMainSerialQueue.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASMainSerialQueue.mm; sourceTree = ""; }; 6BDC61F51978FEA400E50D21 /* AsyncDisplayKit.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; path = AsyncDisplayKit.h; sourceTree = ""; }; 92DD2FE11BF4B97E0074C9DD /* ASMapNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASMapNode.h; sourceTree = ""; }; 92DD2FE21BF4B97E0074C9DD /* ASMapNode.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASMapNode.mm; sourceTree = ""; }; @@ -1002,6 +1008,8 @@ 05F20AA31A15733C00DCA68A /* ASImageProtocols.h */, 4640521D1A3F83C40061C0BA /* ASLayoutController.h */, 292C59991A956527007E5DD6 /* ASLayoutRangeType.h */, + 68EE0DBB1C1B4ED300BA1B99 /* ASMainSerialQueue.h */, + 68EE0DBC1C1B4ED300BA1B99 /* ASMainSerialQueue.mm */, 058D09E8195D050800B7D73C /* ASMutableAttributedStringBuilder.h */, 058D09E9195D050800B7D73C /* ASMutableAttributedStringBuilder.m */, 055F1A3619ABD413004DAFF1 /* ASRangeController.h */, @@ -1229,6 +1237,7 @@ 058D0A74195D05F800B7D73C /* _ASPendingState.h in Headers */, 9C5586691BD549CB00B50E3A /* ASAsciiArtBoxCreator.h in Headers */, 058D0A76195D05F900B7D73C /* _ASScopeTimer.h in Headers */, + 68EE0DBD1C1B4ED300BA1B99 /* ASMainSerialQueue.h in Headers */, 257754B31BEE44CD00737CA5 /* ASTextKitTailTruncater.h in Headers */, 205F0E191B37339C007741D0 /* ASAbstractLayoutController.h in Headers */, 058D0A82195D060300B7D73C /* ASAssert.h in Headers */, @@ -1350,6 +1359,7 @@ B35062491B010EFD0018CF92 /* _ASCoreAnimationExtras.h in Headers */, B350620F1B010EFD0018CF92 /* _ASDisplayLayer.h in Headers */, B35062111B010EFD0018CF92 /* _ASDisplayView.h in Headers */, + 68EE0DBE1C1B4ED300BA1B99 /* ASMainSerialQueue.h in Headers */, B350624B1B010EFD0018CF92 /* _ASPendingState.h in Headers */, 9C55866C1BD54A3000B50E3A /* ASAsciiArtBoxCreator.h in Headers */, B350624D1B010EFD0018CF92 /* _ASScopeTimer.h in Headers */, @@ -1656,6 +1666,7 @@ AC026B711BD57DBF00BBC17E /* _ASHierarchyChangeSet.m in Sources */, 257754BF1BEE458E00737CA5 /* ASTextKitCoreTextAdditions.m in Sources */, 058D0A18195D050800B7D73C /* _ASDisplayLayer.mm in Sources */, + 68EE0DBF1C1B4ED300BA1B99 /* ASMainSerialQueue.mm in Sources */, 058D0A19195D050800B7D73C /* _ASDisplayView.mm in Sources */, 9C55866A1BD549CB00B50E3A /* ASAsciiArtBoxCreator.m in Sources */, 058D0A27195D050800B7D73C /* _ASPendingState.m in Sources */, @@ -1783,6 +1794,7 @@ AC026B721BD57DBF00BBC17E /* _ASHierarchyChangeSet.m in Sources */, B35062421B010EFD0018CF92 /* _ASAsyncTransactionGroup.m in Sources */, B350624A1B010EFD0018CF92 /* _ASCoreAnimationExtras.mm in Sources */, + 68EE0DC01C1B4ED300BA1B99 /* ASMainSerialQueue.mm in Sources */, 2767E9421BB19BD600EA9B77 /* ASViewController.m in Sources */, B35062101B010EFD0018CF92 /* _ASDisplayLayer.mm in Sources */, 9C55866B1BD54A1900B50E3A /* ASAsciiArtBoxCreator.m in Sources */, diff --git a/AsyncDisplayKit/Details/ASDataController.mm b/AsyncDisplayKit/Details/ASDataController.mm index c70726a52f..aa774b5b41 100644 --- a/AsyncDisplayKit/Details/ASDataController.mm +++ b/AsyncDisplayKit/Details/ASDataController.mm @@ -13,10 +13,10 @@ #import "ASAssert.h" #import "ASCellNode.h" #import "ASDisplayNode.h" +#import "ASMainSerialQueue.h" #import "ASMultidimensionalArrayUtils.h" #import "ASInternalHelpers.h" #import "ASLayout.h" -#import "ASThread.h" //#define LOG(...) NSLog(__VA_ARGS__) #define LOG(...) @@ -27,22 +27,12 @@ NSString * const ASDataControllerRowNodeKind = @"_ASDataControllerRowNodeKind"; static void *kASSizingQueueContext = &kASSizingQueueContext; -@interface ASMainQueueSerialQueue : NSObject -{ - ASDN::Mutex _serialQueueLock; - NSMutableArray *_blocks; -} - -- (void)performBlockOnMainThread:(dispatch_block_t)block; - -@end - @interface ASDataController () { NSMutableArray *_externalCompletedNodes; // Main thread only. External data access can immediately query this if available. NSMutableDictionary *_completedNodes; // Main thread only. External data access can immediately query this if _externalCompletedNodes is unavailable. NSMutableDictionary *_editingNodes; // Modified on _editingTransactionQueue only. Updates propogated to _completedNodes. - ASMainQueueSerialQueue *_mainSerialQueue; + ASMainSerialQueue *_mainSerialQueue; NSMutableArray *_pendingEditCommandBlocks; // To be run on the main thread. Handles begin/endUpdates tracking. NSOperationQueue *_editingTransactionQueue; // Serial background queue. Dispatches concurrent layout and manages _editingNodes. @@ -74,7 +64,7 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; _completedNodes[ASDataControllerRowNodeKind] = [NSMutableArray array]; _editingNodes[ASDataControllerRowNodeKind] = [NSMutableArray array]; - _mainSerialQueue = [[ASMainQueueSerialQueue alloc] init]; + _mainSerialQueue = [[ASMainSerialQueue alloc] init]; _pendingEditCommandBlocks = [NSMutableArray array]; @@ -984,51 +974,3 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; } @end - -@implementation ASMainQueueSerialQueue - -- (instancetype)init -{ - if (!(self = [super init])) { - return nil; - } - - _blocks = [[NSMutableArray alloc] init]; - return self; -} - -- (void)performBlockOnMainThread:(dispatch_block_t)block -{ - ASDN::MutexLocker l(_serialQueueLock); - [_blocks addObject:block]; - ASDN::MutexUnlocker u(_serialQueueLock); - [self runBlocks]; -} - -- (void)runBlocks -{ - dispatch_block_t mainThread = ^{ - do { - ASDN::MutexLocker l(_serialQueueLock); - dispatch_block_t block; - if (_blocks.count > 0) { - block = [_blocks objectAtIndex:0]; - [_blocks removeObjectAtIndex:0]; - } else { - break; - } - ASDN::MutexUnlocker u(_serialQueueLock); - block(); - } while (true); - }; - - if ([NSThread isMainThread]) { - mainThread(); - } else { - dispatch_async(dispatch_get_main_queue(), ^{ - mainThread(); - }); - } -} - -@end diff --git a/AsyncDisplayKit/Details/ASMainSerialQueue.h b/AsyncDisplayKit/Details/ASMainSerialQueue.h new file mode 100644 index 0000000000..77e05d579e --- /dev/null +++ b/AsyncDisplayKit/Details/ASMainSerialQueue.h @@ -0,0 +1,15 @@ +// +// ASMainSerialQueue.h +// AsyncDisplayKit +// +// Created by Garrett Moon on 12/11/15. +// Copyright © 2015 Facebook. All rights reserved. +// + +#import + +@interface ASMainSerialQueue : NSObject + +- (void)performBlockOnMainThread:(dispatch_block_t)block; + +@end diff --git a/AsyncDisplayKit/Details/ASMainSerialQueue.mm b/AsyncDisplayKit/Details/ASMainSerialQueue.mm new file mode 100644 index 0000000000..f9ce3481c5 --- /dev/null +++ b/AsyncDisplayKit/Details/ASMainSerialQueue.mm @@ -0,0 +1,67 @@ +// +// ASMainSerialQueue.m +// AsyncDisplayKit +// +// Created by Garrett Moon on 12/11/15. +// Copyright © 2015 Facebook. All rights reserved. +// + +#import "ASMainSerialQueue.h" + +#import "ASThread.h" + +@interface ASMainSerialQueue () +{ + ASDN::Mutex _serialQueueLock; + NSMutableArray *_blocks; +} + +@end + +@implementation ASMainSerialQueue + +- (instancetype)init +{ + if (!(self = [super init])) { + return nil; + } + + _blocks = [[NSMutableArray alloc] init]; + return self; +} + +- (void)performBlockOnMainThread:(dispatch_block_t)block +{ + ASDN::MutexLocker l(_serialQueueLock); + [_blocks addObject:block]; + ASDN::MutexUnlocker u(_serialQueueLock); + [self runBlocks]; +} + +- (void)runBlocks +{ + dispatch_block_t mainThread = ^{ + do { + ASDN::MutexLocker l(_serialQueueLock); + dispatch_block_t block; + if (_blocks.count > 0) { + block = [_blocks objectAtIndex:0]; + [_blocks removeObjectAtIndex:0]; + } else { + break; + } + ASDN::MutexUnlocker u(_serialQueueLock); + block(); + } while (true); + }; + + if ([NSThread isMainThread]) { + mainThread(); + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + mainThread(); + }); + } +} + +@end