swift版的GCD封装

发布时间:2015-10-09 SWIFT UI

swift版的GCD封装

 

说明

本人针对swift封装了GCD,包括GCDQueue,GCDGroup,GCDTimer以及GCDSemaphore,使用较为便利.

 

源码

https://github.com/YouXianMing/Swift-GCD

//
//  GCDQueue.swift
//  GCD
//
//  http://home.cnblogs.com/u/YouXianMing/
//  https://github.com/YouXianMing
//
//  Created by YouXianMing on 15/10/9.
//

import UIKit

enum QueueType {
    
    case SerialQueue,     // 串行线程队列
         ConcurrentQueue, // 并发线程队列
         None             // 无类型
}

class GCDQueue: NSObject {
        
    // MARK: 变量
    var dispatchQueue : dispatch_queue_t!
    
    // MARK: 初始化
    override init() {
        
        super.init()
        dispatchQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT)
    }
    
    init(queueType : QueueType) {
        
        super.init()
        
        switch queueType {
            
        case .SerialQueue:
            
            dispatchQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL)
            break
            
        case .ConcurrentQueue:
            
            dispatchQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT)
            break
            
        case .None:
            
            dispatchQueue = nil
            break
        }
    }
    
    // MARK: 单例
    static let mainQueue : GCDQueue = {
        
        let instance           = GCDQueue(queueType: .None)
        instance.dispatchQueue = dispatch_get_main_queue()
        
        return instance
        }()
    
    static let globalQueue : GCDQueue = {
        
        let instance           = GCDQueue(queueType: .None)
        instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
        
        return instance
        }()
    
    static let highPriorityGlobalQueue : GCDQueue = {
        
        let instance           = GCDQueue(queueType: .None)
        instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
        
        return instance
        }()
    
    static let lowPriorityGlobalQueue : GCDQueue = {
        
        let instance           = GCDQueue(queueType: .None)
        instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)
        
        return instance
        }()
    
    static let backgroundPriorityGlobalQueue : GCDQueue = {
        
        let instance           = GCDQueue(queueType: .None)
        instance.dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)
        
        return instance
        }()
    
    // MARK: 执行
    
    /**
    Submits a block for asynchronous execution on a dispatch queue and returns immediately.
    
    - parameter block: dispatch block
    */
    func excute(block : dispatch_block_t) {
        
        dispatch_async(dispatchQueue, block)
    }
    
    func excute(block : dispatch_block_t, afterDelayWithNanoseconds : Int64) {
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, afterDelayWithNanoseconds), dispatchQueue, block)
    }
    
    /**
    Submits a block object for execution on a dispatch queue and waits until that block completes.
    
    - parameter block: dispatch block
    */
    func waitExecute(block : dispatch_block_t) {
        
        dispatch_sync(dispatchQueue, block)
    }
    
    /**
    Submits a barrier block for asynchronous execution and returns immediately.
    
    - parameter block: dispatch block
    */
    func barrierExecute(block : dispatch_block_t) {
        
        dispatch_barrier_async(dispatchQueue, block)
    }
    
    /**
    Submits a barrier block object for execution and waits until that block completes.
    
    - parameter block: dispatch block
    */
    func waitBarrierExecute(block : dispatch_block_t) {
        
        dispatch_barrier_sync(dispatchQueue, block)
    }
    
    // MARK: 便利构造器方法
    class func executeInMainQueue(block : dispatch_block_t) {
    
        dispatch_async(mainQueue.dispatchQueue, block)
    }
    
    class func executeInGlobalQueue(block : dispatch_block_t) {
        
        dispatch_async(globalQueue.dispatchQueue, block)
    }
    
    class func executeInHighPriorityGlobalQueue(block : dispatch_block_t) {
        
        dispatch_async(highPriorityGlobalQueue.dispatchQueue, block)
    }
    
    class func executeInLowPriorityGlobalQueue(block : dispatch_block_t) {
        
        dispatch_async(lowPriorityGlobalQueue.dispatchQueue, block)
    }
    
    class func executeInBackgroundPriorityGlobalQueue(block : dispatch_block_t) {
        
        dispatch_async(backgroundPriorityGlobalQueue.dispatchQueue, block)
    }
    
    class func executeInMainQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
        
        let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), mainQueue.dispatchQueue, block)
    }
    
    class func executeInGlobalQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
        
        let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), globalQueue.dispatchQueue, block)
    }
    
    class func executeInHighPriorityGlobalQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
        
        let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), highPriorityGlobalQueue.dispatchQueue, block)
    }
    
    class func executeInLowPriorityGlobalQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
        
        let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), lowPriorityGlobalQueue.dispatchQueue, block)
    }
    
    class func executeInBackgroundPriorityGlobalQueue(block : dispatch_block_t, afterDelaySeconds : Double) {
        
        let delayTime : Int64 = Int64(afterDelaySeconds * Double(NSEC_PER_SEC))
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayTime), backgroundPriorityGlobalQueue.dispatchQueue, block)
    }
    
    // MARK: 恢复与挂起
    func suspend() {
        
        dispatch_suspend(dispatchQueue)
    }
    
    func resume() {
        
        dispatch_resume(dispatchQueue)
    }
    
    
    // MARK: GCDGroup相关
    func excute(block : dispatch_block_t, inGroup : GCDGroup!) {
        
        dispatch_group_async(inGroup.dispatchGroup, dispatchQueue, block)
    }
    
    func notify(block : dispatch_block_t, inGroup : GCDGroup!) {
        
        dispatch_group_notify(inGroup.dispatchGroup, dispatchQueue, block)
    }
}
//
//  GCDGroup.swift
//  GCD
//
//  http://home.cnblogs.com/u/YouXianMing/
//  https://github.com/YouXianMing
//
//  Created by YouXianMing on 15/10/9.
//

