Samples of new usage for continuations in JBBAdditions.
The relevant source files are:
- JBBTypes.h
- JBB_C_Functions.h
- JBB_C_Functions.m
- Classes/JBBObjectProxy.h
- Classes/JBBObjectProxy.h
- Classes/Extensions/NSInvocation+JBBAdditions.h
- Classes/Extensions/NSInvocation+JBBAdditions.m
- Classes/Extensions/NSObject+JBBAdditions.h
- Classes/Extensions/NSObject+JBBAdditions.m
The new code samples are:
-
Create an empty proxy, message it directly, it should pass things through (returns value)
//clang -arch i386 -arch x86_64 -Wl,-rpath,/Users/jordan/Build/JBBAdditions/Release -F/Users/jordan/Build/JBBAdditions/Release -o test_1 test_1.m -framework JBBAdditions -framework Cocoa
#import <Cocoa/Cocoa.h> #import <JBBAdditions/JBBAdditions.h>
int main(int argc, char *argv[]) { NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
NSError *anError = nil; NSString *aString = nil; NSString *anotherString = nil; aString = [NSString stringWithCString:"this is a test" encoding:NSUTF8StringEncoding]; [aString jbb_puts]; anotherString = [NSString stringWithCString:"this is another test" encoding:NSUTF8StringEncoding]; [anotherString jbb_puts]; if (![NSString stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:&anError]) { if (anError) { [[NSString stringWithFormat:@"an error occured: %@", anError] jbb_puts]; } else { [@"an error occurred" jbb_puts]; } } else { [@"no error occurred" jbb_puts]; } [localPool drain]; return 0;
}
-
Create an empty proxy, message it directly, use +getStoredInvocation and then invoke it, there is a WRAP_MSG_SEND() macro to help
// clang -arch i386 -arch x86_64 -Wl,-rpath,/Users/jordan/Build/JBBAdditions/Release -F/Users/jordan/Build/JBBAdditions/Release -o test_2 test_2.m -framework JBBAdditions -framework Cocoa
#import <Cocoa/Cocoa.h> #import <JBBAdditions/JBBAdditions.h>
int main(int argc, char *argv[]) { NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
[WRAP_MSG_SEND(NSString, stringWithCString:"this is a test" encoding:NSUTF8StringEncoding) jbb_invokeWithContinuation:^(id anObject) { [anObject jbb_puts]; }]; __block NSString *anOutsideObject = nil; [WRAP_MSG_SEND(NSString, stringWithCString:"this is another test" encoding:NSUTF8StringEncoding) jbb_invokeWithContinuation:^(id anObject) { anOutsideObject = [anObject retain]; }]; [[anOutsideObject autorelease] jbb_puts]; [WRAP_MSG_SEND(NSString, stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:nil) jbb_invokeWithContinuation:^(id anObject) { [@"no error occurred" jbb_puts]; } errorHandler:^(NSError *anError) { if (anError) { [[NSString stringWithFormat:@"an error occured: %@", anError] jbb_puts]; } else { [@"an error occurred" jbb_puts]; } }]; [localPool drain]; return 0;
}
-
Create an empty proxy, message it with continuations and error handlers attached (returns object)
// clang -arch i386 -arch x86_64 -Wl,-rpath,/Users/jordan/Build/JBBAdditions/Release -F/Users/jordan/Build/JBBAdditions/Release -o test_3 test_3.m -framework JBBAdditions -framework Cocoa
#import <Cocoa/Cocoa.h> #import <JBBAdditions/JBBAdditions.h>
int main(int argc, char *argv[]) { NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
[[NSString jbb_proxy] stringWithCString:"this is a test" encoding:NSUTF8StringEncoding continuation:^(id anObject) { [anObject jbb_puts]; }]; __block NSString *anOutsideObject = nil; [[NSString jbb_proxy] stringWithCString:"this is another test" encoding:NSUTF8StringEncoding continuation:^(id anObject) { anOutsideObject = [anObject retain]; }]; [[anOutsideObject autorelease] jbb_puts]; [[NSString jbb_proxy] stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:nil continuation:^(id anObject) { [@"no error occurred" jbb_puts]; } errorHandler:^(NSError *anError) { if (anError) { [[NSString stringWithFormat:@"an error occured: %@", anError] jbb_puts]; } else { [@"an error occurred" jbb_puts]; } }]; [localPool drain]; return 0;
}
-
Create a proxy with an associated continuation and error handler, message it directly (returns value)
// clang -arch i386 -arch x86_64 -Wl,-rpath,/Users/jordan/Build/JBBAdditions/Release -F/Users/jordan/Build/JBBAdditions/Release -o test_4 test_4.m -framework JBBAdditions -framework Cocoa
#import <Cocoa/Cocoa.h> #import <JBBAdditions/JBBAdditions.h>
int main(int argc, char *argv[]) { NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
[[NSString jbb_proxyWithContinuation:^(id anObject) { [anObject jbb_puts]; }] stringWithCString:"this is a test" encoding:NSUTF8StringEncoding]; __block NSString *anOutsideObject = nil; [[NSString jbb_proxyWithContinuation:^(id anObject) { anOutsideObject = [anObject retain]; }] stringWithCString:"this is another test" encoding:NSUTF8StringEncoding]; [[anOutsideObject autorelease] jbb_puts]; [[NSString jbb_proxyWithContinuation:^(id anObject) { [@"no error occurred" jbb_puts]; } errorHandler:^(NSError *anError) { if (anError) { [[NSString stringWithFormat:@"an error occured: %@", anError] jbb_puts]; } else { [@"an error occurred" jbb_puts]; } }] stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:nil]; [localPool drain]; return 0;
}
-
Create a proxy with an associated continuation and error handler, message it with continuations and error handlers attached (returns object)
// clang -arch i386 -arch x86_64 -Wl,-rpath,/Users/jordan/Build/JBBAdditions/Release -F/Users/jordan/Build/JBBAdditions/Release -o test_5 test_5.m -framework JBBAdditions -framework Cocoa
#import <Cocoa/Cocoa.h> #import <JBBAdditions/JBBAdditions.h>
int main(int argc, char *argv[]) { NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
id baseProxy = [NSString jbb_proxyWithContinuation:^(id anObject) { [@"base continuation" jbb_puts]; } errorHandler:^(NSError *anError) { [@"base errorHandler" jbb_puts]; }]; [baseProxy stringWithCString:"this is a test" encoding:NSUTF8StringEncoding]; [baseProxy stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:nil]; [baseProxy stringWithCString:"this is a test" encoding:NSUTF8StringEncoding continuation:^(id anObject) { [anObject jbb_puts]; }]; __block NSString *anOutsideObject = nil; [baseProxy stringWithCString:"this is another test" encoding:NSUTF8StringEncoding continuation:^(id anObject) { anOutsideObject = [anObject retain]; }]; [[anOutsideObject autorelease] jbb_puts]; [baseProxy stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:nil continuation:^(id anObject) { [@"no error occurred" jbb_puts]; } errorHandler:^(NSError *anError) { if (anError) { [[NSString stringWithFormat:@"an error occured: %@", anError] jbb_puts]; } else { [@"an error occurred" jbb_puts]; } }]; [localPool drain]; return 0;
}