【问题标题】:TwitterKit filter timeline but inversely?TwitterKit 过滤时间线但相反?
【发布时间】:2017-05-23 06:10:49
【问题描述】:

我正在通过FabricTwitterKit 在我的应用程序中显示推特时间线。

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

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

这可能与 TwitterKit 相关吗?我一直在为此寻找一个反向过滤器,但似乎没有。

【问题讨论】:

    标签: twitter twitter-fabric


    【解决方案1】:

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

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

    如果搜索 API 对您来说不够强大,您的另一个选择是进行一些客户端过滤。我找不到 iOS 源代码,但某些版本的 Twitter Kit for Android 可以在 GitHub 上找到。如果您查看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 实现。

    【讨论】:

    • 欣赏详细资料!抱歉,我忘了提及我的来源时间线。它将属于特定用户的时间线 (TWTRUserTimelineDataSource)。我只想显示包含对另一个用户的特定提及的推文,并排除其余的。是否与您在上面使用Search API 建议的解决方案相同?
    • @aresz,考虑到这样的要求,我会尝试使用TWTRSearchTimelineDataSource 和搜索查询from:author_user_account @mentioned_user_account。文档中提到了一个可能的缺点:您可能只会获得大约 1 周的相对较短的历史记录。如果此查询属于这种情况并且您无法接受,则您可能必须按照我的回答第二部分中的说明切换到本地过滤。
    • 啊,我明白了。 1 周的短历史记录对于我正在制作的应用程序来说并不理想,所以我可能不得不选择你提到的本地过滤路线。我会继续进行。谢谢。
    • @aresz,我建议你还是先试试TWTRSearchTimelineDataSource。我怀疑不同类型的查询的历史限制可能不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2010-10-12
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2012-01-22
    • 2015-11-03
    相关资源
    最近更新 更多