2012-02-13 16 views
2

所以我有這個函數解析來自url字符串的數據並設置標籤。查看後的調用函數有加載

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self parseAndSetLabels]; 
} 

的一點改進是,如果你有一個壞的方面,它可能需要一段時間,它看起來喜歡的應用程序凍結,但它實際上做parseAndSetLabels功能它動畫視圖前。

那麼我如何使viewLoad和之後運行我的功能?

(像以該順序)

-(void)main 
{ 
    [self viewDidLoad] 
    [self parseAndSetLabels]; 
} 
+1

有你的兩個語句之間沒有什麼區別 - 它們將執行同樣的事情。你需要做的是啓動一個調用parseAndSetLabels的線程,然後在完成時發回一條消息。 – KevinDTimm 2012-02-13 14:31:40

+0

在你的情況下,你應該只在viewDidLoad中填充一些初始數據(也許可以從上一次會話緩存)並啓動應該移動到另一個線程的parseAndSetLabels。這種方式GUI不會凍結。編輯:抱歉幾乎重複的評論,我想它花了我8分鐘鍵入它:) – 2012-02-13 14:38:48

回答

4

正如Nickolay O.所說,使用NSURLConnection與其委託方法異步,或者您可以在您的viewDidAppear:方法中調用parseAndSetLabels方法。
放置你的電話這最後的方法中,它會被稱爲每次出現的查看時間,但如果你不希望這樣,您可以使用簡單的布爾條件,在這個例子中只有一次調用此方法,如:

YourController.h 

@property (nonatomic) BOOL condition; 

YourController.m 

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.condition = YES; 
} 
-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (self.condition) 
    { 
     [self parseAndSetLabels]; 
     self.condition = NO; 
    } 
} 

但是,在你的情況下,NSURLConnection及其代表是最好的解決方案。

+0

這解決了我的問題,沒有找到viewdidappear。 – captencrunch 2012-02-13 15:37:36

0

使用異步NSURLConnection的(或輔助線程)來代替。

1

如果沒有看到您的parseAndSetLabels的內容,您很難過於具體,但通常您不應該在viewDidLoad代碼中同步執行網絡操作。您應該將標籤設置爲臨時佔位符,並啓動異步調用,該異步調用需要在完成異步操作時執行的塊。您應該從該異步塊內設置標籤的實際值。

0

您甚至可以在啓動視圖控制器之前下載並解析數據。所以你只需在解析數據的viewDidLoad方法中設置標籤。 一旦你的應用程序在connectionDidfinishLoading(如果你使用異步模式)接收到信號,你就可以啓動viewcontroller。

如果萬一,您所說的視圖控制器是根視圖控制器,那麼您使用的是對Web服務或異步調用的同步調用。但是您的輸入將有所幫助。

1

如果您想與延遲的性能:

[self performSelector:@selector(something) withObject:nil afterDelay:0.0f]; 
相關問題