将东西移出appdelegate

时间:2011-06-29 05:42:49

标签: iphone

我的应用程序中有一个棘手的情况。我在应用程序中进行服务器调用确实完成基于服务器响应的启动方法我需要加载不同的视图。我的应用程序在模拟器中正常工作但在设备中应用程序因为花时间获取服务器响应而崩溃.i尝试NSThread运行服务器调用,但屏幕正在等待,直到它从server获取响应。我可以移动应用程序删除方法

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;

答案 1 :(得分:2)

更好的方法是显示一些临时视图并使网络请求异步或在后台线程上执行。如果你长时间阻止主线程,iOS会杀死你的应用程序(这可能是你的情况下发生的事情),并且用户不太可能想要使用花费十或二十秒的应用程序做什么看起来什么都不做一个有用的显示。当您从服务器获得响应时,您可以适当地重新配置显示。

顺便说一下,下次明确陈述你的问题是个好主意。现在的问题就是要知道你要求的东西有点难。

答案 2 :(得分: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);
};

现在正在进行中,请确保您已经在屏幕上放置了一些初步未填充的UI。你还应该适当地显示和隐藏UIApplication的networkActivityIndi​​cator,可能还有一些“Loading ...”UI。

答案 3 :(得分:0)

NSURLConnection是你的朋友。解决它的最佳方法是使用NSURLConnection进行异步服务器调用。

Apple Developer Connection上有Sample Code,可以异步下载UITableView中每行的图像,因此UI响应更快。因此,如果您查看该代码,您应该能够重构代码。

异步加载服务器响应可防止iOS运行时关闭您的应用,因为您阻止主线程超过20秒。