Skip to content

Commit fe81c54

Browse files
authored
Update TIP to 2.9.0 (#30)
- Fix race condition bug in downloader code - Move TIPImageViewFetchHelper to supporting UIView - Improve rendered cache - Wide gamut color support
1 parent 7235a39 commit fe81c54

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+987
-441
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
language: objective-c
2-
osx_image: xcode8.2
2+
osx_image: xcode9.2
33
script:
44
./build.sh

CHANGELOG.md

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,33 @@
22

33
## Info
44

5-
**Document version:** 2.7.2
5+
**Document version:** 2.9.0
66

7-
**Last updated:** 10/24/2017
7+
**Last updated:** 02/01/2018
88

99
**Author:** Nolan O'Brien
1010

1111
## History
1212

13+
### 2.9.0
14+
15+
- Add P3 color gamut support
16+
- Image scaling preserves P3 (on device's with P3 screens) now
17+
- Add functions to check if a screen supports P3
18+
- Add category property to UIImage to check if image has P3 colorspace
19+
20+
### 2.8.1
21+
22+
- Persist source image dimensions for Rendered Cache
23+
- this provides more context about the source image, such as knowing if the displayed image was scaled up or scaled down
24+
- also added new "RMem" value when showing info with debug info feature on `TIPImageViewFetchHelper`
25+
- improve `TIPImageViewFetchHelper` when reloading an image after a new "matching" image was cached (such as a larger resolution)
26+
27+
### 2.8.0
28+
29+
- Move `TIPImageViewFetchHelper` from using `UIImageView` instances directly to using `UIView` with `TIPImageFetchable` protocol
30+
- makes it possible for `UIView` subclasses to support the fetch helper, like `UIButton` or a custom view
31+
1332
### 2.7.2
1433

1534
- improve `TIPImageFetchTransformer` support with optional identifier

Extended/TIPXMP4Codec.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ __strong tipx_defer_block_t tipx_macro_concat(tipx_stack_defer_block_, __LINE__)
5858

5959
#pragma mark - Declarations
6060

61-
static CGImageRef TIPX_CGImageFromCMSampleBuffer(CMSampleBufferRef sample);
61+
static CGImageRef TIPX_CGImageCreateFromCMSampleBuffer(CMSampleBufferRef sample) CF_RETURNS_RETAINED;
6262

6363
@interface TIPXMP4DecoderConfigInternal : NSObject <TIPXMP4DecoderConfig>
6464
- (instancetype)initWithMaxDecodableFramesCount:(NSUInteger)max;
@@ -281,7 +281,7 @@ - (TIPImageContainer *)renderImageWithMode:(TIPImageDecoderRenderMode)mode
281281
continue;
282282
}
283283

284-
CGImageRef imageRef = TIPX_CGImageFromCMSampleBuffer(sample);
284+
CGImageRef imageRef = TIPX_CGImageCreateFromCMSampleBuffer(sample);
285285
TIPXDeferRelease(imageRef);
286286

287287
if (imageRef) {
@@ -432,7 +432,7 @@ - (instancetype)initWithMaxDecodableFramesCount:(NSUInteger)max
432432

433433
@end
434434

435-
static CGImageRef TIPX_CGImageFromCMSampleBuffer(CMSampleBufferRef sampleBuffer)
435+
static CGImageRef TIPX_CGImageCreateFromCMSampleBuffer(CMSampleBufferRef sampleBuffer)
436436
{
437437
CVImageBufferRef imageBuffer = sampleBuffer ? CMSampleBufferGetImageBuffer(sampleBuffer) : NULL;
438438
if (!imageBuffer) {

ImageSpeedComparison/Base.lproj/Main.storyboard

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12120" systemVersion="16E195" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES" initialViewController="vXZ-lx-hvc">
2+
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" colorMatched="YES" initialViewController="vXZ-lx-hvc">
33
<device id="retina4_7" orientation="portrait">
44
<adaptation id="fullscreen"/>
55
</device>
66
<dependencies>
77
<deployment identifier="iOS"/>
8-
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12088"/>
8+
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
99
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
1010
</dependencies>
11+
<customFonts key="customFonts">
12+
<array key="Menlo.ttc">
13+
<string>Menlo-Regular</string>
14+
</array>
15+
</customFonts>
1116
<scenes>
1217
<!--View Controller-->
1318
<scene sceneID="ufC-wZ-h7g">
@@ -38,8 +43,8 @@
3843
<action selector="select:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="B6A-d6-A5q"/>
3944
</connections>
4045
</button>
41-
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="e4K-h7-ONX">
42-
<rect key="frame" x="260" y="433" width="99" height="30"/>
46+
<button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="e4K-h7-ONX">
47+
<rect key="frame" x="260" y="479" width="99" height="30"/>
4348
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
4449
<state key="normal" title="Start">
4550
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -106,9 +111,4 @@ Final Size: N/A</string>
106111
<point key="canvasLocation" x="214.5" y="250.5"/>
107112
</scene>
108113
</scenes>
109-
<simulatedMetricsContainer key="defaultSimulatedMetrics">
110-
<simulatedStatusBarMetrics key="statusBar"/>
111-
<simulatedOrientationMetrics key="orientation"/>
112-
<simulatedScreenMetrics key="destination" type="retina4_7.fullscreen"/>
113-
</simulatedMetricsContainer>
114114
</document>

ImageSpeedComparison/ViewController.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ - (void)viewDidLayoutSubviews
119119
frame.origin.y = CGRectGetMaxY(_selectImageTypeButton.frame) + 5;
120120
_selectSpeedButton.frame = frame;
121121

122+
frame = _selectSpeedButton.frame;
123+
frame.origin.y += frame.size.height;
124+
frame.size = _blurSwitch.bounds.size;
125+
frame.origin.x = self.view.bounds.size.width - (frame.size.width + 5);
126+
_blurSwitch.frame = frame;
127+
122128
frame = _startButton.frame;
123129
frame.origin.y = CGRectGetMaxY(_selectSpeedButton.frame) + 5;
124130
_startButton.frame = frame;

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,8 @@ image pipeline works.
210210
- powerful class that can encapsulate the majority of use cases for loading an image and displaying it in a `UIImageView`
211211
- 99% of image loading and displaying use cases can be solved by using this class, configuring it and providing a delegate and/or data source
212212
- having the logic in this class avoid coupling _controller_ code with _view_ code in the _MVC_ practice
213-
- `UIImageView(TIPImageViewFetchHelper)`
214-
- convenience category on `UIImageView` for associating a `TIPImageViewFetchHelper`
213+
- `UIView(TIPImageFetchable)` and `UIImageView(TIPImageFetchable)`
214+
- convenience categories on `UIImageView` and `UIView` for associating a `TIPImageViewFetchHelper`
215215

216216
## Usage
217217

TIP Sample App/TwitterSearchViewController.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ - (nullable TIPImagePipeline *)tip_imagePipelineForFetchHelper:(nonnull TIPImage
218218
return nil;
219219
}
220220

221-
TweetImageFetchRequest *request = [[TweetImageFetchRequest alloc] initWithTweetImage:tweetImage targetView:helper.fetchImageView];
221+
TweetImageFetchRequest *request = [[TweetImageFetchRequest alloc] initWithTweetImage:tweetImage targetView:helper.fetchView];
222222
request.forcePlaceholder = APP_DELEGATE.usePlaceholder;
223223
return request;
224224
}
@@ -243,7 +243,7 @@ - (BOOL)tip_fetchHelper:(nonnull TIPImageViewFetchHelper *)helper shouldContinue
243243
}
244244

245245
const CGSize originalDimensions = previewImageResult.imageOriginalDimensions;
246-
const CGSize viewDimensions = TIPDimensionsFromView(helper.fetchImageView);
246+
const CGSize viewDimensions = TIPDimensionsFromView(helper.fetchView);
247247
if (originalDimensions.height >= viewDimensions.height && originalDimensions.width >= viewDimensions.width) {
248248
return NO;
249249
}

TIP Swift Sample App/AppDelegate.swift

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, TIPImagePipelineObserver,
9595

9696
// MARK: private functions
9797

98-
private func incrementNetworkOperations() -> Void
98+
private func incrementNetworkOperations()
9999
{
100100
if (Thread.isMainThread) {
101101
self.incOps()
@@ -106,7 +106,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, TIPImagePipelineObserver,
106106
}
107107
}
108108

109-
private func decrementNetworkOperations() -> Void
109+
private func decrementNetworkOperations()
110110
{
111111
if (Thread.isMainThread) {
112112
self.decOps()
@@ -117,15 +117,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate, TIPImagePipelineObserver,
117117
}
118118
}
119119

120-
private func incOps() -> Void
120+
private func incOps()
121121
{
122122
self.opCount += 1
123123
if (self.opCount > 0) {
124124
UIApplication.shared.isNetworkActivityIndicatorVisible = true
125125
}
126126
}
127127

128-
private func decOps() -> Void
128+
private func decOps()
129129
{
130130
self.opCount -= 1
131131
if (self.opCount <= 0) {
@@ -163,26 +163,18 @@ class AppDelegate: UIResponder, UIApplicationDelegate, TIPImagePipelineObserver,
163163
{
164164
let levelString: String
165165
switch (level) {
166-
case .emergency:
167-
fallthrough
168-
case .alert:
169-
fallthrough
170-
case .critical:
171-
fallthrough
172-
case .error:
173-
levelString = "ERR"
174-
break
175-
case .warning:
176-
levelString = "WRN"
177-
break
178-
case .notice:
179-
fallthrough
180-
case .information:
181-
levelString = "INF"
182-
break
183-
case .debug:
184-
levelString = "DBG"
185-
break
166+
case .emergency,
167+
.alert,
168+
.critical,
169+
.error:
170+
levelString = "ERR"
171+
case .warning:
172+
levelString = "WRN"
173+
case .notice,
174+
.information:
175+
levelString = "INF"
176+
case .debug:
177+
levelString = "DBG"
186178
}
187179

188180
print("[\(levelString): \(message)")

TIP Swift Sample App/Assets.xcassets/AppIcon.appiconset/Contents.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,6 @@
3939
"idiom" : "iphone",
4040
"size" : "60x60",
4141
"scale" : "3x"
42-
},
43-
{
44-
"idiom" : "ios-marketing",
45-
"size" : "1024x1024",
46-
"scale" : "1x"
4742
}
4843
],
4944
"info" : {

TIP Swift Sample App/TweetImageFetchRequest.swift

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,36 +35,32 @@ class TweetImageFetchRequest: NSObject, TIPImageFetchRequest {
3535

3636
@objc var targetDimensions: CGSize
3737
@objc var targetContentMode: UIViewContentMode
38+
3839
@objc var imageIdentifier: String? {
39-
get {
40-
return self.tweetImageInfo.baseURLString
41-
}
40+
return self.tweetImageInfo.baseURLString
4241
}
42+
4343
@objc var imageURL: URL {
44-
get {
45-
if nil == self.internalImageURL {
46-
if self.forcePlaceholder {
47-
self.internalImageURL = URL.init(string: "placeholder://placeholder.com/placeholder.jpg")
44+
if nil == self.internalImageURL {
45+
if self.forcePlaceholder {
46+
self.internalImageURL = URL.init(string: "placeholder://placeholder.com/placeholder.jpg")
47+
} else {
48+
let URLString: String
49+
if self.tweetImageInfo.baseURLString.hasPrefix("https://pbs.twimg.com/media/") {
50+
let variantName = TweetImageDetermineVariant(self.tweetImageInfo.originalDimensions, self.targetDimensions, self.targetContentMode)
51+
let format = APP_DELEGATE().searchWebP ? "webp" : self.tweetImageInfo.format
52+
URLString = "\(self.tweetImageInfo.baseURLString)?format=\(format)&name=\(variantName)"
4853
} else {
49-
let URLString: String
50-
if self.tweetImageInfo.baseURLString.hasPrefix("https://pbs.twimg.com/media/") {
51-
let variantName = TweetImageDetermineVariant(self.tweetImageInfo.originalDimensions, self.targetDimensions, self.targetContentMode)
52-
let format = APP_DELEGATE().searchWebP ? "webp" : self.tweetImageInfo.format
53-
URLString = "\(self.tweetImageInfo.baseURLString)?format=\(format)&name=\(variantName)"
54-
} else {
55-
URLString = "\(self.tweetImageInfo.baseURLString).\(self.tweetImageInfo.format)"
56-
}
57-
self.internalImageURL = URL.init(string: URLString)
54+
URLString = "\(self.tweetImageInfo.baseURLString).\(self.tweetImageInfo.format)"
5855
}
56+
self.internalImageURL = URL.init(string: URLString)
5957
}
60-
61-
return self.internalImageURL!
6258
}
59+
60+
return self.internalImageURL!
6361
}
6462
@objc var options: TIPImageFetchOptions {
65-
get {
66-
return self.forcePlaceholder ? [.treatAsPlaceholder] : []
67-
}
63+
return self.forcePlaceholder ? [.treatAsPlaceholder] : []
6864
}
6965

7066
init(tweetImage tweet: TweetImageInfo, targetView view: UIView?)

TIP Swift Sample App/TwitterSearchViewController.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class TweetWithMediaTableViewCell: UITableViewCell, TIPImageViewFetchHelperDataS
9696
return nil
9797
}
9898

99-
let request = TweetImageFetchRequest.init(tweetImage: tweetImage, targetView: helper.fetchImageView)
99+
let request = TweetImageFetchRequest.init(tweetImage: tweetImage, targetView: helper.fetchView)
100100
request.forcePlaceholder = APP_DELEGATE().usePlaceholder
101101
return request
102102
}
@@ -121,7 +121,7 @@ class TweetWithMediaTableViewCell: UITableViewCell, TIPImageViewFetchHelperDataS
121121
}
122122
}
123123

124-
guard let fetchImageView = helper.fetchImageView else {
124+
guard let fetchImageView = helper.fetchView else {
125125
// don't have a view to compare with, stop
126126
return false
127127
}
@@ -268,12 +268,12 @@ class TwitterSearchViewController: UIViewController, UISearchResultsUpdating, UI
268268
self.searchController!.searchBar.isUserInteractionEnabled = false
269269
searchBar.text = self.term
270270

271-
TwitterAPI.sharedInstance().search(forTerm: (nil != self.term) ? self.term! : "", count: APP_DELEGATE().searchCount, complete: {
272-
tweets, error in
271+
TwitterAPI.sharedInstance().search(forTerm: (nil != self.term) ? self.term! : "", count: APP_DELEGATE().searchCount) { tweets, _ in
272+
273273
self.tweets = tweets
274274
self.searchController?.searchBar.isUserInteractionEnabled = true
275275
self.tableView?.reloadData()
276-
})
276+
}
277277
}
278278

279279
func willPresentSearchController(_ searchController: UISearchController)

TwitterImagePipeline.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'TwitterImagePipeline'
3-
s.version = '2.7.2'
3+
s.version = '2.9.0'
44
s.summary = 'Twitter Image Pipeline is a robust and performant image loading and caching framework for iOS'
55
s.description = 'Twitter created a framework for image loading/caching in order to fulfill the numerous needs of Twitter for iOS including being fast, safe, modular and versatile.'
66
s.homepage = 'https://github.com/twitter/ios-twitter-logging-service'

0 commit comments

Comments
 (0)