Skip to content

Instantly share code, notes, and snippets.

@pburleson
Forked from jorbsd/MikeAsh.mdown
Created March 26, 2010 20:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pburleson/345327 to your computer and use it in GitHub Desktop.
Save pburleson/345327 to your computer and use it in GitHub Desktop.

Samples of new usage for continuations in JBBAdditions.

The relevant source files are:

The new code samples are:

  1. 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;
    

    }

  2. 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;
    

    }

  3. 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;
    

    }

  4. 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;
    

    }

  5. 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;
    

    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment