For my last article I posted, I realized that when coming up with code examples that I had been writing examples with NSOperation using it the same way I had been writing code with NSOperation before, namely creating a NSOperation object and adding it to the Queue. However, I overlooked that NSOperationQueue in 10.6 contains a
-addOperationWithBlock:
method. Using that you could indeed write code with NSOperationQueue that doesn't look too dissimilar from the GCD API like so
//GCD Recursive Decomposition
dispatch_queue_t queue = dispatch_queue_create("com.App.Task",NULL);
dispatch_async(queue,^{
CGFloat num = [self doSomeMassiveComputation];
dispatch_async(dispatch_get_main_queue(),^{
[self updateUIWithNumber:num];
});
});
//NSOperationQueue Recursive Decomposition
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setName:@"com.App.Task"];
[queue addOperationWithBlock:^{
CGFloat num = [self doSomeMassiveComputation];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self updateUIWithNumber:num];
}];
}];
The only downside to this being that you can't get a reference to the newly created NSOperation object that it creates for you and change it before adding it to the queue, but this creates an Objective-C style way for accomplishing the same thing the GCD API does with only 1 extra line of code.
There's also -[NSBlockOperation blockOperationWithBlock:], which lets you create an NSBlockOperation independently from adding it to a queue.
ReplyDeleteThis allows you to work with NSOperation similarly to how you would work with GCD, but also use KVO to track start/completion, and take advantage of NSOperation's dependency mechanism.