aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Foundation/GTMNSThread+Blocks.h38
-rw-r--r--Foundation/GTMNSThread+Blocks.m51
-rw-r--r--Foundation/GTMNSThread+BlocksTest.m112
-rw-r--r--GTM.xcodeproj/project.pbxproj16
-rw-r--r--GTMiPhone.xcodeproj/project.pbxproj22
5 files changed, 237 insertions, 2 deletions
diff --git a/Foundation/GTMNSThread+Blocks.h b/Foundation/GTMNSThread+Blocks.h
new file mode 100644
index 0000000..4c649c2
--- /dev/null
+++ b/Foundation/GTMNSThread+Blocks.h
@@ -0,0 +1,38 @@
+//
+// GTMNSThread+Blocks.h
+//
+// Copyright 2012 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+// Based on http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-Objective-C
+
+#import <Foundation/Foundation.h>
+
+// Extension to NSThread to work with blocks.
+
+#if NS_BLOCKS_AVAILABLE
+
+@interface NSThread (GTMBlocksAdditions)
+
+// If self is not the current thread, the block will be called asynchronously
+// and this method returns immediately.
+// If self is the current thread, the block will be performed immediately, and
+// then this method will return.
+- (void)gtm_performBlock:(void (^)())block;
+
+- (void)gtm_performWaitingUntilDone:(BOOL)wait block:(void (^)())block;
++ (void)gtm_performBlockInBackground:(void (^)())block;
+@end
+
+#endif // NS_BLOCKS_AVAILABLE
diff --git a/Foundation/GTMNSThread+Blocks.m b/Foundation/GTMNSThread+Blocks.m
new file mode 100644
index 0000000..a752ea7
--- /dev/null
+++ b/Foundation/GTMNSThread+Blocks.m
@@ -0,0 +1,51 @@
+//
+// GTMNSThread+Blocks.m
+//
+// Copyright 2012 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+//
+
+#import "GTMNSThread+Blocks.h"
+
+#if NS_BLOCKS_AVAILABLE
+
+@implementation NSThread (GTMBlocksAdditions)
+
++ (void)gtm_runBlockOnCurrentThread:(void (^)())block {
+ block();
+}
+
+- (void)gtm_performBlock:(void (^)())block {
+ if ([[NSThread currentThread] isEqual:self]) {
+ block();
+ } else {
+ [self gtm_performWaitingUntilDone:NO block:block];
+ }
+}
+
+- (void)gtm_performWaitingUntilDone:(BOOL)wait block:(void (^)())block {
+ [NSThread performSelector:@selector(gtm_runBlockOnCurrentThread:)
+ onThread:self
+ withObject:[[block copy] autorelease]
+ waitUntilDone:wait];
+}
+
++ (void)gtm_performBlockInBackground:(void (^)())block {
+ [NSThread performSelectorInBackground:@selector(gtm_runBlockOnCurrentThread:)
+ withObject:[[block copy] autorelease]];
+}
+
+@end
+
+#endif // NS_BLOCKS_AVAILABLE
diff --git a/Foundation/GTMNSThread+BlocksTest.m b/Foundation/GTMNSThread+BlocksTest.m
new file mode 100644
index 0000000..48fb715
--- /dev/null
+++ b/Foundation/GTMNSThread+BlocksTest.m
@@ -0,0 +1,112 @@
+//
+// GTMNSThread+Blocks.h
+//
+// Copyright 2012 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations
+// under the License.
+//
+
+#import "GTMSenTestCase.h"
+#import "GTMNSThread+Blocks.h"
+
+#import "GTMFoundationUnitTestingUtilities.h"
+
+@interface GTMNSThread_BlocksTest : GTMTestCase {
+ @private
+ NSThread *workerThread_;
+ BOOL workerRunning_;
+}
+
+@property (nonatomic, readwrite, getter=isWorkerRunning) BOOL workerRunning;
+@end
+
+@implementation GTMNSThread_BlocksTest
+
+@synthesize workerRunning = workerRunning_;
+
+- (void)stopTestRunning:(GTMUnitTestingBooleanRunLoopContext *)context{
+ [context setShouldStop:YES];
+}
+
+- (void)workerMain:(id)object {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ while ([self isWorkerRunning]) {
+ [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
+ beforeDate:[NSDate distantFuture]];
+ }
+ [pool drain];
+}
+
+- (void)killWorkerThread:(GTMUnitTestingBooleanRunLoopContext *)context {
+ [self setWorkerRunning:NO];
+ [context setShouldStop:YES];
+}
+
+- (void)setUp {
+ [self setWorkerRunning:YES];
+ workerThread_ = [[NSThread alloc] initWithTarget:self
+ selector:@selector(workerMain:)
+ object:nil];
+ [workerThread_ start];
+}
+
+- (void)tearDown {
+ GTMUnitTestingBooleanRunLoopContext *context
+ = [GTMUnitTestingBooleanRunLoopContext context];
+ [self performSelector:@selector(killWorkerThread:)
+ onThread:workerThread_
+ withObject:context
+ waitUntilDone:NO];
+ NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
+ STAssertTrue([runLoop gtm_runUpToSixtySecondsWithContext:context], nil);
+ [workerThread_ release];
+}
+
+- (void)testPerformBlock {
+ NSThread *currentThread = [NSThread currentThread];
+ GTMUnitTestingBooleanRunLoopContext *context
+ = [GTMUnitTestingBooleanRunLoopContext context];
+ [workerThread_ gtm_performBlock:^{
+ [self performSelector:@selector(stopTestRunning:)
+ onThread:currentThread
+ withObject:context
+ waitUntilDone:YES];
+ }];
+ NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
+ STAssertTrue([runLoop gtm_runUpToSixtySecondsWithContext:context], nil);
+}
+
+- (void)testPerformBlockWaitUntilDone {
+ GTMUnitTestingBooleanRunLoopContext *context
+ = [GTMUnitTestingBooleanRunLoopContext context];
+ [workerThread_ gtm_performWaitingUntilDone:YES block:^{
+ [context setShouldStop:YES];
+ }];
+ STAssertTrue([context shouldStop], nil);
+}
+
+- (void)testPerformBlockInBackground {
+ NSThread *currentThread = [NSThread currentThread];
+ GTMUnitTestingBooleanRunLoopContext *context
+ = [GTMUnitTestingBooleanRunLoopContext context];
+ [NSThread gtm_performBlockInBackground:^{
+ [self performSelector:@selector(stopTestRunning:)
+ onThread:currentThread
+ withObject:context
+ waitUntilDone:YES];
+ }];
+ NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
+ STAssertTrue([runLoop gtm_runUpToSixtySecondsWithContext:context], nil);
+}
+
+@end
diff --git a/GTM.xcodeproj/project.pbxproj b/GTM.xcodeproj/project.pbxproj
index 8f0bfa4..84a4c48 100644
--- a/GTM.xcodeproj/project.pbxproj
+++ b/GTM.xcodeproj/project.pbxproj
@@ -233,6 +233,9 @@
8BB77A0511B5A09900AB31AF /* GTMGoogleSearchTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BB77A0311B5A09900AB31AF /* GTMGoogleSearchTest.m */; };
8BB77A0611B5A0A100AB31AF /* GTMGoogleSearch.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BB77A0211B5A09900AB31AF /* GTMGoogleSearch.m */; };
8BB7802E11B6C4EA00AB31AF /* GTMGoogleSearch.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BB77A0111B5A09900AB31AF /* GTMGoogleSearch.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 8BBD1F8C1519258A003152F0 /* GTMNSThread+Blocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BBD1F8A1519258A003152F0 /* GTMNSThread+Blocks.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 8BBD1F8D1519258A003152F0 /* GTMNSThread+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BBD1F8B1519258A003152F0 /* GTMNSThread+Blocks.m */; };
+ 8BBD1F8F1519271A003152F0 /* GTMNSThread+BlocksTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BBD1F8E1519271A003152F0 /* GTMNSThread+BlocksTest.m */; };
8BC046B90DAE8C4B00C2D1CA /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BC046B80DAE8C4B00C2D1CA /* ApplicationServices.framework */; };
8BC04CD80DB003D800C2D1CA /* GTMMethodCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B6F31F40DA3489B0052CA40 /* GTMMethodCheck.h */; settings = {ATTRIBUTES = (Public, ); }; };
8BC85150127A18D50046E0FB /* GTMServiceManagement.c in Sources */ = {isa = PBXBuildFile; fileRef = 8B414E861226FB1000D0064F /* GTMServiceManagement.c */; };
@@ -255,7 +258,7 @@
8BEEA90D0DA7446300894774 /* GTMUnitTestingImage.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 8BEEA90A0DA7446300894774 /* GTMUnitTestingImage.tiff */; };
8BEEA90E0DA7446300894774 /* GTMUnitTestingWindow.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 8BEEA90B0DA7446300894774 /* GTMUnitTestingWindow.tiff */; };
8BEEA90F0DA7446300894774 /* GTMUnitTestingView.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 8BEEA90C0DA7446300894774 /* GTMUnitTestingView.tiff */; };
- 8BF2368F13CF67CB00F3FD82 /* GTMKeyValueAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF2368D13CF67CB00F3FD82 /* GTMKeyValueAnimation.h */; };
+ 8BF2368F13CF67CB00F3FD82 /* GTMKeyValueAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF2368D13CF67CB00F3FD82 /* GTMKeyValueAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; };
8BF2369013CF67CB00F3FD82 /* GTMKeyValueAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF2368E13CF67CB00F3FD82 /* GTMKeyValueAnimation.m */; };
8BF2369213CF694C00F3FD82 /* GTMKeyValueAnimationTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BF2369113CF694C00F3FD82 /* GTMKeyValueAnimationTest.m */; };
8BF2555310F65B56000490C8 /* GTMTypeCasting.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF2555110F65B56000490C8 /* GTMTypeCasting.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -771,6 +774,9 @@
8BB77A0111B5A09900AB31AF /* GTMGoogleSearch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMGoogleSearch.h; sourceTree = "<group>"; };
8BB77A0211B5A09900AB31AF /* GTMGoogleSearch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMGoogleSearch.m; sourceTree = "<group>"; };
8BB77A0311B5A09900AB31AF /* GTMGoogleSearchTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMGoogleSearchTest.m; sourceTree = "<group>"; };
+ 8BBD1F8A1519258A003152F0 /* GTMNSThread+Blocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSThread+Blocks.h"; sourceTree = "<group>"; };
+ 8BBD1F8B1519258A003152F0 /* GTMNSThread+Blocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSThread+Blocks.m"; sourceTree = "<group>"; };
+ 8BBD1F8E1519271A003152F0 /* GTMNSThread+BlocksTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSThread+BlocksTest.m"; sourceTree = "<group>"; };
8BC046B80DAE8C4B00C2D1CA /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = /System/Library/Frameworks/ApplicationServices.framework; sourceTree = "<absolute>"; };
8BC04D140DB0061300C2D1CA /* RunMacOSUnitTests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = RunMacOSUnitTests.sh; sourceTree = "<group>"; };
8BC85131127A18AE0046E0FB /* GTMServiceManagementTestingHarness */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = GTMServiceManagementTestingHarness; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -1548,6 +1554,9 @@
F43E4C250D4E361D0041161F /* GTMNSString+XML.h */,
F43E4C260D4E361D0041161F /* GTMNSString+XML.m */,
F43E4C270D4E361D0041161F /* GTMNSString+XMLTest.m */,
+ 8BBD1F8A1519258A003152F0 /* GTMNSThread+Blocks.h */,
+ 8BBD1F8B1519258A003152F0 /* GTMNSThread+Blocks.m */,
+ 8BBD1F8E1519271A003152F0 /* GTMNSThread+BlocksTest.m */,
F43E4E5E0D4E5EC90041161F /* GTMNSData+zlib.h */,
F43E4E5F0D4E5EC90041161F /* GTMNSData+zlib.m */,
F43E4E600D4E5EC90041161F /* GTMNSData+zlibTest.m */,
@@ -1747,8 +1756,9 @@
8BCB59F011C00ED6009B6C40 /* GTMNSScanner+Unsigned.h in Headers */,
8B29080A11F8E1670064F50F /* GTMNSFileHandle+UniqueName.h in Headers */,
8B414E891226FB1000D0064F /* GTMServiceManagement.h in Headers */,
- F42866B81267340A0090FE0F /* GTMURITemplate.h in Headers */,
+ 8BBD1F8C1519258A003152F0 /* GTMNSThread+Blocks.h in Headers */,
8BF2368F13CF67CB00F3FD82 /* GTMKeyValueAnimation.h in Headers */,
+ F42866B81267340A0090FE0F /* GTMURITemplate.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -2309,6 +2319,7 @@
8BFE6EA31282371200B5C894 /* GTMTransientRootProxyTest.m in Sources */,
8BFE6EA41282371200B5C894 /* GTMURITemplateTest.m in Sources */,
8BFE6EA51282371200B5C894 /* GTMValidatingContainersTest.m in Sources */,
+ 8BBD1F8F1519271A003152F0 /* GTMNSThread+BlocksTest.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -2387,6 +2398,7 @@
8B414E881226FB1000D0064F /* GTMServiceManagement.c in Sources */,
F42866B91267340A0090FE0F /* GTMURITemplate.m in Sources */,
8BF2369013CF67CB00F3FD82 /* GTMKeyValueAnimation.m in Sources */,
+ 8BBD1F8D1519258A003152F0 /* GTMNSThread+Blocks.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/GTMiPhone.xcodeproj/project.pbxproj b/GTMiPhone.xcodeproj/project.pbxproj
index 82586c3..41d7fb0 100644
--- a/GTMiPhone.xcodeproj/project.pbxproj
+++ b/GTMiPhone.xcodeproj/project.pbxproj
@@ -71,6 +71,12 @@
8B5547CB0DB3BBF20014CC1C /* GTMUIKit+UnitTestingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B5547C90DB3BBF20014CC1C /* GTMUIKit+UnitTestingTest.m */; };
8B5A9E200E71CB6C005DA441 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B5A9E1F0E71CB6C005DA441 /* AddressBook.framework */; };
8B6C18740F3769D200E51E5D /* GTMNSObject+KeyValueObserving.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6C18720F3769D200E51E5D /* GTMNSObject+KeyValueObserving.m */; };
+ 8B6FF394151A664600B0642B /* GTMNSThread+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF392151A664600B0642B /* GTMNSThread+Blocks.m */; };
+ 8B6FF395151A664600B0642B /* GTMNSThread+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF392151A664600B0642B /* GTMNSThread+Blocks.m */; };
+ 8B6FF396151A664600B0642B /* GTMNSThread+BlocksTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF393151A664600B0642B /* GTMNSThread+BlocksTest.m */; };
+ 8B6FF397151A664600B0642B /* GTMNSThread+BlocksTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF393151A664600B0642B /* GTMNSThread+BlocksTest.m */; };
+ 8B6FF39A151A670100B0642B /* GTMFoundationUnitTestingUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF399151A670100B0642B /* GTMFoundationUnitTestingUtilities.m */; };
+ 8B6FF39B151A670100B0642B /* GTMFoundationUnitTestingUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6FF399151A670100B0642B /* GTMFoundationUnitTestingUtilities.m */; };
8B7DCEAA0DFF4C760017E983 /* GTMDevLogUnitTestingBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7DCEA90DFF4C760017E983 /* GTMDevLogUnitTestingBridge.m */; };
8B7DCEAD0DFF4CA60017E983 /* GTMUnitTestDevLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B7DCEAC0DFF4CA60017E983 /* GTMUnitTestDevLog.m */; };
8BB78FA911B94D9500AB31AF /* GTMGoogleSearch.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BB78FA711B94D9500AB31AF /* GTMGoogleSearch.m */; };
@@ -363,6 +369,11 @@
8B6C18710F3769D200E51E5D /* GTMNSObject+KeyValueObserving.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSObject+KeyValueObserving.h"; sourceTree = "<group>"; };
8B6C18720F3769D200E51E5D /* GTMNSObject+KeyValueObserving.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSObject+KeyValueObserving.m"; sourceTree = "<group>"; };
8B6C18730F3769D200E51E5D /* GTMNSObject+KeyValueObservingTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSObject+KeyValueObservingTest.m"; sourceTree = "<group>"; };
+ 8B6FF391151A664600B0642B /* GTMNSThread+Blocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "GTMNSThread+Blocks.h"; sourceTree = "<group>"; };
+ 8B6FF392151A664600B0642B /* GTMNSThread+Blocks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSThread+Blocks.m"; sourceTree = "<group>"; };
+ 8B6FF393151A664600B0642B /* GTMNSThread+BlocksTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "GTMNSThread+BlocksTest.m"; sourceTree = "<group>"; };
+ 8B6FF398151A670100B0642B /* GTMFoundationUnitTestingUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMFoundationUnitTestingUtilities.h; sourceTree = "<group>"; };
+ 8B6FF399151A670100B0642B /* GTMFoundationUnitTestingUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMFoundationUnitTestingUtilities.m; sourceTree = "<group>"; };
8B7DCEA90DFF4C760017E983 /* GTMDevLogUnitTestingBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMDevLogUnitTestingBridge.m; sourceTree = "<group>"; };
8B7DCEAB0DFF4CA60017E983 /* GTMUnitTestDevLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMUnitTestDevLog.h; sourceTree = "<group>"; };
8B7DCEAC0DFF4CA60017E983 /* GTMUnitTestDevLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMUnitTestDevLog.m; sourceTree = "<group>"; };
@@ -710,6 +721,9 @@
8BC0478A0DAE928A00C2D1CA /* GTMNSString+XML.h */,
8BC0478B0DAE928A00C2D1CA /* GTMNSString+XML.m */,
8BC0478C0DAE928A00C2D1CA /* GTMNSString+XMLTest.m */,
+ 8B6FF391151A664600B0642B /* GTMNSThread+Blocks.h */,
+ 8B6FF392151A664600B0642B /* GTMNSThread+Blocks.m */,
+ 8B6FF393151A664600B0642B /* GTMNSThread+BlocksTest.m */,
8BC0478D0DAE928A00C2D1CA /* GTMObjC2Runtime.h */,
8BC047900DAE928A00C2D1CA /* GTMObjectSingleton.h */,
F418AFD40E755D44004FB565 /* GTMPath.h */,
@@ -755,6 +769,8 @@
8B7DCEA90DFF4C760017E983 /* GTMDevLogUnitTestingBridge.m */,
8BC047A00DAE928A00C2D1CA /* GTMCALayer+UnitTesting.h */,
8BC047A10DAE928A00C2D1CA /* GTMCALayer+UnitTesting.m */,
+ 8B6FF398151A670100B0642B /* GTMFoundationUnitTestingUtilities.h */,
+ 8B6FF399151A670100B0642B /* GTMFoundationUnitTestingUtilities.m */,
8B5547C70DB3BBF20014CC1C /* GTMUIKit+UnitTesting.m */,
8B5547C80DB3BBF20014CC1C /* GTMUIKit+UnitTesting.h */,
8B5547C90DB3BBF20014CC1C /* GTMUIKit+UnitTestingTest.m */,
@@ -1122,6 +1138,9 @@
169E1E301459AAE100E6F562 /* GTMUILocalizerTest.m in Sources */,
BE9B794114FE9A2C004A993A /* GTMURLBuilderTest.m in Sources */,
BE9B794314FE9A3E004A993A /* GTMURLBuilder.m in Sources */,
+ 8B6FF394151A664600B0642B /* GTMNSThread+Blocks.m in Sources */,
+ 8B6FF396151A664600B0642B /* GTMNSThread+BlocksTest.m in Sources */,
+ 8B6FF39A151A670100B0642B /* GTMFoundationUnitTestingUtilities.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1207,6 +1226,9 @@
F4D20F1B14852CA40001600C /* GTMValidatingContainersTest.m in Sources */,
BE9B794214FE9A2E004A993A /* GTMURLBuilderTest.m in Sources */,
BE9B794414FE9A3E004A993A /* GTMURLBuilder.m in Sources */,
+ 8B6FF395151A664600B0642B /* GTMNSThread+Blocks.m in Sources */,
+ 8B6FF397151A664600B0642B /* GTMNSThread+BlocksTest.m in Sources */,
+ 8B6FF39B151A670100B0642B /* GTMFoundationUnitTestingUtilities.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};