1

我有一个UISearchBarUISearchDisplayController。当用户在其中写入文本时, searchBar:textDidChange:我会调用 Web 服务来过滤我的 TableView。问题是在我从 Web 服务获得结果之前,GUI 没有响应。我尝试使用 解决它[self performSelector:@selector(callWebService:) withObject:searchText];,但它仍然没有响应。

编辑:按照 Flink 的建议,我改为performSelectorperformSelectorInBackground但现在 tableView 没有正确过滤,它只显示“无结果”。甚至tableView:numberOfRowsInSection:没有被调用。

再次编辑:我得到“无结果”的原因是由于没有调用reloadData正确的 tableView。UISearchDisplayController有一个名为 的属性searchResultsTableView。所以最后我使用的是[self.searchDisplayController.searchResultsTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:false];现在它工作正常。

需要注意的是,虽然我选择了performSelectorInBackground,但我可能应该尝试使用sendAsynchronousRequest方法 on NSURLConnection- 请参阅 AliSoftware 的答案。

4

2 回答 2

1

您需要使您的网络呼叫异步。

http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial

在您的情况下,您可以更改performSelectorperformSelectorInBackground

于 2012-09-22T11:11:04.130 回答
1

您应该避免创建后台队列或线程来执行您的网络请求(这就是这样performSelectorInBackground:做的),因为这会为此创建一个工作线程,这不如在NSRunLoop.

专用线程将使处理器定期激活线程以检查是否有一些数据,为此创建一个线程是相当大的。在运行循环上调度请求(作为运行循环源)将使用网络中断来通知来自套接字的传入数据,因此只有在有实际数据可用时才会激活。

为此,只需使用NSURLConnection.

  • 一种解决方案是使用由提供的委托方法NSURLConnection(这是旧的方法,是NSURLConnectioniOs3 API 中可用的唯一方法)
  • 另一个更现代的解决方案是使用NSURLConnection更易于使用和编码的块 API。

    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse* response, NSData* receivedData, NSError* error)
     {
       // Your code to execute when the network request has completed
       // and returned a response (or timed out or encountered an error)
       // This code will execute asynchronously only once the whole data is available
       // (the rest of the code in the main thread won't be blocked waiting for it)
     }];
    // After this line of code, the request is executed in the background (scheduled on the run loop)
    // and the rest of the code will continue: the main thread will not be frozen during the request.
    

URL 加载系统编程指南NSURLConnection类参考中阅读更多内容。

于 2012-09-22T11:32:35.740 回答