swift多线程
来源:互联网 发布:网络销售渠道有哪2种 编辑:程序博客网 时间:2024/06/11 14:05
swift多线程
segue的一个技巧
在故事版里面任何建立会和controller交互的string,比如segue的identifier,可以在controller中使用一个struct来装载它们。
private struct storyboard{ static let showPicture = "show picture"}
zooming(delegation)
首先要把UIViewController代理他scrollview。Delegate表示将一个对象的部分功能转交给另一个对象。比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象B的引用存为一个实例变量。这个对象B称为委托。当事件发生时,它检查委托对象是否实现了与该事件相适应的方法。如果已经实现,则调用该方法。
注意要在self(UIViewController)大类后,标明实现UIScrollViewDelegate。
@IBOutlet weak var ScrollView: UIScrollView! { didSet{ ScrollView.contentSize = imageView.frame.size ScrollView.delegate = self }}func viewForZooming(in scrollView: UIScrollView) -> UIView? { return imageView}
然后需要设置以下两个参数
ScrollView.minimumZoomScale = 0.03ScrollView.maximumZoomScale = 1.0
extension
extension用于扩展已经存在的类。比如你要在UIViewController里面增加一些函数或者方法,可以用如下的方法。
extension UIViewController { var someVar func someFuntion}
然后就可以直接使用。比如FaceViewController.someVar或者FaceViewController.someFunction。
multithreading
IOS中的多线程主要是用queue来处理的。queue可以是serial或者concurrent。Main Queue是IOS中的主要的队列,这个序列处理所有的UI activity,而且是serial的,serial主要是为了保持显示的秩序性。
let queue: dispatch_queue_t = dispatch_get_main_queue()dispatch_async(queue) {/*do what you want*/}
上面是处理main queue的方法,要处理非main queue使用下列的方法。
dispatch_async(queue) {/*do what you want non-UI*/ dispatch_async(dispatch_get_main_queue()) { }}
对于concurrent的queue有以下几种priority。
图片的开销只有真正需要显示的时候才下载哦!可以使用view.window != nil语句来判断。
我们可以按照这样的方式来改进fetchImage函数。
func fetchImage(){ if let url = imageURL{ DispatchQueue.global(qos: .userInitiated).async { // 1 let imageData = try! Data(contentsOf: url) DispatchQueue.main.async { // 2 if imageData != nil { self.image = UIImage(data: imageData) } } } }}
注意到image前面加入了一个image,这是因为image是这个类的一个属性,而这个代码写在了一个闭包里面。所以他需要知道这个属性是否需要时刻保持在堆里面,这个self就是起到提示的作用。
这样一来,UI就可以流畅自如的跳转了,但是图片有可能因为非常大而显示空白的页面,所以从交互的角度上讲需要有一些动画来提示用户现在正在loading。
只需要在左侧把activity indicator拖进去storyboard就可以了。不过需要注意的是层级结构。indicator必须放在scroll view的下面。
使用下列代码控制动画的开始和结束。
indicator.startAnimating()indicator.stopAnimating()
解决一开始页面在detail
首先把UIViewController设置deleate为self,然后使用以下函数来控制条件。
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { if let a = secondaryViewController as? ImageViewController { if a.imageURL == nil { return true } } return false}
使用代码segue
不再单独拉空间,而是在controller统一segue。
然后通过action的方式链接view和controlelr,并且加入以下代码。
@IBAction func showImage(_ sender: UIButton) { performSegue(withIdentifier: storyboard.showPicture, sender: sender)}
- swift多线程
- swift/IOS 多线程使用
- swift/IOS 多线程使用
- SWift 的多线程延时
- iOS多线程(GCD)(swift)
- swift 多线程实现
- Swift - 多线程实现方式
- Swift - 多线程实现方式
- Swift - 多线程实现方式
- swift(NSOperation 多线程)
- Swift 3.0多线程
- swift开发多线程篇 - 多线程基础
- ios 多线程(NSOperation)(swift)
- ios多线程(NSThread)(swift)
- Swift基础(十一)多线程
- [Swift 开发] swift支持多线程操作数据库类库-CoreDataManager
- Swift中多线程和异步任务
- 【Swift】三种多线程处理方式
- equals方法类中重写
- Ubuntu 16 永久修改ulimit中的max file open限制
- HDU
- while(!Die())
- shell位置参数和特殊变量
- swift多线程
- 信息列表+上传文件
- 利用java代码自动下载嗨学网的学习视频
- 博文收藏
- 2017/010/6 SSM框架学习记录
- 【深入理解JVM】:Java内存模型JMM
- Netty--粘包与分包
- cxf项目异常
- leetcode225.Implement Stack using Queues