import UIKit

class GCDGroup: NSObject {

    // MARK: 变量
    var dispatchGroup : dispatch_group_t!
    
    // MARK: 初始化
    override init() {
        
        super.init()
        dispatchGroup = dispatch_group_create()
    }
    
    // MARK: 操作
    func enter() {
    
        dispatch_group_enter(dispatchGroup)
    }
    
    func leave() {
    
        dispatch_group_leave(dispatchGroup)
    }
    
    func wait() {
    
        dispatch_group_wait(dispatchGroup, DISPATCH_TIME_FOREVER)
    }
    
    func waitWithNanoseconds(nanoseconds : Int64) -> Bool {
    
        return dispatch_group_wait(dispatchGroup, dispatch_time(DISPATCH_TIME_NOW, nanoseconds)) == 0
    }
}
//
//  GCDTimer.swift
//  GCD
//
//  http://home.cnblogs.com/u/YouXianMing/
//  https://github.com/YouXianMing
//
//  Created by YouXianMing on 15/10/9.
//

import UIKit

class GCDTimer: NSObject {

    // MARK: 变量
    var dispatchSource : dispatch_source_t!
    
    // MARK: 初始化
    override init() {
        
        super.init()
        dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0))
    }
    
    init(inQueue : GCDQueue) {
        
        super.init()
        self.dispatchSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, inQueue.dispatchQueue)
    }
    
    // MARK: 执行
    func event(block : dispatch_block_t, timeIntervalWithNanoseconds : UInt64) {
    
        dispatch_source_set_timer(dispatchSource, dispatch_time(DISPATCH_TIME_NOW, 0), timeIntervalWithNanoseconds, 0)
        
        dispatch_source_set_event_handler(dispatchSource) { () -> Void in
            
            block()
        }
    }
    
    func event(block : dispatch_block_t, timeIntervalWithSeconds : Double) {
        
        let timeInterval : UInt64 = UInt64(timeIntervalWithSeconds * Double(NSEC_PER_SEC))
        dispatch_source_set_timer(dispatchSource, dispatch_time(DISPATCH_TIME_NOW, 0), timeInterval, 0)
        dispatch_source_set_event_handler(dispatchSource) { () -> Void in
            
            block()
        }
    }
    
    func start() {
    
        dispatch_resume(dispatchSource)
    }
    
    func destroy() {
    
        dispatch_source_cancel(dispatchSource)
    }
}
//
//  GCDSemaphore.swift
//  GCD
//
//  http://home.cnblogs.com/u/YouXianMing/
//  https://github.com/YouXianMing
//
//  Created by YouXianMing on 15/10/9.
//

