diff options
-rw-r--r-- | Juick/ViewControllers/MessagesViewController.m | 81 | ||||
-rw-r--r-- | Juick/ViewControllers/RevealPanelViewController.m | 2 | ||||
-rw-r--r-- | Juick/Views/MessageCell.m | 4 | ||||
-rw-r--r-- | Juick/Views/MessageCell.xib | 21 |
4 files changed, 76 insertions, 32 deletions
diff --git a/Juick/ViewControllers/MessagesViewController.m b/Juick/ViewControllers/MessagesViewController.m index e8857a7..3e6b7c5 100644 --- a/Juick/ViewControllers/MessagesViewController.m +++ b/Juick/ViewControllers/MessagesViewController.m @@ -26,36 +26,52 @@ static NSString *CellIdentifier = @"MessageCell"; @property(nonatomic, assign) Boolean dataLoading; @property(nonatomic, strong) NSString *path; @property(nonatomic, strong) NSMutableDictionary *params; +@property(nonatomic, strong) dispatch_queue_t concurrent_queue; @end @implementation MessagesViewController +- (id)init { + if (self = [super init]) { + self.concurrent_queue = dispatch_queue_create("Queue", DISPATCH_QUEUE_SERIAL); + }; + return self; +} + - (void)loadFromPath:(NSString *)messagesPath withParams:(NSDictionary *)params withTitle:(NSString *)title { [self setPath:messagesPath]; [self setParams:[[NSMutableDictionary alloc] initWithDictionary:params]]; self.title = title; __weak MessagesViewController * weakSelf = self; - [self.messages removeAllObjects]; - [weakSelf refreshData]; + dispatch_sync(self.concurrent_queue, ^{ + [self.messages removeAllObjects]; + [weakSelf refreshData]; + }); } - (void) refreshData { - if ([self.path isEqualToString:[Message threadUrl]]) { - [self.messages removeAllObjects]; - } - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - self.dataLoading = YES; - [Message pullNextFromPath:self.path params:self.params callback:^(NSArray *next) { - [[NSOperationQueue mainQueue] addOperationWithBlock:^{ - [self.messages addObjectsFromArray:next]; - [self.tableView reloadData]; - [self.refreshControl endRefreshing]; - self.dataLoading = NO; - }]; - }]; - }); + self.dataLoading = YES; + [Message pullNextFromPath:self.path params:self.params callback:^(NSArray *next) { + NSArray *newMsgs = next; + if ([self.path isEqualToString:[Message threadUrl]]) { + NSUInteger lastRid = [((Message *)[self.messages lastObject]).rid unsignedIntegerValue]; + NSUInteger count = [next count] - 1; + NSUInteger oldCount = [self.messages count]; + if (oldCount > 0) { + if (lastRid && lastRid < count) { + newMsgs = [next subarrayWithRange:NSMakeRange(lastRid, count - lastRid)]; + } else { + return; + } + } + } + [self.messages addObjectsFromArray:newMsgs]; + [self.tableView reloadData]; + [self.refreshControl endRefreshing]; + self.dataLoading = NO; + }]; } - (UIStatusBarStyle)preferredStatusBarStyle @@ -119,12 +135,21 @@ static NSString *CellIdentifier = @"MessageCell"; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return _messages.count; + __block NSInteger count; + dispatch_sync(self.concurrent_queue, ^{ + count = self.messages.count; + }); + return count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; - Message *msg = [_messages objectAtIndex:indexPath.row]; + __block Message *msg; + dispatch_sync(self.concurrent_queue, ^{ + msg = [self.messages objectAtIndex:indexPath.row]; + }); + cell.layer.borderWidth = 6; + cell.layer.borderColor = [ColorScheme mainBackground].CGColor; [cell setMessage:msg]; if ([msg.attach length] > 0) { [cell.attach yy_setImageWithURL:[NSURL URLWithString:msg.attach] placeholder:[UIImage imageNamed:@"AttachPlaceholder"] options:YYWebImageOptionProgressiveBlur | YYWebImageOptionSetImageWithFadeAnimation completion:^(UIImage * _Nullable image, NSURL * _Nonnull url, YYWebImageFromType from, YYWebImageStage stage, NSError * _Nullable error) { @@ -146,7 +171,10 @@ static NSString *CellIdentifier = @"MessageCell"; - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if ([self.path isEqualToString:[Message threadUrl]]) return; - Message *msg = [_messages objectAtIndex:indexPath.row]; + __block Message *msg; + dispatch_sync(self.concurrent_queue, ^{ + msg = [self.messages objectAtIndex:indexPath.row]; + }); MessagesViewController *threadViewController = [[MessagesViewController alloc] init]; [threadViewController loadFromPath:[Message threadUrl] withParams:[NSDictionary dictionaryWithObjectsAndKeys:msg.mid, @"mid", nil] withTitle:@"Thread"]; [self.navigationController pushViewController:threadViewController animated:NO]; @@ -156,13 +184,16 @@ static NSString *CellIdentifier = @"MessageCell"; CGFloat actualPosition = scrollView_.contentOffset.y; CGFloat contentHeight = scrollView_.contentSize.height - scrollView_.contentSize.height / 2; if (actualPosition >= contentHeight && !self.dataLoading) { - NSNumber *lastMid = ((Message *)[self.messages lastObject]).mid; - if (![self.path isEqualToString:[Message threadUrl]]) { - [self.params setValue:lastMid forKey:@"before_mid"]; - } - [self refreshData]; + __block Message *lastMsg; + dispatch_sync(self.concurrent_queue, ^{ + lastMsg = [self.messages lastObject]; + NSNumber *lastMid = lastMsg.mid; + if (![self.path isEqualToString:[Message threadUrl]]) { + [self.params setValue:lastMid forKey:@"before_mid"]; + } + [self refreshData]; + }); } } - @end diff --git a/Juick/ViewControllers/RevealPanelViewController.m b/Juick/ViewControllers/RevealPanelViewController.m index b74d556..c327ca6 100644 --- a/Juick/ViewControllers/RevealPanelViewController.m +++ b/Juick/ViewControllers/RevealPanelViewController.m @@ -46,7 +46,7 @@ static NSString *CellIdentifier = @"NavCell"; self.tableView.dataSource = self; [self.tableView setSeparatorInset:UIEdgeInsetsZero]; self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; - self.tableView.separatorColor =[UIColor darkGrayColor]; + self.tableView.separatorColor =[UIColor whiteColor]; [self.tableView registerNib:[UINib nibWithNibName:@"NavCell" bundle:nil] forCellReuseIdentifier:CellIdentifier]; [self.view addSubview:self.tableView]; self.signButton = [[UIButton alloc] init]; diff --git a/Juick/Views/MessageCell.m b/Juick/Views/MessageCell.m index 963707c..13f33a5 100644 --- a/Juick/Views/MessageCell.m +++ b/Juick/Views/MessageCell.m @@ -35,7 +35,9 @@ if ([msg.repliesBy length] > 0) { self.summary.text = [NSString stringWithFormat:@"%@ replies by %@", msg.repliesCount, msg.repliesBy]; } else { - self.summary.text = [NSString stringWithFormat:@"%@ replies", msg.repliesCount]; + if (msg.repliesCount > 0) { + self.summary.text = [NSString stringWithFormat:@"%@ replies", msg.repliesCount]; + } } } else { self.summary.text = nil; diff --git a/Juick/Views/MessageCell.xib b/Juick/Views/MessageCell.xib index c83b579..e555b60 100644 --- a/Juick/Views/MessageCell.xib +++ b/Juick/Views/MessageCell.xib @@ -1,5 +1,8 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11201" systemVersion="15G1004" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11762" systemVersion="16D32" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> + <device id="ipad12_9" orientation="portrait"> + <adaptation id="fullscreen"/> + </device> <dependencies> <deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/> @@ -12,12 +15,14 @@ <rect key="frame" x="0.0" y="0.0" width="592" height="343"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM"> - <frame key="frameInset" width="592" height="342"/> + <rect key="frame" x="0.0" y="0.0" width="592" height="342"/> <autoresizingMask key="autoresizingMask"/> <subviews> - <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" spacing="6" translatesAutoresizingMaskIntoConstraints="NO" id="rE3-Mc-Kov"> + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="rE3-Mc-Kov"> + <rect key="frame" x="12" y="12" width="568" height="318"/> <subviews> <stackView opaque="NO" contentMode="scaleToFill" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="lkI-Na-bF2"> + <rect key="frame" x="0.0" y="0.0" width="103.5" height="48"/> <subviews> <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="kHx-jc-jaD"> <constraints> @@ -26,13 +31,16 @@ </constraints> </imageView> <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="6" translatesAutoresizingMaskIntoConstraints="NO" id="ttr-pF-8Zm"> + <rect key="frame" x="60" y="0.0" width="43.5" height="48"/> <subviews> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zVa-uf-1Mb"> + <rect key="frame" x="0.0" y="0.0" width="43.5" height="26"/> <fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/> <color key="textColor" red="0.0" green="0.40000000000000002" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="252" verticalHuggingPriority="252" horizontalCompressionResistancePriority="751" verticalCompressionResistancePriority="751" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5IY-8Y-0W9"> + <rect key="frame" x="0.0" y="32" width="43.5" height="16"/> <fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/> <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> @@ -42,11 +50,14 @@ </subviews> </stackView> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0Q9-qY-nj2" customClass="TTTAttributedLabel"> + <rect key="frame" x="0.0" y="60" width="42" height="0.0"/> <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <nil key="highlightedColor"/> </label> - <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="53j-SC-IXj"/> + <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="53j-SC-IXj"> + <rect key="frame" x="0.0" y="72" width="568" height="234"/> + </imageView> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zDd-8E-ic8"> <fontDescription key="fontDescription" style="UICTFontTextStyleFootnote"/> <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> |