Skip to content

Commit

Permalink
Update for Swift 2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
MoZhouqi committed Sep 27, 2015
1 parent 8d33663 commit d328ca3
Show file tree
Hide file tree
Showing 75 changed files with 5,626 additions and 2,763 deletions.
10 changes: 9 additions & 1 deletion PhotoBrowser.xcodeproj/project.pbxproj
Expand Up @@ -223,7 +223,8 @@
CDC9FB1D1A47AAC600466910 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0610;
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0700;
ORGANIZATIONNAME = "Zhouqi Mo";
TargetAttributes = {
CDC9FB241A47AAC600466910 = {
Expand Down Expand Up @@ -398,6 +399,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
Expand Down Expand Up @@ -460,9 +462,11 @@
baseConfigurationReference = 52F082102CF08DB999443C8E /* Pods.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
INFOPLIST_FILE = PhotoBrowser/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.mo.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "PhotoBrowser/PhotoBrowser-ObjCBridging.h";
};
Expand All @@ -473,9 +477,11 @@
baseConfigurationReference = 562441392257558E47EC0588 /* Pods.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "iPhone Developer";
INFOPLIST_FILE = PhotoBrowser/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.mo.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "PhotoBrowser/PhotoBrowser-ObjCBridging.h";
};
Expand All @@ -495,6 +501,7 @@
);
INFOPLIST_FILE = PhotoBrowserTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.mo.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PhotoBrowser.app/PhotoBrowser";
};
Expand All @@ -510,6 +517,7 @@
);
INFOPLIST_FILE = PhotoBrowserTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.mo.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PhotoBrowser.app/PhotoBrowser";
};
Expand Down
11 changes: 7 additions & 4 deletions PhotoBrowser/AppDelegate.swift
Expand Up @@ -61,9 +61,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate, FICImageCacheDelegate {
let request = NSURLRequest(URL: imageURL)

entity.request = Alamofire.request(.GET, request).validate(contentType: ["image/*"]).responseImage() {
(_, _, image, error) in
if (error == nil) {
(_, _, result) in
switch result {
case .Success(let image):
completionBlock(image)
case .Failure:
break;
}
}
}
Expand All @@ -74,7 +77,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, FICImageCacheDelegate {
if let entity = entity as? PhotoInfo, request = entity.request {
request.cancel()
entity.request = nil
//println("be canceled:\(entity.UUID)")
//debugPrint("be canceled:\(entity.UUID)")
}
}

Expand All @@ -83,7 +86,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, FICImageCacheDelegate {
}

func imageCache(imageCache: FICImageCache!, errorDidOccurWithMessage errorMessage: String!) {
println("errorMessage" + errorMessage)
debugPrint("errorMessage" + errorMessage)
}
}

5 changes: 3 additions & 2 deletions PhotoBrowser/Base.lproj/Main.storyboard
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6254" systemVersion="14B25" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="CpL-7C-w39">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8191" systemVersion="14F27" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="CpL-7C-w39">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6247"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8154"/>
</dependencies>
<scenes>
<!--Login-->
Expand Down
28 changes: 14 additions & 14 deletions PhotoBrowser/CoreDataStack.swift
Expand Up @@ -35,33 +35,33 @@ class CoreDataStack {
let options =
[NSMigratePersistentStoresAutomaticallyOption: true]

var error: NSError? = nil
store = psc.addPersistentStoreWithType(NSSQLiteStoreType,
configuration: nil,
URL: storeURL,
options: options,
error:&error)

if store == nil {
println("Error adding persistent store: \(error)")
do {
try store = psc.addPersistentStoreWithType(NSSQLiteStoreType,
configuration: nil,
URL: storeURL,
options: options)
} catch {
debugPrint("Error adding persistent store: \(error)")
abort()
}

}

func saveContext() {

var error: NSError? = nil
if context.hasChanges && !context.save(&error) {
println("Could not save: \(error), \(error?.userInfo)")
if context.hasChanges {
do {
try context.save()
} catch {
debugPrint("Could not save: \(error)")
}
}

}

func applicationDocumentsDirectory() -> NSURL {

let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1] as! NSURL
return urls[urls.count-1]
}

}
7 changes: 6 additions & 1 deletion PhotoBrowser/Info.plist
Expand Up @@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>com.mo.$(PRODUCT_NAME:rfc1034identifier)</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
Expand All @@ -34,5 +34,10 @@
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
</dict>
</plist>
39 changes: 24 additions & 15 deletions PhotoBrowser/Instagram.swift
Expand Up @@ -27,8 +27,10 @@ struct Instagram {
return (urlString, params)
}

var URLRequest: NSURLRequest {
let (path: String, parameters: [String: AnyObject]) = {
// MARK: URLRequestConvertible

var URLRequest: NSMutableURLRequest {
let result: (path: String, parameters: [String: AnyObject]?) = {
switch self {
case .PopularPhotos (let userID, let accessToken):
let params = ["access_token": accessToken]
Expand All @@ -41,32 +43,39 @@ struct Instagram {
}
}()

let BaeseURL = NSURL(string: Router.baseURLString)
var URLRequest = NSURLRequest(URL: BaeseURL!.URLByAppendingPathComponent(path))
let BaeseURL = NSURL(string: Router.baseURLString)!
let URLRequest = NSURLRequest(URL: BaeseURL.URLByAppendingPathComponent(result.path))
let encoding = Alamofire.ParameterEncoding.URL
return encoding.encode(URLRequest, parameters: parameters).0
return encoding.encode(URLRequest, parameters: result.parameters).0
}
}

}

extension Alamofire.Request {
class func imageResponseSerializer() -> Serializer {
return { request, response, data in
if data == nil {
return (nil, nil)
class func imageResponseSerializer() -> GenericResponseSerializer<UIImage> {
return GenericResponseSerializer { request, response, data in
guard let validData = data where validData.length > 0 else {
return .Failure(data, Request.imageDataError())
}

let image = UIImage(data: data!, scale: UIScreen.mainScreen().scale)
if let image = UIImage(data: validData, scale: UIScreen.mainScreen().scale) {
return Result<UIImage>.Success(image)
}
else {
return .Failure(data, Request.imageDataError())
}

return (image, nil)
}
}

func responseImage(completionHandler: (NSURLRequest, NSHTTPURLResponse?, UIImage?, NSError?) -> Void) -> Self {
return response(serializer: Request.imageResponseSerializer(), completionHandler: { (request, response, image, error) in
completionHandler(request, response, image as? UIImage, error)
})
func responseImage(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<UIImage>) -> Void) -> Self {
return response(responseSerializer: Request.imageResponseSerializer(), completionHandler: completionHandler)
}

private class func imageDataError() -> NSError {
let failureReason = "Failed to create a valid Image from the response data"
return Error.errorWithCode(NSURLErrorCannotDecodeContentData, failureReason: failureReason)
}
}

22 changes: 12 additions & 10 deletions PhotoBrowser/OauthLoginViewController.swift
Expand Up @@ -24,7 +24,7 @@ class OauthLoginViewController: UIViewController {
super.viewWillAppear(animated)
webView.hidden = true
NSURLCache.sharedURLCache().removeAllCachedResponses()
if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies as? [NSHTTPCookie] {
if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies {
for cookie in cookies {
NSHTTPCookieStorage.sharedHTTPCookieStorage().deleteCookie(cookie)
}
Expand Down Expand Up @@ -52,13 +52,13 @@ class OauthLoginViewController: UIViewController {

extension OauthLoginViewController: UIWebViewDelegate {
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
println(request.URLString)
debugPrint(request.URLString)
let urlString = request.URLString
if let range = urlString.rangeOfString(Instagram.Router.redirectURI + "?code=") {

let location = range.endIndex
let code = urlString.substringFromIndex(location)
println(code)
debugPrint(code)
requestAccessToken(code)
return false
}
Expand All @@ -70,11 +70,11 @@ extension OauthLoginViewController: UIWebViewDelegate {

Alamofire.request(.POST, request.URLString, parameters: request.Params)
.responseJSON {
(_, _, jsonObject, error) in

if (error == nil) {
//println(jsonObject)
let json = JSON(jsonObject!)
(_, _, result) in
switch result {
case .Success(let jsonObject):
//debugPrint(jsonObject)
let json = JSON(jsonObject)

if let accessToken = json["access_token"].string, userID = json["user"]["id"].string {
let user = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: self.coreDataStack.context) as! User
Expand All @@ -83,15 +83,17 @@ extension OauthLoginViewController: UIWebViewDelegate {
self.coreDataStack.saveContext()
self.performSegueWithIdentifier("unwindToPhotoBrowser", sender: ["user": user])
}
case .Failure:
break;
}

}
}

func webViewDidFinishLoad(webView: UIWebView) {
webView.hidden = false
}

func webView(webView: UIWebView, didFailLoadWithError error: NSError) {
func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {

}
}
33 changes: 18 additions & 15 deletions PhotoBrowser/PhotoBrowserCollectionViewController.swift
Expand Up @@ -47,10 +47,9 @@ class PhotoBrowserCollectionViewController: UICollectionViewController, UICollec
super.viewDidLoad()
setupView()

var error: NSError?
if let fetchRequest = coreDataStack.model.fetchRequestTemplateForName("UserFetchRequest") {

let results = coreDataStack.context.executeFetchRequest(fetchRequest,error: &error) as! [User]
let results = try! coreDataStack.context.executeFetchRequest(fetchRequest) as! [User]
user = results.first
}

Expand Down Expand Up @@ -145,7 +144,7 @@ class PhotoBrowserCollectionViewController: UICollectionViewController, UICollec
}
}

func populatePhotos(request:URLRequestConvertible) {
func populatePhotos(request: URLRequestConvertible) {

if populatingPhotos {
return
Expand All @@ -154,11 +153,14 @@ class PhotoBrowserCollectionViewController: UICollectionViewController, UICollec
populatingPhotos = true

Alamofire.request(request).responseJSON() {
(_ , _, jsonObject, error) in

if (error == nil) {
//println(jsonObject)
let json = JSON(jsonObject!)
(_ , _, result) in
defer {
self.populatingPhotos = false
}
switch result {
case .Success(let jsonObject):
//debugPrint(jsonObject)
let json = JSON(jsonObject)

if (json["meta"]["code"].intValue == 200) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
Expand All @@ -176,7 +178,7 @@ class PhotoBrowserCollectionViewController: UICollectionViewController, UICollec
})

let lastItem = self.photos.count
self.photos.extend(photoInfos)
self.photos.appendContentsOf(photoInfos)

let indexPaths = (lastItem..<self.photos.count).map { NSIndexPath(forItem: $0, inSection: 0) }

Expand All @@ -187,9 +189,9 @@ class PhotoBrowserCollectionViewController: UICollectionViewController, UICollec
}

}

case .Failure:
break;
}
self.populatingPhotos = false

}
}
Expand All @@ -201,8 +203,8 @@ class PhotoBrowserCollectionViewController: UICollectionViewController, UICollec
self.collectionView!.reloadData()
refreshControl.endRefreshing()
if user != nil {
let urlString = Instagram.Router.PopularPhotos(user!.userID, user!.accessToken)
populatePhotos(urlString)
let request = Instagram.Router.PopularPhotos(user!.userID, user!.accessToken)
populatePhotos(request)
}
}

Expand All @@ -215,6 +217,7 @@ class PhotoBrowserCollectionViewController: UICollectionViewController, UICollec
logoutButtonItem.enabled = true
}
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "show photo" && segue.destinationViewController.isKindOfClass(PhotoViewerViewController.classForCoder()) {
let photoViewerViewController = segue.destinationViewController as! PhotoViewerViewController
Expand All @@ -238,7 +241,7 @@ class PhotoBrowserCollectionViewCell: UICollectionViewCell {
var photoInfo: PhotoInfo?


required init(coder aDecoder: NSCoder) {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

Expand All @@ -255,7 +258,7 @@ class PhotoBrowserCollectionViewCell: UICollectionViewCell {
class PhotoBrowserLoadingCollectionView: UICollectionReusableView {
let spinner = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)

required init(coder aDecoder: NSCoder) {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

Expand Down

0 comments on commit d328ca3

Please sign in to comment.