import UIKit

class GCDSemaphore: NSObject {

    // MARK: 变量
    var dispatchSemaphore : dispatch_semaphore_t!
    
    // MARK: 初始化
    override init() {
        
        super.init()
        dispatchSemaphore = dispatch_semaphore_create(0)
    }
    
    init(withValue : Int) {
        
        super.init()
        dispatchSemaphore = dispatch_semaphore_create(withValue)
    }
    
    // 执行
    func signal() -> Bool {
    
        return dispatch_semaphore_signal(dispatchSemaphore) != 0
    }
    
    func wait() {
    
        dispatch_semaphore_wait(dispatchSemaphore, DISPATCH_TIME_FOREVER)
    }
    
    func wait(withNanoseconds : Int64) -> Bool {
    
        return dispatch_semaphore_wait(dispatchSemaphore, dispatch_time(DISPATCH_TIME_NOW, withNanoseconds)) == 0
    }
}
//
//  ViewController.swift
//  GCD
//
//  Created by YouXianMing on 15/10/9.
//  Copyright © 2015年 YouXianMing. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    
    var queue     : GCDQueue!
    var group     : GCDGroup!
    var timer     : GCDTimer!
    var semaphore : GCDSemaphore!
    
    override func viewDidLoad() {
        
        super.viewDidLoad()
        
        timerUse()
    }
    
    // MARK: 各种用法
    
    /**
    普通用法
    */
    func normalUse() {
        
        GCDQueue.globalQueue.excute { () -> Void in
            
            // 子线程执行操作
            
            GCDQueue.mainQueue.excute({ () -> Void in
                
                // 主线程更新UI
            })
        }
        
        
        GCDQueue.executeInGlobalQueue { () -> Void in
            
            // 子线程执行操作
            
            GCDQueue.executeInMainQueue({ () -> Void in
                
                // 主线程更新UI
            })
        }
    }
    
    /**
    延时用法
    */
    func delayUse() {
        
        GCDQueue.executeInGlobalQueue({ () -> Void in
            
            // 延时 2s 执行
            
            }, afterDelaySeconds: 2)
    }
    
    func waitExecute() {
        
        queue = GCDQueue(queueType: .ConcurrentQueue)
        
        queue.waitExecute { () -> Void in
            
            print("1")
            sleep(1)
        }
        
        queue.waitExecute { () -> Void in
            
            print("2")
            sleep(1)
        }
        
        queue.waitExecute { () -> Void in
            
            print("3")
            sleep(1)
        }
        
        queue.waitExecute { () -> Void in
            
            print("4")
        }
    }
    
    /**
    设置屏障
    */
    func barrierExecute() {
        
        queue = GCDQueue(queueType: .ConcurrentQueue)
        
        queue.excute { () -> Void in
            
            print("1")
        }
        
        queue.excute { () -> Void in
            
            print("2")
        }
        
        queue.excute { () -> Void in
            
            print("3")
            sleep(1)
        }
        
        queue.barrierExecute { () -> Void in
            
            print("barrierExecute")
        }
        
        queue.excute { () -> Void in
            
            print("4")
        }
        
        queue.excute { () -> Void in
            
            print("5")
        }
        
        queue.excute { () -> Void in
            
            print("6")
        }
    }
    
    /**
    GCDGroup的使用
    */
    func groupUse() {
        
        group = GCDGroup()
        queue = GCDQueue()
        
        queue.excute({ () -> Void in
            
            print("1")
            
            }, inGroup: group)
        
        queue.excute({ () -> Void in
            
            print("2")
            
            }, inGroup: group)
        
        queue.excute({ () -> Void in
            
            print("3")
            
            }, inGroup: group)
        
        queue.excute({ () -> Void in
            
            print("4")
            
            }, inGroup: group)
        
        queue.excute({ () -> Void in
            
            print("5")
            
            }, inGroup: group)
        
        queue.excute({ () -> Void in
            
            print("6")
            
            }, inGroup: group)
        
        queue.excute({ () -> Void in
            
            print("7")
            
            }, inGroup: group)
        
        queue.excute({ () -> Void in
            
            print("8")
            
            }, inGroup: group)
        
        queue.notify({ () -> Void in
            
            print("都完成了")
            
            }, inGroup: group)
    }
    
    /**
    GCDTimer的使用
    */
    func timerUse() {
        
        timer = GCDTimer(inQueue: GCDQueue.globalQueue)
        timer.event({ () -> Void in
            
            print("timer event")
            
            }, timeIntervalWithSeconds: 1)
        timer.start()
    }
    
    /**
    GCD信号量的使用
    */
    func semaphoreUse() {
        
        semaphore = GCDSemaphore()
        queue     = GCDQueue(queueType: .ConcurrentQueue)
        
        queue.excute { () -> Void in
            
            print("1")
            self.semaphore.signal()
        }
        
        queue.excute { () -> Void in
            
            print("2")
            self.semaphore.signal()
        }
        
        queue.excute { () -> Void in
            
            print("3")
            self.semaphore.signal()
        }
        
        queue.excute { () -> Void in
            
            print("4")
            self.semaphore.signal()
        }
        
        queue.excute { () -> Void in
            
            self.semaphore.wait()
            self.semaphore.wait()
            self.semaphore.wait()
            self.semaphore.wait()
            
            print("都完成了")
        }
    }
}

 

