-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUserStore.swift
151 lines (119 loc) · 4.8 KB
/
UserStore.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//
// UserStore.swift
// Kapıştır
//
// Created by Evren Yortuçboylu on 16/03/16.
// Copyright © 2016 Evren Yortuçboylu. All rights reserved.
//
import Foundation
import Kingfisher
import Crashlytics
class UserStore{
typealias callback = (loggedUser: User)-> Void
private static var _user: User?
static var user: User? {
return _user
}
private static var _callbacks = [callback]()
static func registerUpdateCallback(block: callback) {
self._callbacks.append(block)
}
private static func publishUpdate(){
// notify changes to subscribers
for block in self._callbacks {
block(loggedUser: self.user!)
}
}
static func updateUser(user: User?){
print("user will be updated")
self._user = user
if let userData = user {
KingfisherManager.sharedManager.retrieveImageWithURL(
NSURL(string: userData.profileImageUrl)!,
optionsInfo: nil,
progressBlock: nil,
completionHandler: { (image, error, cacheType, imageURL) -> () in
print("image downloaded \(imageURL)")
if error == nil {
self._user!.profileImage = image
self.saveUserLocal(self._user!)
self.publishUpdate()
}
else{
// profile image download error
print("profile image download error")
}
})
}
else{
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setValue(nil, forKey: "userName")
}
}
private static func saveUserLocal(user: User) {
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setValue(user.userId, forKey: "userId")
defaults.setValue(user.facebookId, forKey: "facebookId")
defaults.setValue(user.userName, forKey: "userName")
defaults.setValue(user.profileImageUrl, forKey: "profileImageUrl")
if let userImage = self.user!.profileImage {
print("save user local with image")
saveProfileImageLocal(userImage)
}
}
static func loadUserLocal() {
let defaults = NSUserDefaults.standardUserDefaults()
// localde kayıtlı kullanıcı var mı?
if let userName = defaults.valueForKey("userName") {
let profileImage = loadProfileImageLocal()
self._user = User(
userName: userName as! String,
userId: defaults.valueForKey("userId") as! String,
profileImageUrl: defaults.valueForKey("profileImageUrl") as! String,
facebookId: defaults.valueForKey("facebookId") as! String,
profileImage: profileImage,
questions: [Question](),
userVotedOption: nil
)
print("loading user local \(self._user)")
self.publishUpdate()
// Crashlytics.sharedInstance().setUserEmail("user@fabric.io")
Crashlytics.sharedInstance().setUserIdentifier(self._user!.facebookId)
Crashlytics.sharedInstance().setUserName(self._user!.userName)
}
}
private static func saveProfileImageLocal(image: UIImage) -> Bool {
print("saving image to local")
let imagePath = fileInDocumentsDirectory("userProfileImage.jpeg")
let jpgImageData = UIImageJPEGRepresentation(image, 1.0) // if you want to save as JPEG
let result = jpgImageData!.writeToFile(imagePath, atomically: true)
return result
}
private static func loadProfileImageLocal() -> UIImage? {
print("loading image form local")
let imagePath = fileInDocumentsDirectory("userProfileImage.jpeg")
let image = loadImageFromPath(imagePath)
print("\(image)")
return image
}
}
extension String {
func stringByAppendingPathComponent(path: String) -> String {
let nsSt = self as NSString
return nsSt.stringByAppendingPathComponent(path)
}
}
// Documents directory
func documentsDirectory() -> String {
let documentsFolderPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
return documentsFolderPath
}
// File in Documents directory
func fileInDocumentsDirectory(filename: String) -> String {
return documentsDirectory().stringByAppendingPathComponent(filename)
}
func loadImageFromPath(path: String) -> UIImage? {
let data = NSData(contentsOfFile: path)
let image = UIImage(data: data!)
return image
}