2011-03-27 90 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