我正在通过Fabric
TwitterKit
在我的应用中显示一个Twitter时间轴。
我想通过仅显示特定用户的推文来过滤时间表。我已经从这里阅读了有关如何在时间轴中过滤推文的文档。对我来说不幸的是,他们提供的功能将排除时间线中包含指定关键字的任何推文。
我正在寻找的行为是仅包含时间表中包含指定关键字的推文的行为。
这与TwitterKit有可能吗?我一直在寻找一个反过滤器,但似乎没有。
首先,尚不清楚您的源时间表是什么。您是否考虑过使用twtrsearchtimelinedatasource并配置搜索API查询?搜索API支持具有一些逻辑功能的复合查询,因此您可以创建一个可以满足您所有需求的查询。
注意:给定您在问题中提供的链接,我认为您的目标平台是iOS。您可以为Android应用类似的解决方案。
如果搜索API对您来说不够强大,那么您的其他选择是进行一些客户端过滤。我找不到iOS源代码,但是在GitHub上可以找到Android的Twitter套件的某些版本。如果您查看BasticimelineFilter,并且FilterTimelinedElegate,您可以看到在客户端实际上执行了Android过滤。因此,您可以使用iOS应用程序中的任何自定义过滤做同样的事情。您所需要的只是创建一个包装类,该类将实现Twtrtimelinedatasource协议并进行自定义过滤。以下是Objective-C中代码的样子的一些草图(当然,您可以在Swift中进行相同的操作(:
注意: 当心错误,我什至没有编译此代码
.h文件
typedef BOOL (^SOTweetFilter)(TWTRTweet * tweet);
@interface SOFilteredTimelineDataSourceWrapper : NSObject<TWTRTimelineDataSource>
- (instancetype)initWithDataSource:(id<TWTRTimelineDataSource>)dataSource filter:(SOTweetFilter)filter;
@end
.m文件
@implementation SOFilteredTimelineDataSourceWrapper
@property (nonatomic, strong, readwrite) id<TWTRTimelineDataSource> wrapped;
@property (nonatomic, copy) SOTweetFilter filter;
- (instancetype)initWithDataSource:(id<TWTRTimelineDataSource>)dataSource filter:(SOTweetFilter)filter {
if(!(self = [super init])) return self;
self.wrapped = dataSource;
self.filter = filter;
return self;
}
- (void)loadPreviousTweetsBeforePosition:(nullable NSString *)position completion:(TWTRLoadTimelineCompletion)completion {
// typedef void (^TWTRLoadTimelineCompletion)(NSArray<TWTRTweet *> * _Nullable tweets, TWTRTimelineCursor * _Nullable cursor, NSError * _Nullable error);
[wrapped loadPreviousTweetsBeforePosition:position completion:^(NSArray<TWTRTweet *> * _Nullable tweets, TWTRTimelineCursor * _Nullable cursor, NSError * _Nullable error) {
if(error) {
// forward error
completion(tweets, cursor, error);
}
else {
// filter results
NSArray* filtered = [tweets filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:(id evaluatedObject, NSDictionary<NSString *,id> *bindings) {
return self.filter(evaluatedObject);
}]];
completion(filtered, cursor, error);
}
}];
}
// delegate all properties to the wrapped
- (TWTRTimelineType)timelineType {
return wrapped.timelineType;
}
-(TWTRTimelineFilter *)timelineFilter {
return wrapped.timelineFilter;
}
-(void)setTimelineFilter:(TWTRTimelineFilter *)timelineFilter {
wrapped.timelineFilter = timelineFilter;
}
- (TWTRAPIClient *)APIClient{
return wrapped.APIClient;
}
- (void)setAPIClient:(TWTRAPIClient *)APIClient{
wrapped.APIClient = APIClient;
}
@end
主要想法是您在调用原始completion
回调之前拦截loadPreviousTweetsBeforePosition:completion:
调用并添加其他处理。使用此类SOFilteredTimelineDataSourceWrapper
,您可以包装任何其他TWTRTimelineDataSource
,并进行任何要分析twtrtweet.text的过滤。对于提及(即基于操作的(过滤,您可能需要查看Android的实现。