2013-04-30 152 views
0

我的应用程序有大约200个UITableView行,当我在xcode上使用模拟器通过UISearchBar过滤数据时,它立即过滤并显示结果,但是,当我在我的iphone中运行我的应用程序(iphone4 ,iOS 5.1.1),它会在显示任何搜索结果之前挂起几秒钟。我使用这个代码过滤数据...SearchBar挂在iphone上,但在模拟器上工作正常

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
[self.filteredData removeAllObjects]; 

if ([searchText length] > 0) { 
    self.isSearching = YES; 
    for (AClass *filteredData in self.allData) { 
     NSRange titleResultRange = [filteredData.name rangeOfString:self.searchBar.text options:NSCaseInsensitiveSearch]; 
     if (titleResultRange.location != NSNotFound) { 
      [self.filteredData addObject:filteredData]; 
     } 
    } 
} 
else self.isSearching = NO; 
[self.tableView reloadData];} 

我相信我的代码是好的,因为它的工作完全正常的模拟器,有什么我需要做,使之更快地适用于iPhone? 顺便说一句,我的iPhone工作正常,我使用其他应用程序,他们工作正常..

回答

1

您的设备花费的时间比模拟器更长的原因是由于可用的内存量。作为一般规则,不要在模拟器中使用应用程序的性能来判断应用程序的性能。

如果您按照您描述的方式过滤了一个非常大的数据集,我会建议使用分派队列执行搜索,而不是在主队列中完成所有操作。你可以在这里阅读关于它们的信息:http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html

如果你不想阅读整个文档,下面是你的代码的样子。

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    [self.filteredData removeAllObjects]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     if ([searchText length] > 0) { 
      self.isSearching = YES; 
      for (AClass *filteredData in self.allData) { 
       NSRange titleResultRange = [filteredData.name rangeOfString:self.searchBar.text options:NSCaseInsensitiveSearch]; 
       if (titleResultRange.location != NSNotFound) { 
        [self.filteredData addObject:filteredData]; 
       } 
      } 
     } 
     else self.isSearching = NO; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData]; 
     }); 
    }); 
} 

请注意,我给你的是不是线程安全的例子......你需要确保只有一个搜索在任何给定时间正在执行或该代码会崩溃,因为在同一阵列将在多个队列中被引用。如果您需要更多帮助,请发表评论,我会尽力去解决。

+0

谢谢darkfoxmrd! – DevCali 2013-05-01 01:33:50

相关问题