gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:39:45 26 4
gpt4 key购买 nike

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

最佳答案

我不确定我的意图是否正确,但这里有一个想法 - 您可以将 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 方法的返回结果,则需要一些额外的技巧,例如传递回调 block 以在结果准备就绪时在调用者线程中执行它们……好吧,这是异步性带来的普遍问题。

关于ios - 如何在单独的线程中运行整个对象(DAO.h 和 .m),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com