如何在单独的线程中运行整个对象(DAO.h和.m)

时间:2013-02-16 00:55:14

标签: ios objective-c grand-central-dispatch

有没有办法在使用GCD的单独线程中运行整个对象?换句话说,如何在自己的线程中运行DAO.m?有一些长时间运行的操作与它们运行的​​对象密切相关。详细信息:我们有一个sqlite3数据库,其中有几个长时间运行的操作,目前阻止应用程序在设备上运行(iPad 2),但它们在模拟器中工作 - 但阻止主线程。优化SQL不会提高性能。我们从网上下载文件,处理文件并将结果放入数据库。我们已经异步下载了。

2 个答案:

答案 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!");
}];