1

在我的应用程序中,根视图控制器从 Internet 获取信息,对其进行解析,并将其显示在viewDidAppear. 我使用这种方法是因为我的应用程序嵌入在 a 中UINavigationController,这样当用户按下后退按钮并弹出到根视图时,根视图控制器将重新加载其数据。

发生这种情况时,需要一些时间来获取和显示来自 Internet 的信息。在此期间,如果用户单击按钮移动到不同的视图,则在视图控制器完成获取 Web 数据的过程之前,不会发生按钮动作。

我怎样才能使按钮覆盖其他进程并立即切换视图?这安全吗?提前致谢。

编辑

这是我从站点中获取信息的部分示例(我的应用程序解析 HTML)。

NSURL *siteURL = [NSURL URLWithString:@"http://www.ridgefield.org/ajax/dist/emergency-announcements"];
NSError *error;
NSString *source = [NSString stringWithContentsOfURL:siteURL 
                                            encoding:NSUTF8StringEncoding
                                               error:&error];
4

2 回答 2

2

这是苹果人会追捕的地方,“不要阻塞主线程!”。

这种工作流的主要建议是使用单独的线程(读取:队列)从网络加载数据。然后完成加载的工作人员可以在您的视图控制器上设置一些属性,并且在该设置器内部是应该更新 UI 的地方。请记住在主线程上调用 setter。

有几种方法可以剥去并发猫的皮肤,但是这个特定问题的答案使它们超出了范围。简短的回答是不要在主线程中加载,这应该会引导你到正确的地方。

于 2012-06-21T17:14:48.923 回答
1

NSString 方法 stringWithContentsOfURL 是同步的,会阻塞你的主线程。

您可以使用异步 URL 请求,而不是使用后台线程来解决问题。这不会阻塞用户界面,因为委托协议用于让您知道请求何时完成。例如:

        NSURL *url = [NSURL URLWithString:@""http://www.ridgefield.org/ajax/dist/emergency-announcements""];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        NSURLConnection* theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];       

然后你的一些委托方法是:

-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)theResponse
{
    // create received data array
    _receivedData = [[NSMutableData alloc] init]; 
}

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)theData
{
    // append to received data.
    [_receivedData appendData:theData];
}


-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
    // now the connection is complete
    NSString* strResult = [[NSString alloc] initWithData: _receivedData encoding:NSUTF8StringEncoding];

    // now parse strResult
}
于 2012-06-21T17:24:34.890 回答