1
This commit is contained in:
@@ -25,6 +25,8 @@
|
||||
#import "KBTagItemModel.h"
|
||||
#import <MJExtension/MJExtension.h>
|
||||
|
||||
static NSTimeInterval const kKBStreamIdleTimeout = 5.0;
|
||||
|
||||
@interface KBFunctionView () <KBFunctionBarViewDelegate, KBStreamOverlayViewDelegate, KBFunctionTagListViewDelegate>
|
||||
// UI
|
||||
@property (nonatomic, strong) KBFunctionBarView *barViewInternal;
|
||||
@@ -44,6 +46,8 @@
|
||||
@property (nonatomic, assign) BOOL streamHasOutput; // 是否已输出过正文(首段去首个 \t 用)
|
||||
@property (nonatomic, strong, nullable) NSNumber *loadingTagIndex; // 当前显示loading的标签index
|
||||
@property (nonatomic, copy, nullable) NSString *loadingTagTitle;
|
||||
@property (nonatomic, strong, nullable) NSTimer *streamIdleTimer;
|
||||
@property (nonatomic, assign) BOOL streamTimeoutTriggered;
|
||||
|
||||
// Data
|
||||
//@property (nonatomic, strong) NSArray<NSString *> *itemsInternal;
|
||||
@@ -292,6 +296,7 @@
|
||||
}
|
||||
NSString *message = seedTitle.length > 0 ? seedTitle : @"";
|
||||
NSInteger resolvedCharacterId = (characterId > 0) ? characterId : 75;
|
||||
message = [NSString stringWithFormat:@"%@-%u",message,arc4random() % 10000];
|
||||
NSDictionary *payload = @{
|
||||
@"characterId": @(resolvedCharacterId),
|
||||
@"message": message.length > 0 ? message : @"aliqua non cupidatat"
|
||||
@@ -327,15 +332,24 @@
|
||||
};
|
||||
fetcher.onFinish = ^(NSError * _Nullable error) {
|
||||
__strong typeof(weakSelf) self = weakSelf; if (!self) return;
|
||||
[self kb_invalidateStreamIdleTimer];
|
||||
if (self.streamTimeoutTriggered) {
|
||||
self.streamTimeoutTriggered = NO;
|
||||
return;
|
||||
}
|
||||
// 若还未出现任何数据且仍在 loading,则取消小菊花
|
||||
if (!self.streamHasOutput && self.loadingTagIndex) {
|
||||
[self.tagListView setLoading:NO atIndex:self.loadingTagIndex.integerValue];
|
||||
self.loadingTagIndex = nil; self.loadingTagTitle = nil;
|
||||
}
|
||||
if (error) { [KBHUD showInfo:KBLocalized(@"拉取失败")]; }
|
||||
BOOL isCancelledError = (error && error.code == NSURLErrorCancelled);
|
||||
if (error && !isCancelledError) { [KBHUD showInfo:KBLocalized(@"拉取失败")]; }
|
||||
if (self.streamOverlay) { [self.streamOverlay finish]; }
|
||||
self.streamTimeoutTriggered = NO;
|
||||
};
|
||||
self.streamFetcher = fetcher;
|
||||
self.streamTimeoutTriggered = NO;
|
||||
[self kb_restartStreamIdleTimer];
|
||||
[self.streamFetcher start];
|
||||
}
|
||||
|
||||
@@ -343,6 +357,8 @@
|
||||
[self.streamFetcher cancel];
|
||||
self.streamFetcher = nil;
|
||||
self.streamHasOutput = NO;
|
||||
[self kb_invalidateStreamIdleTimer];
|
||||
self.streamTimeoutTriggered = NO;
|
||||
}
|
||||
|
||||
#pragma mark - Helpers
|
||||
@@ -363,6 +379,42 @@
|
||||
if (!self.streamOverlay) return;
|
||||
[self.streamOverlay appendChunk:chunk];
|
||||
self.streamHasOutput = YES;
|
||||
[self kb_restartStreamIdleTimer];
|
||||
}
|
||||
|
||||
- (void)kb_restartStreamIdleTimer {
|
||||
[self.streamIdleTimer invalidate];
|
||||
if (!self.streamFetcher) {
|
||||
self.streamIdleTimer = nil;
|
||||
return;
|
||||
}
|
||||
__weak typeof(self) weakSelf = self;
|
||||
self.streamIdleTimer = [NSTimer scheduledTimerWithTimeInterval:kKBStreamIdleTimeout repeats:NO block:^(NSTimer * _Nonnull timer) {
|
||||
__strong typeof(weakSelf) self = weakSelf;
|
||||
[self kb_handleStreamIdleTimeout];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)kb_invalidateStreamIdleTimer {
|
||||
[self.streamIdleTimer invalidate];
|
||||
self.streamIdleTimer = nil;
|
||||
}
|
||||
|
||||
- (void)kb_handleStreamIdleTimeout {
|
||||
[self kb_invalidateStreamIdleTimer];
|
||||
if (!self.streamFetcher) { return; }
|
||||
self.streamTimeoutTriggered = YES;
|
||||
[self.streamFetcher cancel];
|
||||
self.streamFetcher = nil;
|
||||
if (self.loadingTagIndex) {
|
||||
[self.tagListView setLoading:NO atIndex:self.loadingTagIndex.integerValue];
|
||||
self.loadingTagIndex = nil;
|
||||
self.loadingTagTitle = nil;
|
||||
}
|
||||
if (self.streamOverlay) {
|
||||
[self.streamOverlay finish];
|
||||
}
|
||||
[KBHUD showInfo:KBLocalized(@"Response timeout")];
|
||||
}
|
||||
|
||||
/// 统一更新左侧粘贴按钮的展示:
|
||||
|
||||
Reference in New Issue
Block a user