我使用 iOS 默认代码在数组中存在的自定义字典对象中搜索字符串,意思是字典项数组。
NSRange searchRange = NSMakeRange(0, artistThumbnail.count);
index = [artistThumbnail indexOfObject:artist
inSortedRange:searchRange
options:NSBinarySearchingLastEqual
usingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
NSString *artistName = (NSString *)obj2;
NSDictionary *artistThumbnail = (NSDictionary *)obj1;
NSString *artistToCompare = artistThumbnail[_artist_thumb];
NSComparisonResult result = [artistToCompare compare:artistName];
return result;
}];
当我使用少于等于 256 个对象的相同代码时,代码工作正常没有崩溃,Obj1
和 Obj2
都有字典对象,但是当数组有 >256 items 然后它崩溃了,我注意到 obj1 和 obj2 与以前不同,总是以 NSDictionary
格式出现。
最佳答案
问题是您的比较对象与数组元素的类型不同。如果您将数组正确键入为 NSArray<NSDictionary *> *
你会收到一条警告说参数 indexOfObject
应该是 NSDictionary *
类型.
此外,您不能依赖 artist
对象总是作为 obj2
传递到比较函数。文档对此没有任何说明,因此您应该假设它可以作为 obj1
传递。有时和obj2
其他时间。
要解决它,您可以嵌入 artist
在字典中使其与这样的数组元素具有相同的格式 @{ _artist_thumb: artist }
.然后以相同的方式从两个参数中检索名称。
NSRange searchRange = NSMakeRange(0, artistThumbnail.count);
index = [artistThumbnail indexOfObject:@{ _artist_thumb: artist }
inSortedRange:searchRange
options:NSBinarySearchingLastEqual
usingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
NSString *artistName = ((NSDictionary *)obj2)[_artist_thumb];
NSDictionary *artistThumbnail = (NSDictionary *)obj1;
NSString *artistToCompare = artistThumbnail[_artist_thumb];
NSComparisonResult result = [artistToCompare compare:artistName];
return result;
}];
关于iOS 二分搜索代码在超过 256 项时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56478164/