2016-02-02 19:57:42 liu1014020126 阅读数 3461

swift API的使用

最近楼主要使用swift的API接口,楼主有一个习惯,不管开发需要用到什么知识,都喜欢看官方文档,虽然大部分是英文,但是用起来还是感觉可靠,不过对于openstack给的swift API接口,可叫我吃了不少苦,所以写下这篇文章希望给有同样困惑的朋友帮助。

openstack官网有专门的开发者文档介绍如何使用curl操作swift(http://docs.openstack.org/api/openstack-object-storage/1.0/content/),虽然有部分接口有问题,不过大部分写的比较详细还是值得借鉴的。

1.curl的使用

首先,我们需要知道swift提供的标准API都是通过curl工具完成的,比如说PUT,GET,POST等等。

对于curl的使用这里简单说下,具体详细情况,可以通过man工具或者百度和谷歌自己丰富自己。

curl基本命令:

-H <line> 自定义头信息传递给服务器

-i 输出时bao阔protocol头信息

-k 允许不使用证书到SSL站点

-v 显示详细信息

-X<command> 指定命令

-d<data> HTTP POST方式传送数据

2.使用curl操作switf接口

由于楼主搭建的是keystone的主机所以通过以下命令获取token:
$curl -d '{"auth":{"tenantName": "DA","passwordCredentials":{"username": "system","password": "123456"}}}' -H "Content-type:application/json" http://192.168.120.104:5000/v2.0/tokens |python -m json.tool
tenantName,username,password都是之前自己已经设置好的直接替换就可以。
获得的结果如下:
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1377  100  1282  100    95   9382    695 --:--:-- --:--:-- --:--:--  9426
{
    "access": {
        "metadata": {
            "is_admin": 0,
            "roles": [
                "9fe2ff9ee4384b1894a90878d3e92bab",
                "d10801a102c141e585f80d75692faeca",
                "be6b8f0d5ea049618ac29e109a320271"
            ]
        },
        "serviceCatalog": [
            {
                "endpoints": [
                    {
                        "adminURL": "http://192.168.120.104:8080/v1",
                        "id": "3d5f39395faa4b368d8dafee2ef6338c",
                        "internalURL": "http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec",
                        "publicURL": "http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec",
                        "region": "RegionOne"
                    }
                ],
                "endpoints_links": [],
                "name": "swift",
                "type": "object-store"
            },
            {
                "endpoints": [
                    {
                        "adminURL": "http://192.168.120.104:35357/v2.0",
                        "id": "1d8c83a975ac46afb6f950a152029a1e",
                        "internalURL": "http://192.168.120.104:5000/v2.0",
                        "publicURL": "http://192.168.120.104:5000/v2.0",
                        "region": "RegionOne"
                    }
                ],
                "endpoints_links": [],
                "name": "keystone",
                "type": "identity"
            }
        ],
        "token": {
            "expires": "2016-02-02T10:47:22Z",
            "id": "f2510429420f443e8815bb06012d070d",
            "issued_at": "2016-02-02T09:47:22.974729",
            "tenant": {
                "description": "DAM tenant",
                "enabled": true,
                "id": "1cfaab6763b04ebca93e8870436cd8ec",
                "name": "da"
            }
        },
        "user": {
            "id": "76ea45ed8af74fbd9538e740dcbcd97a",
            "name": "system",
            "roles": [
                {
                    "name": "_member_"
                },
                {
                    "name": "DA System Managers"
                },
                {
                    "name": "admin"
                }
            ],
            "roles_links": [],
            "username": "system"
        }
    }
}
注意红色的俩行接下我们使用API所用到的权限。
token:f2510429420f443e8815bb06012d070d
publicURL:f2510429420f443e8815bb06012d070d

3.account操作

	查看当前的存储信息:
	$curl -k -i -X GET -H 'X-Auth-Token:f2510429420f443e8815bb06012d070d' http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec
	获取结果如下:
	
	创建container
	$curl -i -X PUT -H 'X-Auth-Token:f2510429420f443e8815bb06012d070d' http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec/lyw_test_vol
	
	现在用上边的命令可以看到俩个container了。
	格式化输出获取的container信息
	$curl -k -i -X GET -H 'X-Auth-Token:f2510429420f443e8815bb06012d070d' http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec?format=json 注:json格式熟悉python的应该都清楚。
	查看container的元数据:
	写到这里由于swift的token是时时更新的,所以楼主必须用新的token值才能获取到正确结果,若以大家要明白。
	$curl -k -i -X HEAD -H 'X-Auth-Token:0139369a54634743ab4526a3b48ed3aa' http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec/vol0000
	
	删除container:
	$curl -k -i -X DELETE -H 'X-Auth-Token:0139369a54634743ab4526a3b48ed3aa' http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec/vol0000

4.object操作

上传一个object到container中,switf先把这个object传到缓存中然后才传到相应的位置,在缓存中最小单位是object我们是看不到这个东西的,不过传到continer中最小单位就是file了我们是可以看到这个东西的,可以完整的put和get获取其中的数据和元数据。
创建object
$curl -k -i -X PUT -T "hello.txt" -H 'X-Auth-Token:f2510429420f443e8815bb06012d070d' http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec/vol0000/hello.txt 
下载刚才上传的object
$curl -k -i -X GET -H 'X-Auth-Token:0139369a54634743ab4526a3b48ed3aa'/  http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec/vol0000/hello.txt>1
删除object
$curl -k -i -X DELETE -H 'X-Auth-Token:0139369a54634743ab4526a3b48ed3aa'/  http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec/vol0000/hello.txt
objectmetadata操作
$curl -k -i -X POST -H 'X-Auth-Token:0139369a54634743ab4526a3b48ed3aa' -H 'X-Object-Meta-Breed:helloinfo' http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec/vol0000/hello.txt
读取元数据信息:
$curl -k -i -X HEAD -H 'X-Auth-Token:0139369a54634743ab4526a3b48ed3aa' http://192.168.120.104:8080/v1/AUTH_1cfaab6763b04ebca93e8870436cd8ec/vol0000/hello.txt
2018-07-27 18:19:28 PrecipitantPan 阅读数 145

    swift存储数据使用core data,它是一套ORM框架,苹果力荐,但是性能不及sqlite,而且除了真tm复杂我也没看到有什么亮点,不过多学点总还是好的,黑人问号。

    Xcode提供一套可视化生成Entity,但是如果按照教程去做,自动使用默认的Class生成会报错,在YourEnityproperties.swift加上@obj或者直接选none生成,手撸也不费事的

    可以自己封装一下对context使用,注意container的名字需要修改,改成当前工程名,否则会抱实体不对应的错

import Foundation
import CoreData

class DataBase {
    
    static let shared = DataBase()
    private init() {
        
    }
    
    // MARK: - Core Data stack
    
    lazy var persistentContainer: NSPersistentContainer = {
        /*
         The persistent container for the application. This implementation
         creates and returns a container, having loaded the store for the
         application to it. This property is optional since there are legitimate
         error conditions that could cause the creation of the store to fail.
         */
        let container = NSPersistentContainer(name: "PFReminder")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                
                /*
                 Typical reasons for an error here include:
                 * The parent directory does not exist, cannot be created, or disallows writing.
                 * The persistent store is not accessible, due to permissions or data protection when the device is locked.
                 * The device is out of space.
                 * The store could not be migrated to the current model version.
                 Check the error message to determine what the actual problem was.
                 */
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()
    
    // MARK: - Core Data Saving support
    
    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }
}

    个人吐槽的是这玩意儿的CURD确实糟糕...尤其是删,改...

func selectAll() -> [Notification]? {
        let managedObjectContext = db.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Notification")
       
        do {
            let fetchedResults = try managedObjectContext.fetch(fetchRequest) as? [Notification]
            return fetchedResults
        } catch {
            fatalError("获取失败")
        }
    }
    
    func saveNotification(title: String, body: String) {
        let date = DateUtil().getCurentDate()
        let managedObjectContext = db.persistentContainer.viewContext
       
        let entity = NSEntityDescription.entity(forEntityName: "Notification", in: managedObjectContext)
        let notification = NSManagedObject(entity: entity!, insertInto: managedObjectContext)
        
        notification.setValue(date, forKey: "id")
        notification.setValue(title, forKey: "title")
        notification.setValue(body, forKey: "body")
        
        do {
            try managedObjectContext.save()
        } catch  {
            fatalError("无法保存")
        }
        
        notifications.append(notification)
    }
    

 

2018-05-04 10:06:25 yingBi2014 阅读数 9034
let str:String = "意大利"
//字符串转Data
let data = str.data(using: String.Encoding.utf8)
//Data转字符串
let newStr = String(data: data!, encoding: String.Encoding.utf8)
print("data=" , data!  , "\n" ,  "newStr=" , newStr!)

输出结果

data= 9 bytes 
newStr= 意大利

2019-02-22 11:03:26 weixin_40918107 阅读数 178

 let enc = CFStringConvertEncodingToNSStringEncoding(UInt32(CFStringEncodings.GB_18030_2000.rawValue))

 let data = str.data(using: String.Encoding(rawValue: enc))

  

2017-10-09 17:43:12 m0_38016385 阅读数 290

Swift Core Data

首先需要创建一个模版,进去“file”->“new”->”file”->”Core Data”->”Data Model”。

然后点击右下角的“add entity”。
这里写图片描述

在Xcode里面这个Entity会变成一个NSMangedObject的一个实体。Xcode的数据库是基于SQL的,所以每一个entity会有属性、关系以及fetched properties(用于搜索?)。

可以通过NSMangedObject的两个函数来更改属性的值。

创建关系

进入视图显示模式,ctrldrag两个entity。然后修改两个relations的名字。
这里写图片描述

然后可以修改它们n对n的约束(type)。

这里写图片描述

这样子会把tweets这一个关系变成NSSet。

在代码中使用

在代码中使用这些数据库需要使用NSManagedObjectContext。

在创建开始的项目的时候,如果选择了“Use Core Data”,那么Xcode会自动帮我们创建一些方法(在AppDelegate)。当然也可以我们自己创建UIManagedDocument。

创建代码
首先为他们创建subclass。
这里写图片描述

记得要选择swift。

不过创建的时候出现了错误提示,要解决这个问题可以参考这里

插入行至数据库

NSEntityDescription.insertNewObjectForEntityForName("Tweet", inManagedObjectContext: moc)

这里写图片描述

访问某一行的属性(列)

func valueForKey(String) -> AnyObject?
func setValue(AnyObject?, forKey: String )

保存

context.save()

但是这个方法有一个问题,就是可能会抛出错误,我们必须学习一下swift中错误抛出的处理方式。

删除

mangedObjectContext.deleteObject(tweet)

搜索
使用NSFetchRequest来进行。你需要规定想抓取的Entity,以及抓取的规模和限制。

同时也需要规定返回的string的排序方式(使用NSSortDescripitor)。
这里写图片描述

NSPredicate则是规定我们需要什么,注意其中的%@有点像printf里的%f。
这里写图片描述

上面的图片返回的是joe在aDate后创建的tweets以及screenName是CS193p的tweeter。

例子
这里写图片描述
这里写图片描述

Thrown Errors

do {
    try context.save()
} catch let error {
    //里面会有NSError,它提供一些方法可以处理这些错误。 
}

UITableView和Core Data的交互

因为大量的数据非常适合使用Table View来展示,所以xcode直接提供了一个NSFetchedResultsController类来实现。它可以总是和数据库同步。
这里写图片描述
这里写图片描述

创建一个NSFetchedResultsController的方法:
这里写图片描述

swift data 转byte

阅读数 1053

Swift使用CoreData

阅读数 704

swift Data 扩展

阅读数 262

没有更多推荐了,返回首页