细节

 

转载于:https://www.cnblogs.com/YouXianMing/p/4864979.html

更多相关推荐


Sencha Touch之Hello World

距离上次写日志已经非常之久了,主要是中途有一个期中考试,呵呵大学也有期中考试,这也是我大学最后的考试周了!闲话少说,这次我接着上一次的写,主要是写第一个APP,按照老规矩,应该是HelloWorld!,已经有一段时间没接触Web开发了,所以先上官网看看,刚好有这个例子,自己先试着做一遍,慢慢熟悉熟悉,呵呵!首先必须下载SenchaTouchSDK,这个我们上次已经下载好了,SDK里面包含一些文档,...

ReactiveCocoa学习

发布时间:2017-12-25 移动开发 测试 SWIFT
到我写这篇文章为止,ReactiveCocoa版本为5.0.1,搜了很多博客来了解ReactiveCocoa的基础用法,并不是很多,所以这篇文章算是自己对搜索资源的一个汇总,并加入一些自己在学习中遇到的问题和解决.RAC5.0相比于4.0有了巨大的变化,不仅是受swift3.0大升级的影响,RAC对自身项目结构的也进行了大幅度的调整。这个调整就是将RAC拆分为四个库:ReactiveCocoa,R...

Unity C# UI拖拽

发布时间:2022-11-15 C# BUTTON UNITY UI
//标注:拖拽物体的tag=“DragItem”;拽拽前父亲的tag=“DragPar”;目标拖拽父亲的tag=“TargetPar”;usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;usingUnityEngine.EventSystems;publiccla...

C# 常用日期类型转换帮助类

发布时间:2014-10-20 UI 数据库
本文转载:http://www.cnblogs.com/iamlilinfeng/p/3378659.html最近工作比较忙,与此同时自己也在业余时间开发一个电子商务网站。虽然每天都很累,但感觉过的相当充实。由于时间紧张,最近没有经常来园子,只是有人留言的时候过来回复下。今天过来刷刷存在感。二、应用场景举例1.按指定日期查询(1)用户在UI上选择日期;(2)系统计算出今天的起始时间(****年**...

Android 中文 API (34) —— RadioGroup

发布时间:2010-11-10 移动开发 JAVA UI
 前言  本章内容是android.widget.RadioGroup,翻译来自"首当其冲",再次感谢"首当其冲"!欢迎你一起参与AndroidAPI的中文翻译,联系我over140@gmail.com。 声明  欢迎转载,但请保留文章原始出处:)    博客园:http://www.cnblogs.com/    Android中文翻译组:http://www.cnblogs.com/over1...

第八章 self sizing cell

发布时间:2015-03-02 SWIFT
本项目是《beginningiOS8programmingwithswift》中的项目学习笔记==》全部笔记目录------------------------------------------------------------------------------------------------------------------SelfSizingCell的设置通常有如下三个主要步骤:找...

使用委托在用户自定义控件中实现事件响应

