Metalプログラミング
こんにちは、IOSフリーランスエンジニアの永田です。
相変わらずIOSのアプリ開発をフリーランスで実践しています。
現在は東京駅付近で働いています。
IOSエンジニアは決して多くいません。むしろ少ないようです。
なので仕事には、困らず好きなことを実践できている状態です。
仕事を終えた後も、そう簡単に人が真似できないことをしようと考えて、日夜スキルを磨く行動を実践しています。
オープンソースサイトのGithubで毎日プログラミングソース類を作り、コミット、プッシュする挑戦を始めています。
が、しかし、プログラミングを没頭するあまり、人との交流をおろそかにしてしまっています。
これは良かったり、悪かったり、一概にどっちが良いとは言えませんが、
比率を考えて、人へも還元できればと思うようになりました。
技術を磨きつつ、そのように行動したいと考えておりますので、何卒宜しくお願い致します。
ios Swift4で Metalを使用したライブラリーを作りました。
Versionは0.3.1です。
永続化機構をFileManagerを使い、実装しました。
構造と、方法を知ってしまえば、具体的な実装はシンプルなのですが、実装をしつつ理解するという部分で少し戸惑いました。
具体的な部分はUIImageをData型、String型として保存するのではなく、UIImageはそのまま保存できるという点です。
UIImageをString型で保存を実施して、FileManagerを読み込む際にUIImageに変換を実施しようしたところ、上手く出来ず少しハマりました。
こちらは作成しているライブラリーです。
MetalFileの読み込み
全開の記事で、MetalFileのディレクトリーの場所を解説していましたが、すみません。訂正します。
現状の階層出ないと、キャッシュがクリアーされた際に読み込みが出来ない状態でした。
FileManagerでの永続化保存
保存を実施している部分です。for文でループを実施している理由は、一つのFileに一つのUIImageデータを保存するためです。
一つにFileに複数のUIImageDataを保存すると、最後に保存したデータのみ表示する形になるからです。
モバイルにディレクトリーを作り、ループすることによりFile名を変更して、File名を複数作成して保存しています。
public func saveMehod(images:[UIImage])
{
fileManager.fileExists(atPath: messageManagement.defaultsPath, isDirectory: &isDir)
if isDir.boolValue {
for i in 0...images.count-1 {
try! fileManager.createDirectory(atPath: messageManagement.defaultsPath ,withIntermediateDirectories: true, attributes: nil)
fileURL.append(URL(fileURLWithPath: messageManagement.defaultsPath).appendingPathComponent(fileNamed+"\(i)"))
imageData.append(UIImagePNGRepresentation(images[i])!)
try! imageData[i].write(to: fileURL[i], options: .atomic)
}
}
}
FileManagerでの保存データの読み込み
画面起動中にUIimageの画像を表示するタイミングでUserDefaultsでindexのIntの整数を予め保存しています。
画面起動時にUserDefaultsで永続化したIntの整数をループの回数として判定しています。
ループの回数がFileを作成した数になります。
public func readObject()
{
for i in 0...ObjectDefaults().objectSetIndexDefaults()-1 {
fileURL.append(URL(fileURLWithPath: messageManagement.defaultsPath).appendingPathComponent(fileNamed+"\(i)"))
imageData.append(try! Data(contentsOf: fileURL[i],options: NSData.ReadingOptions.mappedIfSafe))
uiImage.append(UIImage(data:imageData[i])!)
guard fileURL[i].path != "" else {
return
}
ImageEntity.imageArray.append(uiImage[i])
}
}
こんにちは、IOSフリーランスエンジニアの永田です。
相変わらずIOSのアプリ開発をフリーランスで実践しています。
現在は東京駅付近で働いています。
IOSエンジニアは決して多くいません。むしろ少ないようです。
なので仕事には、困らず好きなことを実践できている状態です。
仕事を終えた後も、そう簡単に人が真似できないことをしようと考えて、日夜スキルを磨く行動を実践しています。
オープンソースサイトのGithubで毎日プログラミングソース類を作り、コミット、プッシュする挑戦を始めています。
が、しかし、プログラミングを没頭するあまり、人との交流をおろそかにしてしまっています。
これは良かったり、悪かったり、一概にどっちが良いとは言えませんが、
比率を考えて、人へも還元できればと思うようになりました。
技術を磨きつつ、そのように行動したいと考えておりますので、何卒宜しくお願い致します。
ios Swift4で Metalを使用したライブラリーを作りました。
Versionは0.3.1です。
永続化機構をFileManagerを使い、実装しました。
構造と、方法を知ってしまえば、具体的な実装はシンプルなのですが、実装をしつつ理解するという部分で少し戸惑いました。
具体的な部分はUIImageをData型、String型として保存するのではなく、UIImageはそのまま保存できるという点です。
UIImageをString型で保存を実施して、FileManagerを読み込む際にUIImageに変換を実施しようしたところ、上手く出来ず少しハマりました。
こちらは作成しているライブラリーです。
MetalFileの読み込み
全開の記事で、MetalFileのディレクトリーの場所を解説していましたが、すみません。訂正します。
現状の階層出ないと、キャッシュがクリアーされた際に読み込みが出来ない状態でした。
FileManagerでの永続化保存
保存を実施している部分です。for文でループを実施している理由は、一つのFileに一つのUIImageデータを保存するためです。
一つにFileに複数のUIImageDataを保存すると、最後に保存したデータのみ表示する形になるからです。
モバイルにディレクトリーを作り、ループすることによりFile名を変更して、File名を複数作成して保存しています。
public func saveMehod(images:[UIImage])
{
fileManager.fileExists(atPath: messageManagement.defaultsPath, isDirectory: &isDir)
if isDir.boolValue {
for i in 0...images.count-1 {
try! fileManager.createDirectory(atPath: messageManagement.defaultsPath ,withIntermediateDirectories: true, attributes: nil)
fileURL.append(URL(fileURLWithPath: messageManagement.defaultsPath).appendingPathComponent(fileNamed+"\(i)"))
imageData.append(UIImagePNGRepresentation(images[i])!)
try! imageData[i].write(to: fileURL[i], options: .atomic)
}
}
}
FileManagerでの保存データの読み込み
画面起動中にUIimageの画像を表示するタイミングでUserDefaultsでindexのIntの整数を予め保存しています。
画面起動時にUserDefaultsで永続化したIntの整数をループの回数として判定しています。
ループの回数がFileを作成した数になります。
public func readObject()
{
for i in 0...ObjectDefaults().objectSetIndexDefaults()-1 {
fileURL.append(URL(fileURLWithPath: messageManagement.defaultsPath).appendingPathComponent(fileNamed+"\(i)"))
imageData.append(try! Data(contentsOf: fileURL[i],options: NSData.ReadingOptions.mappedIfSafe))
uiImage.append(UIImage(data:imageData[i])!)
guard fileURL[i].path != "" else {
return
}
ImageEntity.imageArray.append(uiImage[i])
}
}