2011-03-27 51 views
0

我有一个问题。我的案例研究是我有两个大的SQLite数据库,我想使用线程(同时表示2个进程)。它工作正常吗?我写了下面的代码:关于iPhone上的多线程

NSAutoreleasePool *dbPool; 

dbPool = [[NSAutoreleasePool alloc] init]; 

/* All Database work is performed here */ 

[dbPool release]; 

请指导我。我是否正确地做这件事?我应该用泳池排水还是放水?

那么这是使用并发进程,这意味着它也是多任务相同的行为?

在此先感谢!

回答

1

是的,你做对了。您的每个新线程都需要自己的自动释放池。

对于你关于池的释放/排水的问题,建议是排水消息。

你是什么意思的sqlite数据库?你如何访问它?如果通过CoreData访问它,你必须继续跟随在你的记忆:

  • 你需要每线程的NSManagedObjectContext,
  • 不及格NSManagedObjects到另一个线程,只是传递对象ID,
  • 你传递前将对象ID保存到另一个线程,并将其保存在传递它之前修改/创建的线程中。

还有更多的规则,但这些都是基本规则。

多任务意味着您可以一次运行更多的应用程序。多线程(=你的情况)意味着你的应用程序确实使用更多的线程来完成它的任务。

+0

谢谢...太多了... – 2011-03-27 19:02:46

0

用户界面或其它重物管理工作的一种常用方法就是围绕你的代码就像你在做什么,而是你应该用drain

NSAutoreleasePool *dbPool = [[NSAutoreleasePool alloc] init]; 

// do your work 

[dbPool drain]; 

NSAutoreleasePool很多细节可here和先前的堆栈溢出回答here。基本上,您在池中执行的工作(如果设置为autorelease)将在池消失后发布。这可以提高使用生成自动发布实例的某些类的性能。如果您想完全控制并立即进行控制,则可以在您不再需要的每个对象release之后将其完全抛弃。

至于你的多线程问题,我不确定如果我明白你在问什么,但即使在后台线程中使用池也是一个可靠的方法。这是假设您在线程中使用的对象不会以某种方式在另一个中使用(因为您可能有意外的发布)。

+0

他可以使用,如果他只做iPhone。如果释放一个池导致它成为dealloc,那么dealloc方法仍然会调用drain。 – occulus 2011-03-28 12:00:16

+0

@occulus:根据苹果的指导原则,“你应该通常使用'drain'而不是'release''只是为了模式,我会说。 – 2011-03-28 12:29:23