发布时间:2012-04-09 UI
假定用户控件(UserControl.ascx)中包含按钮控件AButton,希望实现按AButton按钮时,包含该用户控件的页面可以接收到事件。为此,在用户控件和页面的代码中分别作了处理。        UserControl.ascx.cs中的处理:       1.定义public的事件委托,如ClickEventHandler;       2.在UserControl类中声明事件,如Cl...

[No000012B]WPF(3/7)有趣的边框和画刷[译]

发布时间:2018-04-20 开发工具 JAVASCRIPT VIEWUI UI
介绍边框是每个WPF程序的主要构成块。在我现在的程序中,我使用了很多的边框来装饰界面。从把边框直接放到窗口中到把边框放到控件模板和列表项中,边框在创建一个好的应用界面上扮演了一个非常重要的角色。在这个程序中,你将轻松了解到怎么使用边框和它大部分的属性。每个人都知道边框到底是什么。它是一个用来装饰UI元素的矩形区域。矩形和边框最大的不同是你可以把一个单独的元素放入到边框中。Border.Child属...

如何使用 Swift 从 macOS 应用程序中截取屏幕截图

如果您在macOS上构建图像处理应用程序,则在屏幕上截取屏幕截图并将其直接加载到应用程序中是一种直接导入图像的方法。在本文中,我将向您展示如何在您的Swift代码中执行此操作。熟悉屏幕截图应用程序在macOS上,有一个名为Screenshot的本机应用程序。您可以使用它来截取全屏、选定窗口或选定区域。我们将利用这个原生应用程序。运行Screenshot应用程序的CLI,然后选择您需要的命令现在,我...

Android开发实践:自定义ViewGroup的onLayout()分析

发布时间:2014-08-19 移动开发 UI
前一篇文章主要讲了自定义View为什么要重载onMeasure()方法,那么,自定义ViewGroup又都有哪些方法需要重载或者实现呢?Android开发中,对于自定义View,分为两种,一种是自定义控件(继承View类),另一种是自定义布局容器(继承ViewGroup)。如果是自定义控件,则一般需要重载两个方法,一个是onMeasure(),用来测量控件尺寸,另一个是onDraw(),用来绘制控...

Struts2

发布时间:2018-10-19 JAVA WEB.XML UI
Struts2 https://blog.csdn.net/qq_35064774/article/details/64934709 基础。配置,action,拦截器,Struts2UI标签,数据回显,资源国际化(省略),OGNL表达式,valueStack 基础1.为什么要引入struts?既然Servlet能够完成的事,我们为啥要用框架呢??因为框架帮我们封装了很多常用的功能,更加灵活[不用把...

vs2005学习笔记(2):xslt的性能测试

发布时间:2005-04-24 UI
看了msdn上一篇关于xml的文章,What'sNewinSystem.XmlforVisualStudio2005andthe.NETFramework2.0Releaseurl:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnxml/html/sysxmlVS05.asp,其中有一节讲到性能问题。.按该文章的...

关于java行业的一些见闻与感悟

发布时间:2014-03-21 JAVA 运维 UI
  为什么要写这些东西呢?首先,我是在看了道哥的一篇文章之后,觉得他说的一句话很对“应该多跟行业内的前辈、过来人聊天!”当时就感觉茅塞顿开,好像突然通便了的感觉,作为一个技术宅,为什么不出去走走呢,把思想发散开来,多吸取点别人优秀的思想?  仔细想想,既然自己已经一只脚踏进了java开发这个行业,那么怎么能一点不了解这个行业呢,对吧?然后自己就开始着手通过一些途径来获得java开发行业的一些消息。...

RunTime 入门

发布时间:2016-03-10 RUNTIME 移动开发 UI
原文链接:http://www.jianshu.com/p/59992507f875 这是一篇浅显实用易记易理解的关于runtime的解读。Runtime中的方法主要以五个单词开头——class(类)、object(实例)、method(方法)、propert(属性)、ivar(成员变量)它们代表了方法的操作对象,如class开头的OBJC_EXPORTIvar*class_copyIvarLis...

记录一个不错的ios框架tapku

发布时间:2012-07-04 UI PYTHON
2019独角兽企业重金招聘Python工程师标准>>>https://github.com/devinross/tapkulibrary功能还没有three20强大,思路很好,提供的演示UI也非常漂亮转载于:https://my.oschina.net/ahuaahua/blog/64877...

