swift Запроснаконсультацию。 ПоследовательноеполучениекартинокизPFFileдлямассиваобъектовPFObject
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift Запроснаконсультацию。 ПоследовательноеполучениекартинокизPFFileдлямассиваобъектовPFObject相关的知识,希望对你有一定的参考价值。
//
// Model.swift
// KidSpace
//
// Created by October Hammer on 4/19/17.
// Copyright © 2017 Ocotober Hammer. All rights reserved.
//
import Foundation
import Parse
import ParseUI
import Bolts
//Это нужно чтобы зарегистрировать унаследованный от PFOject класс
extension Category: PFSubclassing {
static func parseClassName() -> String {
return "Category"
}
}
//Создаю класс, унаследованный от PFObject
class Category: PFObject {
//class Category {
// @NSManaged public private(set) var objectId: String?
@NSManaged public private(set) var name: String?
@NSManaged public private(set) var picture: PFFile?
@NSManaged public private(set) var pictureData: Data?//хочу хранить данные для картинки в этом свойстве
@NSManaged public private(set) var url: String?
@NSManaged public private(set) var parent: Category?
init(_ id: String, name: String) {
super.init()
self.objectId = id
self.name = name
}
//метод, которым получаю данные из PFFile
func retrieveImage(from: PFFile, result: @escaping (_ imageData: Data?) -> Void ) {
from.getDataInBackground(block: {(imageData: Data?, error: Error?) -> Void in
if error == nil {
if let imageData = imageData {
if let imageFile = UIImage(data: imageData) {
print("I've got a picture for \(self.objectId), size: \(imageData.count)")
imageFile.write(to: self.objectId!)// Записываю полученное изображение в файл
}
result(imageData)//И вызываю замыкание с результатом, чтобы присвоить полученные данные уже вне этого метода
}
} else {
print("☠️ \(error?.localizedDescription ?? "there is some error")")
result(nil)
}
})
}
//вызов этого метода из ВьюКонтролера происходит вот так:
// Category.selectRootElements() { (result) -> Void in
// if let categorySelection = result {
// self.rootCategories = categorySelection
// self.collectionView?.reloadData()
// }
// }
static func selectRootElements(_ compleationHandler: @escaping ((_ categorySelection: [Category]?) -> Void)) {
var catSelection: [Category]? = []//Это у меня локальная переменная, в которую я буду скалдывать свою выборку
let query = PFQuery(className: "category")
query.whereKeyDoesNotExist("parentID")// Получаю только корневые элементы, то есть те, у которых ссылка на родителя - пустая, их у меня в приложении - 8 записей
query.findObjectsInBackground {(pfCategories: [PFObject]?, error: Error?) in
if error == nil {
if let pfCategories = pfCategories {
print("Successfully retrieved \(pfCategories.count) categories.")
//for (index, everyCategory) in pfCategories.enumerated() {
if pfCategories.count > 0 {
//Получаю 1-ю запись, с самой большой картинкой. Хочу сначала вытащить ее, и только потом обрабатывать последовательно остальные записи
let category = Category(pfCategories[0].objectId!, name: pfCategories[0]["name"] as! String)//по сути я создаю новый инстанс
category.url = pfCategories[0]["URL"] as? String
if let picture = pfCategories[0].value(forKey: "picture") as? PFFile {
category.retrieveImage(from: picture) {(_ imageData: Data?) -> Void in
category.pictureData = imageData//вот они, данные картинки
catSelection?.append(category)//добавил
}
}//Все, у меня иссякли идеи. Если просто перебирать полученные pfCategories в Цикле,
//то картинки вытаскиваются асинхронно, и первая самая большая приходит последней.
//Как Комплишен изменить таким образом, чтобы он после получения данных картинки запускал получение картинки в следующем элементе - я уже и не знаю.
//Раньше в класса PFFile были метод getData, сейчас все - inBackground
//Я думаю, может задействовать NSNotificationCenter - добавить подписку и обозревателя. Когда метод выполнится, чтобы он
//слал нотификацию о том, что мол картинка получена, можно запускать получение следующей
}
//После того, как я получил все нужные элементы, уже с картинками, я хочу их вернуть во ВьюКонтроллер:
DispatchQueue.main.async {
compleationHandler(catSelection)
}
}
}
}
}
func getImage() -> UIImage? {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = documentsURL.appendingPathComponent("\(self.objectId).png").path
if FileManager.default.fileExists(atPath: filePath) {
return UIImage(contentsOfFile: filePath)
}
return nil
}
}
extension UIImage {
func write(to: String){
do {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent("\(to).png")
if let pngImageData = UIImagePNGRepresentation(self) {
try pngImageData.write(to: fileURL, options: .atomic)
}
} catch { }
}
}
以上是关于swift Запроснаконсультацию。 ПоследовательноеполучениекартинокизPFFileдлямассиваобъектовPFObject的主要内容,如果未能解决你的问题,请参考以下文章
php Имитируетфункционал“Отображатьнастатическойстраницесписокзаписей”。
php Имитируетфункционал“Отображатьнастатическойстраницесписокзаписей”。
php Шаблоныпоусловиючерез$ template#страница#категория#запись
La Sylphide 仙女
text Вслучаееслинеобходимоконтролироватьадреснуюстрокувпутикоторойуказываетсялокализацияпроектавирту
php быстраяинексациямассива。 однаизнаиболеечастоиспользуемыхфункций。