您的位置:首页 > 运维架构

NSOperation使用

2015-08-12 20:53 281 查看
NSOperation and NSOperationQueue working thread vs main thread

多线程编程2-NSOperation

iPhone Coding – Turbo Charging Your Apps With NSOperation

如果使用如下的方式创建了NSOperationQueue,将会在后台线程中执行:

NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];


除非你在使用主线程mainQueue:

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];


会使用如下的方式使用代码:

NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];[myQueue addOperationWithBlock:^{

// Background work

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// Main thread work (UI usually)
}];
}];


GCD的方式是:

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
{
// Background work
dispatch_async(dispatch_get_main_queue(), ^(void)
{
// Main thread work (UI usually)
});
});


可以在两个operation之间添加依赖关系。

__block NSData *dataFromServer = nil;
NSBlockOperation *downloadOperation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakDownloadOperation = downloadOperation;

[weakDownloadOperation addExecutionBlock:^{
// Download your stuff
// Finally put it on the right place:
dataFromServer = ....
}];

NSBlockOperation *saveToDataBaseOperation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakSaveToDataBaseOperation = saveToDataBaseOperation;

[weakSaveToDataBaseOperation addExecutionBlock:^{
// Work with your NSData instance
// Save your stuff
}];

[saveToDataBaseOperation addDependency:downloadOperation];

[myQueue addOperation:saveToDataBaseOperation];
[myQueue addOperation:downloadOperation];


NSInvocationOperation的使用

- (void) loadData {

/* Operation Queue init (autorelease) */
NSOperationQueue *queue = [NSOperationQueue new];

/* Create our NSInvocationOperation to call loadDataWithOperation, passing in nil */
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(loadDataWithOperation)
object:nil];

/* Add the operation to the queue */
[queue addOperation:operation];
[operation release];
}

- (void) loadDataWithOperation {
NSURL *dataURL = [NSURL URLWithString:@"http://icodeblog.com/samples/nsoperation/data.plist"];

NSArray *tmp_array = [NSArray arrayWithContentsOfURL:dataURL];

for(NSString *str in tmp_array) {
[self.array addObject:str];
}

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: