Skip to content

Instantly share code, notes, and snippets.

@jorbsd
Created March 26, 2010 15:15
Show Gist options
  • Save jorbsd/345001 to your computer and use it in GitHub Desktop.
Save jorbsd/345001 to your computer and use it in GitHub Desktop.
<p>Samples of new usage for <a href="http://github.com/jordanbreeding/JBBAdditions">continuations in JBBAdditions</a>.</p>
<p>The relevant source files are:</p>
<ul>
<li><a href="http://github.com/jordanbreeding/JBBAdditions/blob/master/JBBTypes.h">JBBTypes.h</a></li>
<li><a href="http://github.com/jordanbreeding/JBBAdditions/blob/master/JBB_C_Functions.h">JBB_C_Functions.h</a></li>
<li><a href="http://github.com/jordanbreeding/JBBAdditions/blob/master/JBB_C_Functions.h">JBB_C_Functions.m</a></li>
<li><a href="http://github.com/jordanbreeding/JBBAdditions/blob/master/Classes/JBBObjectProxy.h">Classes/JBBObjectProxy.h</a></li>
<li><a href="http://github.com/jordanbreeding/JBBAdditions/blob/master/Classes/JBBObjectProxy.h">Classes/JBBObjectProxy.h</a></li>
<li><a href="http://github.com/jordanbreeding/JBBAdditions/blob/master/Classes/Extensions/NSInvocation+JBBAdditions.h">Classes/Extensions/NSInvocation+JBBAdditions.h</a></li>
<li><a href="http://github.com/jordanbreeding/JBBAdditions/blob/master/Classes/Extensions/NSInvocation+JBBAdditions.m">Classes/Extensions/NSInvocation+JBBAdditions.m</a></li>
<li><a href="http://github.com/jordanbreeding/JBBAdditions/blob/master/Classes/Extensions/NSObject+JBBAdditions.h">Classes/Extensions/NSObject+JBBAdditions.h</a></li>
<li><a href="http://github.com/jordanbreeding/JBBAdditions/blob/master/Classes/Extensions/NSObject+JBBAdditions.m">Classes/Extensions/NSObject+JBBAdditions.m</a></li>
</ul>
<p>The new code samples are:</p>
<ol>
<li><p>Create an empty proxy, message it directly, it should pass things through (returns value)</p>
<pre><code>//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 &lt;Cocoa/Cocoa.h&gt;
#import &lt;JBBAdditions/JBBAdditions.h&gt;
int main(int argc, char *argv[]) {
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
<pre><code>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:&amp;amp;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;
</code></pre>
}
</code></pre></li>
<li><p>Create an empty proxy, message it directly, use +getStoredInvocation and then invoke it, there is a WRAP_MSG_SEND() macro to help</p>
<pre><code>// 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 &lt;Cocoa/Cocoa.h&gt;
#import &lt;JBBAdditions/JBBAdditions.h&gt;
int main(int argc, char *argv[]) {
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
<pre><code>[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;
</code></pre>
}
</code></pre></li>
<li><p>Create an empty proxy, message it with continuations and error handlers attached (returns object)</p>
<pre><code>// 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 &lt;Cocoa/Cocoa.h&gt;
#import &lt;JBBAdditions/JBBAdditions.h&gt;
int main(int argc, char *argv[]) {
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
<pre><code>[[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;
</code></pre>
}
</code></pre></li>
<li><p>Create a proxy with an associated continuation and error handler, message it directly (returns value)</p>
<pre><code>// 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 &lt;Cocoa/Cocoa.h&gt;
#import &lt;JBBAdditions/JBBAdditions.h&gt;
int main(int argc, char *argv[]) {
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
<pre><code>[[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;
</code></pre>
}
</code></pre></li>
<li><p>Create a proxy with an associated continuation and error handler, message it with continuations and error handlers attached (returns object)</p>
<pre><code>// 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 &lt;Cocoa/Cocoa.h&gt;
#import &lt;JBBAdditions/JBBAdditions.h&gt;
int main(int argc, char *argv[]) {
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
<pre><code>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;
</code></pre>
}
</code></pre></li>
</ol>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment