TwitterKit过滤时间线但反过来?

时间:2017-05-03 22:07:35

标签: twitter twitter-fabric

我通过Fabric TwitterKit在我的应用中显示了Twitter时间轴。

我想通过仅显示特定用户的推文来过滤时间线。我已阅读here中有关如何在时间轴中过滤推文的文档。不幸的是,他们提供的功能将排除在时间轴中包含指定关键字的任何推文。

我正在寻找的行为只包含时间轴中包含指定关键字的推文。

这可能与TwitterKit有关吗?我一直在为此寻找逆滤波器,但似乎没有。

1 个答案:

答案 0 :(得分:1)

首先,不清楚您的来源时间表是什么。您是否考虑过使用TWTRSearchTimelineDataSource并配置Search API query? Search API支持具有一些逻辑功能的复合查询,因此您可以创建一个满足您所有需求的查询。

注意:根据您在问题中提供的链接,我假设您的目标平台是iOS。您可以为Android应用类似的解决方案。

如果搜索API不够强大,您的另一个选择是进行一些客户端过滤。我无法找到iOS源代码,但GitHub上提供了某些版本的Twitter Kit for Android。如果你看BasicTimelineFilterFilterTimelineDelegate,您可以看到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

主要想法是在调用原始loadPreviousTweetsBeforePosition:completion:回调之前拦截completion调用并添加其他处理。使用此类SOFilteredTimelineDataSourceWrapper,您可以包装任何其他TWTRTimelineDataSource并执行您想要分析TWTRTweet.text的任何过滤。对于提及(即基于句柄)的过滤,您可能需要查看normalizeHandle的Android实现。