有没有办法在使用GCD的单独线程中运行整个对象?换句话说,如何在自己的线程中运行DAO.m?有一些长时间运行的操作与它们运行的对象密切相关。详细信息:我们有一个sqlite3数据库,其中有几个长时间运行的操作,目前阻止应用程序在设备上运行(iPad 2),但它们在模拟器中工作 - 但阻止主线程。优化SQL不会提高性能。我们从网上下载文件,处理文件并将结果放入数据库。我们已经异步下载了。
答案 0 :(得分:2)
我不确定我的意图是否合适,但这是一个想法 - 您可以继承NSProxy
来包装您的DAO实例并将任何调用转发到其自己的串行队列。像这样的东西(小心,没有测试/编译):
@interface DAOProxy : NSProxy
- (DAO *)initWithDAO:(DAO *)dao;
@end
@implementation DAOProxy {
dispatch_queue_t _daoQueue;
DAO *dao;
}
- (DAO *)initWithDAO:(DAO *)dao {
// no call to [super init] - we are subclassing NSProxy
_dao = dao;
_daoQueue = dispatch_queue_create("com.example.MyDaoQueue", DISPATCH_QUEUE_SERIAL);
return (DAO *)self;
}
- (BOOL)respondsToSelector:(SEL)aSelector {
return [_dao respondsToSelector:aSelector];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
return [_dao methodSignatureForSelector:aSelector];
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
dispatch_async(_daoQueue, ^{
[anInvocation setTarget:_dao];
[anInvocation invoke];
});
}
@end
用法:
DAO *realDao = ...;
DAO *proxiedDao = [[DAOProxy alloc] initWithDAO:realDao];
// use proxiedDao as you would use the real one from there
如果你想获得DAO方法的返回结果,就需要一些额外的技巧,比如传递回调块以在结果准备就绪时在调用者线程中执行它们......好吧,这是异步性所带来的一般问题。
答案 1 :(得分:0)
这就是我最终要做的事情。感谢一位同事和NSURLConnection and grand central dispatch。
我真的不需要URL连接在块中,但我需要异步处理响应。
[AsyncURLConnection request:pathToProducts url:getProductsURL completeBlock:^(NSData *data) {
/* success! */
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dAO = [DAO getInstance];
/* do processing here */
dispatch_async(dispatch_get_main_queue(), ^{
/* update UI on Main Thread */
});
});
} errorBlock:^(NSError *error) {
NSLog(@"Well that sucked!");
}];