首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TwitterKit过滤时间线但是相反?

TwitterKit过滤时间线但是相反?
EN

Stack Overflow用户
提问于 2017-05-03 22:07:35
回答 1查看 272关注 0票数 3

我正在通过Fabric TwitterKit在我的应用程序中显示一个推特时间表。

我想通过只显示tweets @某个特定用户来过滤时间线。我阅读了这里关于如何在时间线中过滤tweet的文档。不幸的是,他们提供的函数将排除时间线中包含指定关键字/s的任何tweet。

我要寻找的行为将只包括时间线中包含指定关键字/s的tweet。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-22 22:04:53

首先,还不清楚你的源时间线是什么。您考虑过使用TWTRSearchTimelineDataSource和配置搜索API查询吗?Search支持带有一些逻辑函数的复合查询,因此您可能能够创建一个满足所有需要的查询。

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

如果搜索API对您来说不够强大,则您的另一个选择是执行一些客户端筛选。我无法找到iOS源代码,但是用于Android的Twitter工具包的某些版本可以在GitHub上找到。如果您查看BasicTimelineFilterFilterTimelineDelegate,您可以看到在Android中实际上是在客户端执行的。因此,您可以对iOS应用程序中的任何自定义筛选进行同样的操作。您所需要的只是创建一个包装类,它将实现TWTRTimelineDataSource协议并进行自定义筛选。下面是一些代码在Objective中的样子的草图(当然,您也可以在Swift中这样做):

注意:提防bug,我甚至还没有编译这段代码

.h文件

代码语言:javascript
复制
typedef BOOL (^SOTweetFilter)(TWTRTweet * tweet);

@interface SOFilteredTimelineDataSourceWrapper : NSObject<TWTRTimelineDataSource>

- (instancetype)initWithDataSource:(id<TWTRTimelineDataSource>)dataSource filter:(SOTweetFilter)filter;

@end

.m文件

代码语言:javascript
复制
@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实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43770783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档