Skip to content

Instantly share code, notes, and snippets.

@jorbsd
Created March 26, 2010 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jorbsd/344990 to your computer and use it in GitHub Desktop.
Save jorbsd/344990 to your computer and use it in GitHub Desktop.

Samples of new usage for continuations in JBBContinuations.

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/JBBContinuations/Release -F/Users/jordan/Build/JBBContinuations/Release -o test_1 test_1.m -framework JBBContinuations -framework Cocoa

    #import <Cocoa/Cocoa.h> #import <JBBContinuations/JBBContinuations.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];
       NSLog(@"%@", aString);
    
       anotherString = [NSString stringWithCString:"this is another test" encoding:NSUTF8StringEncoding];
       NSLog(@"%@", anotherString);
    
       if (![NSString stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:&anError]) {
           if (anError) {
               NSLog(@"an error occurred: %@", anError);
           } else {
               NSLog(@"an error occurred");
           }
       } else {
           NSLog(@"no error occurred");
       }
    
       [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/JBBContinuations/Release -F/Users/jordan/Build/JBBContinuations/Release -o test_2 test_2.m -framework JBBContinuations -framework Cocoa

    #import <Cocoa/Cocoa.h> #import <JBBContinuations/JBBContinuations.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) {
           NSLog(@"%@", anObject);
       }];
    
       __block NSString *anOutsideObject = nil;
       [WRAP_MSG_SEND(NSString, stringWithCString:"this is another test" encoding:NSUTF8StringEncoding) jbb_invokeWithContinuation:^(id anObject) {
           anOutsideObject = [anObject retain];
       }];
       NSLog(@"%@", [anOutsideObject autorelease]);
    
       [WRAP_MSG_SEND(NSString, stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:nil) jbb_invokeWithContinuation:^(id anObject) {
           NSLog(@"no error occurred");
       } errorHandler:^(NSError *anError) {
           if (anError) {
               NSLog(@"an error occurred: %@", anError);
           } else {
               NSLog(@"an error occurred");
           }
       }];
    
       [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/JBBContinuations/Release -F/Users/jordan/Build/JBBContinuations/Release -o test_3 test_3.m -framework JBBContinuations -framework Cocoa

    #import <Cocoa/Cocoa.h> #import <JBBContinuations/JBBContinuations.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) {
           NSLog(@"%@", anObject);
       }];
    
       __block NSString *anOutsideObject = nil;
       [[NSString jbb_proxy] stringWithCString:"this is another test" encoding:NSUTF8StringEncoding continuation:^(id anObject) {
           anOutsideObject = [anObject retain];
       }];
       NSLog(@"%@", [anOutsideObject autorelease]);
    
       [[NSString jbb_proxy] stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:nil continuation:^(id anObject) {
           NSLog(@"no error occurred");
       } errorHandler:^(NSError *anError) {
           if (anError) {
               NSLog(@"an error occurred: %@", anError);
           } else {
               NSLog(@"an error occurred");
           }
       }];
    
       [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/JBBContinuations/Release -F/Users/jordan/Build/JBBContinuations/Release -o test_4 test_4.m -framework JBBContinuations -framework Cocoa

    #import <Cocoa/Cocoa.h> #import <JBBContinuations/JBBContinuations.h>

    int main(int argc, char *argv[]) { NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];

       [[NSString jbb_proxyWithContinuation:^(id anObject) {
           NSLog(@"%@", anObject);
       }] 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];
       NSLog(@"%@", [anOutsideObject autorelease]);
    
       [[NSString jbb_proxyWithContinuation:^(id anObject) {
           NSLog(@"no error occurred");
       } errorHandler:^(NSError *anError) {
           if (anError) {
               NSLog(@"an error occurred: %@", anError);
           } else {
               NSLog(@"an error occurred");
           }
       }] 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/JBBContinuations/Release -F/Users/jordan/Build/JBBContinuations/Release -o test_5 test_5.m -framework JBBContinuations -framework Cocoa

    #import <Cocoa/Cocoa.h> #import <JBBContinuations/JBBContinuations.h>

    int main(int argc, char *argv[]) { NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];

       id baseProxy = [NSString jbb_proxyWithContinuation:^(id anObject) {
           NSLog(@"base continuations");
       } errorHandler:^(NSError *anError) {
           NSLog(@"base errorHandler");
       }];
    
       [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) {
           NSLog(@"%@", anObject);
       }];
    
       __block NSString *anOutsideObject = nil;
       [baseProxy stringWithCString:"this is another test" encoding:NSUTF8StringEncoding continuation:^(id anObject) {
           anOutsideObject = [anObject retain];
       }];
       NSLog(@"%@", [anOutsideObject autorelease]);
    
       [baseProxy stringWithContentsOfFile:@"/tmp/completely_fake_file.txt" encoding:NSUTF8StringEncoding error:nil continuation:^(id anObject) {
           NSLog(@"no error occurred");
       } errorHandler:^(NSError *anError) {
           if (anError) {
               NSLog(@"an error occurred: %@", anError);
           } else {
               NSLog(@"an error occurred");
           }
       }];
    
       [localPool drain];
       return 0;
    

    }

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