やっちまった。もう後戻りできない。
ああああああああああああああああありがとうございました
頑張るしかねー
しばらくwindowsばかり触っていたので、updateします。
ソフトウェアエンジニアの技術ブログ:Software engineer tech blog
随机应变 ABCD: Always Be Coding and … : хороший
やっちまった。もう後戻りできない。
ああああああああああああああああありがとうございました
頑張るしかねー
しばらくwindowsばかり触っていたので、updateします。
# FriendlyChat use_frameworks! platform :ios, '8.0' pod 'Firebase/Storage' pod 'Firebase/Core' pod 'Firebase/Database' pod 'firebase/RemoteConfig' pod 'FirebaseUI' target 'FriendlyChatSwift' do end
service firebase.storage { match /b/friendlychat-12876.appspot.com/o { match /{allPaths=**}{ allow read, write: if request.auth != null; } } }
class Gif { let url: NSURL let videoURL: NSURL let caption: String? let gifImage: UIImage? var gifData: NSData? init(url:NSURL, videoURL: NSURL, caption: String?){ self.url = url self.videoURL = videoURL self.caption = caption self.gifImage = UIImage.gifWithURL(url.absoluteString)! self.gifData = nil } init(name: String){ self.gifImage = UIImage.gifWithName(name) } }
#import <UIKit/UIKit.h> #import "Gif.h" @interface GifEditorViewController : UIViewController<UITextFeildDelegate> @property (nonatomic) Gif *gif; @property (weak, nonatomic) IBOutlet UIImageView *gifImageView; @end
UITextFieldDelegate Methods
func textFieldDidBeginEditing(textField: UITextField){ textField.placeholder = "" } func textFieldShoudReturn(textField: UITextField) -> Bool { textField.resignFirstResponder() return true }
Brain Storm -> Create a Skelelon UI -> Research APIs and Libraries
Choose an Idea -> Create a paper prototype -> get user feedback -> Build APP
Developing nice graphic design
Building the user interface with UIKit
Downloading data from an API
Persisting the data
Working through problems and bug to get the app working well.
Posting the app to the App Store
-Create a Paper Prototype
override func viewDidLoad(){ super.viewDidLoad() let singleTapRecognizer = UITapGestureRecognizer (target: self, action: "handleSingleTap:") view.addGestureRecognizer(singleTapRecognizer) }
@IBAction func popToMasterView(){ self.navigationController?.popToRootViewControllerAnimated(true) }
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent){ if motion == .MotionShake { disperseBugsAnimation() } } func handleSignleTap(recognizer: UITapGestureRecognizer){ addBugToView() addButToView() }
thread backtrace all
Apple’s LLDB Quick Start Guide
https://developer.apple.com/library/content/documentation/IDEs/Conceptual/gdb_to_lldb_transition_guide/document/lldb-command-examples.html#//apple_ref/doc/uid/TP40012917-CH3-SW1
func addBugToView(){
if bugs.count < maxBugs {
let newBug = bugFactory.createBug()
bug.append(newBug)
moveBugsAnimation()
}
}
func emptyBugsFromView(){
for bug in self.bugs {
bug.removeFromSuperview()
}
self.bugs.removeAll(keepCapacity: true)
}
[/code]
Getting Help with Bugs
Stack Overflow
-be specific as possible
-provides steps leading to the problems
– can use text, code, images, gifts…
warnings – issues identified by the compiler that MIGHT CAUSE PROBLEMS or have UNINTENDED SIDE-EFFECTS on running application
errors – issues identified by the compiler that MUST BE FIXED prior to running application
logic error:a bug in a program that causes it to operate incorrectly, but not to terminate abnormally
runtime errors: issues that occur while your application is running – these can be logic errors or errors that cause application to crash
software bug: an error, flaw, failure, or fault in a computer program or system that causes it to produce an incorrect or unexpected result, or to behave in unintended ways
static errors: issues identified by the compiler that must be fixed prior to running application
warning: issues that might cause problems or have unintended side-effects on running application
Reproduce the problem -> Gather debug information -> what is the value of a variable? what kind of error?
logs, program state, …
=> Form a Hypothesis
print debugging
-only use print statements to debug
extension PrintBugViewController { override func canBecomeFirstResponder() -> Bool { return true } override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent){ if motion == .MotionShake { disperseBugsAnimation() } } func handleSingTap(recognizer: UITapGestureRecognizer) { addBugToView() } }
func addBugToView(){
println(self)
if bugs.count < maxBugs {
let newBug = bugFactory.createBug()
bugs.append(newBug)
view.addSubview(newBug)
moveBugsAnimation()
}
println(self)
}
func emptyBugsFormView(){
for bug in self.bugs {
bug.removeFromSuperview()
}
}
extension PrintBugViewController : Printable,
DebugPrintable {
override var description: String {
return "PrintBugViewController contains \(bugs.count) bugs\n"
}
}[/code]
FinalBugViewController.swift
import UIKit // MARK: - FinalBugViewController: UIViewController class FinalBugViewController: UIViewController { // MARK: Properties let bugFactory = BugFactory.sharedInstance() let maxBugs = 100 let moveDuration = 3.0 let disperseDuration = 1.0 var bugs = [UIImageView]() // MARK: Life Cycle override func viewDidLoad() { super.viewDidLoad() let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleSingleTap)) view.addGestureRecognizer(singleTapRecognizer) } // MARK: Bug Functions func addBugToView() { if bugs.count < maxBugs { let newBug = bugFactory.createBug() bugs.append(newBug) view.addSubview(newBug) moveBugsAnimation() } } func emptyBugsFromView() { for bug in self.bugs { bug.removeFromSuperview() } self.bugs.removeAll(keepCapacity: true) } // MARK: View Animations func moveBugsAnimation() { UIView.animateWithDuration(moveDuration) { for bug in self.bugs { let randomPosition = CGPoint(x: CGFloat(arc4random_uniform(UInt32(UInt(self.view.bounds.maxX - bug.frame.size.width))) + UInt32(bug.frame.size.width/2)), y: CGFloat(arc4random_uniform(UInt32(UInt(self.view.bounds.maxY - bug.frame.size.height))) + UInt32(bug.frame.size.height/2))) bug.frame = CGRect(x: randomPosition.x - bug.frame.size.width/1.5, y: randomPosition.y - bug.frame.size.height/1.5, width: BugFactory.bugSize.width, height: BugFactory.bugSize.height) } } } func disperseBugsAnimation() { UIView.animateWithDuration(disperseDuration, animations: { () -> Void in for bug in self.bugs { let offScreenPosition = CGPoint(x: (bug.center.x - self.view.center.x) * 20, y: (bug.center.y - self.view.center.y) * 20) bug.frame = CGRect(x: offScreenPosition.x, y: offScreenPosition.y, width: BugFactory.bugSize.width, height: BugFactory.bugSize.height) } }, completion: { (finished) -> Void in if finished { self.emptyBugsFromView() } }) } // MARK: Actions @IBAction func popToMasterView() { self.navigationController!.popToRootViewControllerAnimated(true) } } // MARK: - FinalBugViewController (UIResponder) extension FinalBugViewController { override func canBecomeFirstResponder() -> Bool { return true } override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) { if motion == .MotionShake { disperseBugsAnimation() } } func handleSingleTap(recognizer: UITapGestureRecognizer) { addBugToView() } } // MARK: - FinalBugViewController (CustomStringConvertible) // NOTE: You don't have to conform to CustomStringConvertible since this is already done by FinalBugViewController's superclasses (via NSObject). extension FinalBugViewController { override var description: String { return "FinalBugViewController contains \(bugs.count) bugs\n" } } // MARK: - FinalBugViewController (CustomDebugStringConvertible) // NOTE: You don't have to conform to CustomDebugStringConvertible since this is already done by FinalBugViewController's superclasses (via NSObject). extension FinalBugViewController { override var debugDescription: String { var index = 0 var debugString = "FinalBugViewController contains \(bugs.count) bugs...\n" for bug in bugs { debugString = debugString + "Bug\(index): \(bug.frame)\n" index += 1 } return debugString } } // MARK: - FinalBugViewController (debugQuickLookObject) extension FinalBugViewController { func debugQuickLookObject() -> AnyObject? { let singleSquareLength: CGFloat = 10.0 let squaresInRow = 10 let imageSize = CGSizeMake(singleSquareLength * CGFloat(squaresInRow), singleSquareLength * CGFloat(bugs.count / squaresInRow + 1)) UIGraphicsBeginImageContextWithOptions(imageSize, true, 0) var x: CGFloat = 0.0 var y: CGFloat = 0.0 for bug in bugs { bug.tintColor.set() UIRectFill(CGRectMake(x, y, singleSquareLength, singleSquareLength)) x += singleSquareLength if x > CGFloat(squaresInRow) * singleSquareLength { y += singleSquareLength x = 0.0 } } UIColor.yellowColor().set() UIRectFill(CGRectMake(x, y, singleSquareLength, singleSquareLength)) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } }
import UIKit // MARK: - FinalSettingsViewController: UIViewController class FinalSettingsViewController: UIViewController { // MARK: Properties let bugFactory = BugFactory.sharedInstance() // MARK: Outlets @IBOutlet weak var currentBugTypeImageView: UIImageView! // MARK: Life Cycle override func viewDidLoad() { super.viewDidLoad() currentBugTypeImageView.tintColor = BugFactory.bugTints[bugFactory.currentBugType.rawValue] } // MARK: Actions @IBAction func dismissSettingsTouched(sender: AnyObject) { self.dismissViewControllerAnimated(true, completion: nil) } @IBAction func bugTypeSelected(sender: UIButton) { bugFactory.currentBugType = BugFactory.BugType(rawValue: Int(sender.currentTitle!)!)! self.dismissViewControllerAnimated(true, completion: nil) } }
Context (notebook)
-> notification
FetchedResultsController
-> delegate
CoreDataTableViewController
-> update
TableView
saving images(BLOBs) and migrating data model
Importing large sets of objects into the database without blocking the user interface
Downloading new objects from a REST service and inserting them into the db.
Saving datasets in the background since saving can take a user-perceivable amount of time.