浅谈Android中的任务封装

发布时间:2016-09-04 移动开发 UI 数据库
2019独角兽企业重金招聘Python工程师标准>>>1概述1.1定义一次UI更新一次数据库中读写操作上传或下载一张图片从网络接口获取数据等等抽象而言,任何代码块执行的业务逻辑都可称之为一个任务。最常见的是封装在Runable或Callable或Thread子类的run方法中的业务逻辑。1.2任务在哪里执行当前线程直接方法调用新建子线程执行提交到线程池执行放在handler队列依...

OKhttp基本使用介绍

发布时间:2016-09-28 移动开发 JAVA UI
MainActivity.class1packagecom.example.administrator.okhttp3;23importandroid.support.v7.app.AppCompatActivity;4importandroid.os.Bundle;5importandroid.util.Log;6importandroid.view.View;7importandroid.wi...

使用Avalonia跨Linux平台

发布时间:2022-11-25 # AVALONIA框架 UI WPF
Avalonia,读:阿瓦隆尼亚这里的跨平台指的是,使用c#语言开发跨Linux平台。c#在Windows桌面开发中很强,但是在Linux桌面中,不能跨平台,Qt可以在Linux中跨平台,但是那是另外一门语言了。Avalonia类似使用WPF的技术方法来开发,所以,需要会使用WPF,其中的一些语法和写法与WPF有所区别,但是他们相差不大,会WPF的话,基本上可以看看文档后,完全掌握Avalonia...

Android UI开发第五篇——自定义列表

发布时间:2011-10-26 移动开发 PHP UI
自定义列表,设置列表背景、列表的列背景、列表的间隔线。借鉴了一些前辈的代码。MainActivity.classpublicclassMainActivityextendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R...

深入理解React 组件状态(State)

发布时间:2019-03-22 JAVASCRIPT VIEWUI UI
React的核心思想是组件化的思想,应用由组件搭建而成,而组件中最重要的概念是State(状态),State是一个组件的UI数据模型,是组件渲染时的数据依据。一.如何定义State定义一个合适的State,是正确创建组件的第一步。State必须能代表一个组件UI呈现的完整状态集,即组件的任何UI改变,都可以从State的变化中反映出来;同时,State还必须是代表一个组件UI呈现的最小状态集,即S...

React 深入系列3:Props 和 State

发布时间:2018-04-16 JAVASCRIPT 前端 VIEWUI UI
文:徐超,《React进阶之路》作者授权发布,转载请注明作者及出处React深入系列3:Props和StateReact深入系列,深入讲解了React中的重点概念、特性和模式等,旨在帮助大家加深对React的理解,以及在项目中更加灵活地使用React。React的核心思想是组件化的思想,而React组件的定义可以通过下面的公式描述:UI=Component(props,state)组件根据prop...

Android面经3

