【发布时间】:2011-07-05 05:31:36
【问题描述】:
我有一个带有 UISearchBar 的图书应用程序,用户可以在其中键入任何书名,并在他键入时在下方获取搜索结果(来自 ext API 调用)。
我在我的应用程序中使用了一个名为 retrievedArray 的单例变量,用于存储所有书籍。
@interface Shared : NSObject {
NSMutableArray *books;
}
@property (nonatomic, retain) NSMutableArray *books;
+ (id)sharedManager;
@end
这是使用 NSMutableArray *retrivedArray 在多个 .m 文件中访问的; ...在头文件中
retrievedArray = [[Shared sharedManager] books];
我的问题是如何确保 retrievedArray 中的值在所有类中保持同步。
实际上,retrievedArray 中的值是通过 NSXMLParser(即通过外部 Web 服务 API)添加的。有一个单独的 XMLParser.m 文件,我在其中进行所有解析并填充数组。解析在单独的线程上完成。
- (void) run: (id) param {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: [self URL]];
[parser setDelegate: self];
[parser parse];
[parser release];
NSString *tmpURLStr = [[self URL]absoluteString];
NSRange range_srch_book = [tmpURLStr rangeOfString:@"v1/books"];
if (range_srch_book.location != NSNotFound)
[delegate performSelectorOnMainThread:@selector(parseDidComplete_srch_book) withObject:nil waitUntilDone:YES];
[pool release];
}
- (void) parseXMLFile: (NSURL *) url
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self setURL: url];
NSThread* myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(run:)
object: nil];
[retrievedArray removeAllObjects];
[myThread start];
[pool release];
}
如果用户键入非常快,似乎会出现一些同步问题(如果用户键入缓慢,它似乎工作正常)....所以有 2 个视图,其中此共享数组项中的对象的内容被展示;列表和详细信息。 如果用户快速键入并在列表视图中单击 A,他会在详细视图中显示为 B...这是主要问题。
我已经尝试了所有我能想到的解决方案,但仍然无法解决问题。
编辑同步问题示例: 在列表视图中,如果显示了 3 个项目,例如 Item1、Item2 和 Item3,并且如果用户单击 Item2,则会在详细视图中显示 Item3(即说不正确的详细信息)
以下是单击列表视图中的项目时执行的代码;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic -- create and push a new view controller
if(bookdetailCustom == nil)
bookdetailCustom = [[BookDetailCustom alloc] initWithNibName:@"BookDetailCustom" bundle:[NSBundle mainBundle]];
//aBook = [retrievedArray objectAtIndex:indexPath.row];
bookdetailCustom.selectedIndex = indexPath.row;
[self.navigationController pushViewController:bookdetailCustom animated:YES];
[bookdetailCustom release];
bookdetailCustom = nil;
}
这是 searchTabkleView 的样子
- (void) searchTableView {
NSString *searchText = searchBar.text;
NSMutableArray *searchArray = [[NSMutableArray alloc] init];
for (int i=0;i<[retrievedArray count];i++)
{
Stock *aBookTemp = [retrievedArray objectAtIndex:i];
NSString *temp = [aBookTemp valueForKey:@"BookName"];
[searchArray addObject:temp];
}
for (NSString *sTemp in searchArray)
{
NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (titleResultsRange.length > 0)
[copyListOfItems addObject:sTemp];
}
[searchArray release];
searchArray = nil;
}
请提出一些合适的修复建议。
【问题讨论】:
标签: iphone objective-c cocoa-touch nsxmlparser uisearchbar