2011-06-29 23 views
0

我在我的應用程序中有一個棘手的情況。我正在應用程序服務器調用完成啓動方法基於服務器響應我需要加載不同的意見。我的應用程序在模擬器中工作正常,但在設備應用程序獲取崩潰,因爲需要時間來獲得服務器響應.i嘗試NSThread運行服務器調用,但屏幕正在等待,直到它從服務器得到響應。我可以移動應用程序刪除方法的東西將東西移出appdelegate

+0

您是否使用同步請求從服務器獲取數據? – Deeps

回答

2

更好的方法是顯示一些臨時視圖,並使網絡請求異步或在後臺線程上執行。如果您阻止主線程時間過長(這可能是您的案例中發生的情況),iOS會殺死您的應用程序,並且用戶不太可能希望使用花費10或20秒的應用程序,展示一個有用的展示。當您從服務器獲得響應時,您可以適當重新配置顯示器。

順便說一句,下次明確陳述你的問題是個好主意。要知道你現在要問的問題有點難。

0

NSURLConnection是你的朋友。解決它的最好方法是使用NSURLConnection執行服務器調用異步。

Apple Developer Connection上有Sample Code,它以異步方式下載UITableView中每行的圖像,因此UI更具響應性。所以,如果你看看這個代碼,你應該能夠重構你的代碼。

異步加載服務器響應可防止iOS運行時關閉應用程序,因爲您阻止主線程超過20秒。

2

如果您的目標是iOS 4.0或更高版本,則可以使用Grand Central Dispatch在後臺線程上進行網絡調用。這是一個簡單的例子。

// Create a dispatch queue 
dispatch_queue_t networkQueue = dispatch_queue_create("NetworkQueue", 0); 

dispatch_async(networkQueue,^{ 
    // Start your network task here. 

    // Now when it completes we will dispatch back to the main queue 
    // and you can perform UI updates 
    dispatch_async(dispatch_get_main_queue(),^{ 
     // Perform UI updates here on the main thread 
    }; 

    // Release your dispatch queue 
    dispatch_release(networkQueue); 
}; 

現在,雖然這是確定你已經在屏幕上放置了一些初步的未填充的用戶界面。您還應該適當地顯示和隱藏UIApplication的networkActivityIndi​​cator,並可能會顯示一些「加載...」UI。

+0

GCD +1。但是,它是否支持所有iOs版本? –

+0

不,就像我說過的,只有iOS版本4.0或更高版本纔可用。 –

6

你需要調用

[[NSURLConnection alloc]initWithRequest:request delegate:self]; 

這是異步請求,就可以實現的appdelegate NSURLConnection的的委託方法。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection; 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;