发布时间:2022-10-17 ANDROID UI
android线程通信有几种实现方式?1,通过Handler机制主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用。另外Handler机制与Activity生命周期不一致的原因,容易导致内存泄漏,不推荐使用。privatevoidone(){handler=...

企业应用UI开发模式

今天和老板吃饭,谈到开发效率的问题。老板提议能否用一些网页设计工具来做ui开发,原因是他见到有的developer花费很多时间在写ui上面。老板认为如果做ui能直接拖拽控件,所见即所得,这样就可以把主要精力花在核心业务上面。老板本身是做业务的,博士出身,但是基本不懂软件开发。估计是平时看我用rose做设计觉得不错,才冒出这样的想法。 首先大概介绍一下我们公司的系统。我们是做制造业的生产管理系统,主...

includelayout 属性

发布时间:2010-05-18 FLEX 学习 UI
一直被这个问题困扰,就是在设置UI的Visible的时候,改组件的位置一直被占着,比较恶心,今天在这里发现了一个方法,操作方法如下设置:includeInLayout为false即可...

与众不同 windows phone (19) - Device(设备)之陀螺仪传感器, Motion API

发布时间:2014-02-22 SHELL UI
原文:与众不同windowsphone(19)-Device(设备)之陀螺仪传感器,MotionAPI[索引页][源码下载]与众不同windowsphone(19)-Device(设备)之陀螺仪传感器,MotionAPI作者:webabcd介绍与众不同windowsphone7.5(sdk7.1)之设备陀螺仪传感器MotionAPI(运动API)示例1、演示如何使用陀螺仪传感器GyroscopeD...

Android长方形图片生成正圆形,以及矩形图片生成圆角

发布时间:2014-12-17 移动开发 UI
一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图: 变成正圆后: 下面上代码: publicstaticBitmapmakeRoundCorner(Bitmapbitmap){intwidth=bitmap.getWidth();intheight=bitmap.getHeight();intle...

SDWebImage缓存图片的机制(转)

发布时间:2015-10-26 UI
SDWebImage是一个很厉害的图片缓存的框架。既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者对于图片的缓存实际应用的是NSURLCache自带的cache机制。而NSURLCache每次都要把缓存的raw data再转化为UIImage,就带来了数据处理和内存方面的更多操作。具体的比较在这里。SD...

好记性不如烂笔头——安卓ui组件2

发布时间:2022-10-22 ANDROID UI
textstyle=“bold/斜体/normal”如何创建shape文件cardview控件,的常用属性与注意细节必须学习一下cardview才能想出怎么打这个代码app:cardMaxElevation="5dp"有什么用处呢另外原来在cardview里面嵌套一个页面布局,才可以添加控件安卓studio的快捷键关于pading和margin的一些区分!android:layout_gravit...

Android的风暴前夕

发布时间:2007-11-17 ANDROID UI ECLIPSE IDE GOOGLE
看到Google发布了Android的SDK,便下载了一份,在网上看了看相关的文档,发现Android真的是一个不错手机平台,不仅仅是开源的,他还提供了一种基于XML的视图构建方法,开发者可以通过构建XML创建Android的UI部分,这可是J2ME所没有的。不光如此Android还推出了Eclipse的Plugin,让Android一出世便有了EclipseIDE作为支持,想当初使用J2ME开发...

区块链开发金融交易平台

发布时间:2019-03-01 SWIFT 操作系统 PYTHON
区块链开发金融交易平台 区块链是一种分散的数字分类帐,可以在全球数千台计算机上保存,可以在区块链金融市场交易所交易。这些是以抑制其后续修改的方式注册的。区块链技术以经济高效和透明的方式提高了安全性并加速了信息交换。它还免除了第三方的主要作用是在交易中提供信任和认证要素(如公证人和银行)。区块链开发技术应用在金融交易市场引发的能量是无与伦比的。区块链开发技术的重要性引起了不同部门组织的关注,银行业在...

Python gui开发之tkinter

发布时间:2015-10-17 UI PYTHON
tk inter第一个窗口fromTkinterimport*Tk().mainloop() 当前线程调用mainloop()后变进入事件循环,后面代码被阻塞。想创建多个窗口的话fromTkinterimport*fromthreadingimport*foriinrange(5):Thread(target=Tk().mainloop).start()print2333sys.stdout.fl...

openjweb平台配置cas server单点登录

发布时间:2009-08-05 JAVA PHP UI
web.xml:<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="2.4"xsi:schemaLocation="http://java.su...

Spring Security 3.1.1安全控制的例子(五)

发布时间:2012-10-25 JAVA XHTML UI
测试页:login.xhtml<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"    ...

Unity3D教程:利用UnityHttpClient类实现Http通信

发布时间:2022-11-23 XHTML C# UI
利用Warensoft.Unity.Communication.Client.UnityHttpClient类可以实现HttpGet请求以及POST请求,并可以使用简单的获取本次请求所对对应的响应。可以使用该类完全代替内置的WWW类。推荐使用UnityHttpClient替代WWW的原因有以下几点:1>WWW类的使用不符合微软命名规范。2>大量并发使用WWW类时会抛出TooManyTh...

磨金石教育摄影后期干货分享||丁达尔效应照片如何调整更好看

发布时间:2022-11-24 PHOTOSHOP 平面设计 影视设计 UI
在自然风光摄影中,有一个景色是不经常遇到,但却十分唯美的,这就是丁达尔效应,也称为上帝之光。一束光穿过胶体,光的亮度会染附在无数细小纷飞的灰尘上。于是光在一定的范围内,就有了形状。像一条光束,也像一条通路。在深林中、在人迹罕至的小屋这种场景都是常见,而且是可遇不可求。因此能拍到丁达尔效应,本身就是一种缘分。如果遇不到,或者丁达尔效应不强,怎么办呢?没关系,我们可以借助后期的处理,增强丁达尔的效果。...

Swift - 获取状态栏一些信息

发布时间:2017-03-22 SWIFT
 //获取状态栏的各种信息:网络类型,运营商,电池电量,显示的系统时间等信息importUIKitenumNetWorkType{caseNetworkStatesNone//没有网络caseNetworkStates2G//2GcaseNetworkStates3G//3GcaseNetworkStates4G//4GcaseNetworkStatesWIFI//WIFI}classStatus...

Swift - 获取当前系统时间

发布时间:2017-05-31 SWIFT XCODE
 //获取当前系统时间    letdate=NSDate()    lettimeFormatter=NSDateFormatter()    timeFormatter.dateFormat="yyyy-MM-ddHH:mm:ss.SSS"    letstrNowTime=timeFormatter.stringFromDate(date)asString转载于:https://www.cn...

Mvvm

发布时间:2017-09-16 移动开发 JAVA UI
mvvm能够大大降低模块间的耦合度,在开发过程中更容易控制数据传递,性能方面也有所长,传统findViewById要遍历整个树的children。 它的编译过程:1.首先会去检查layout下的视图文件,将其中所有关于databinding的元素全部删除、替换(这一过程全部由编译器来完成,可以搜索下build文件夹视图文件),因为这些标签根本无法识别。2.第二步解析表达式语法,如三目运算。3.第三...

Xamarin 跨移动端开发系列(01) -- 搭建环境、编译、调试、部署、运行

发布时间:2016-10-08 移动开发 运维 UI
  (本文是基于老版本的VS和Xamarin,而VS2017已经集成了Xamarin,所以,本文已经过时,最新的Xamarin开发介绍请参见 使用 Xamarin开发手机聊天程序。)   如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!好了,废话不多说,就开始吧,本文将描述基...

Swift enum(枚举)使用范例

发布时间:2017-01-03 ENUM SWIFT
//:Playground-noun:aplacewherepeoplecanplayimportUIKitvarstr="Hello,playground"enumMovement{caseLeftcaseRightcaseTopcaseBottom}letaMovement=Movement.LeftswitchaMovement{case.Left:print("left")default:...

发布适用于 .NET 7 的 .NET MAUI

发布时间:2022-11-24 XCODE UI MACOS IDE .NET
点击上方蓝字关注我们(本文阅读时间:6分钟)我们在六个月前向您介绍了.NET多平台应用程序UI(MAUI),现在我们很高兴地宣布.NETMAUI在我们的下一个主要版本.NET7中普遍可用。在此短的时间范围内,我们在.NETMAUI中的主要工作是解决您的主要反馈报告、改进 CollectionView的性能,并引入了桌面功能,我们将您的范围从移动设备扩展到桌面设备。此版本随VisualStudio1...

ASP.NET 获取MSN联系人列表

发布时间:2008-09-22 XHTML C# UI
用到的是DOTMSN大家可以从这里 下到它的代码.... 功能很简单...写的有点槽了...不过功能是实现了.... HTML<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//D...

NSNotification tips

发布时间:2015-05-14 RUNTIME UI IOS
官方文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html#//apple_ref/doc/uid/10000043-SW1  1、NSNotification消息的同步性 ①NSNotification使...

UI04_delegate

发布时间:2015-09-21 DELEGATE UI基础 界面 UI IMAGE处理
AppDelegate.h#import<UIKit/UIKit.h>@interfaceAppDelegate:UIResponder<UIApplicationDelegate>@property(strong,nonatomic)UIWindow*window;@endAppDelegate.m#import"AppDelegate.h"#import"RootVie...

Hander

发布时间:2012-04-15 数据结构 ANDROID THREAD UI 多线程 BUTTON
Android消息机制(一)Android消息机制(一) 一、    角色描述1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper(从MessageQueue取出)所送来的消息。3.Message...