我正在开发一个写在的IOS社交应用程序SWIFT.
后端是PHP, MySQL(用于事件处理),+一点NodeJS, Socket.io(用于实时聊天和通知)
我成功地聊了聊:
当用户发送消息时,Socket.io服务器通过以下方式处理它:
/为此,后端只是Socket.io服务器,它也处理数据库
工作良好.
但是有些事件并不是实时的,但我仍然希望通过Socket.io向给定用户发送通知.
例如:如果已经喜欢帖子,则将noti发送给帖子所有者
我已经编写了PHP文件,用于在数据库中保存,但是
我该怎么做通知部分,安全吗?
我想出了3个想法:
- 应用程序向我的PHP + MySQL后端发送Web请求,它处理那里的数据,然后在返回"成功"后,应用程序(SWIFT)向帖子所有者发送通知(通过Socket.io XCode pod)
func likePost(postId : Int, completion: @escaping (ActionResult?)->()){
let connectUrl = URL(string: appSettings.url + "/src/main/like.php")
var request = URLRequest(url: connectUrl!)
request.httpMethod = "POST"
let postString = "userId=\(userId)&session=\(session)&pId=\(postId)"
request.httpBody = postString.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request) {
(data: Data?, response: URLResponse?, error: Error?) in
if error != nil {
return completion(ActionResult(type: 0, code: 0, …Run Code Online (Sandbox Code Playgroud) 我正在进行类似应用程序的聊天,其中tableView显示动态高度单元格.
单元格以正确的方式限制其视图和子视图
这样AutoLayout 就可以预测细胞的高度
(上,下,领先,尾随)
但仍然- 正如您在视频中看到的那样 -滚动指示条显示计算出错误的高度:
它会在出现新行时重新计算高度.
视频: https ://youtu.be/5ydA5yV2O-Q
(在第二次尝试向下滚动一切都很好)
码:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的问题.有人可以帮我吗?
添加了github:
我目前正在开发社交应用程序。
我想在我的PHP后端上安装一个版本控制系统,但是我不知道从哪里开始:我在网上查找了很多文章,但是我真的不明白我所发现的内容。
假设我的应用程序是v1.0。然后,我创建了一个新版本v2.0,当然我也更新了PHP文件。此后,如果某人尚未从v1.0更新其应用程序,我希望他们能够访问myapp.com/v1.0/该应用程序,以免该应用程序崩溃。
你会推荐什么?
我的一个典型的PHP文件如下所示:
<?php
// Include files
include_once ('../../config.php');
include_once (ROOT_DIR . '/config/includes.php');
$_USERDATA = Validator::validateUser($_POST["userId"], $_POST["session"]);
// Valid session
$qry = $db->prepare('SELECT n.id, n.type, n.time, n.isRead, n.postId, n.commentId, n.text, n.inReplyToCommentId, u.id as byUserId,
( SELECT COUNT(nu.id)
FROM notificationUsers AS nu
WHERE nu.notificationId = n.id ) as detail1,
( SELECT nu2.userId
FROM notificationUsers AS nu2
WHERE nu2.notificationId = n.id ORDER BY nu2.id DESC LIMIT 1 ) as latestUserId FROM notifications AS n LEFT JOIN userData AS …Run Code Online (Sandbox Code Playgroud) 我想防止应用程序在视频录制和拍照之间切换时出现延迟:仅使用 AVCaptureMovieFileOutput 并在捕获图像时从中获取快照。
就像 SnapChat 所做的那样。
有可能吗?我还没有找到任何相关的文章。
我不想在输出之间切换,因为它滞后
编码:
@IBOutlet var cameraView: UIView!
@IBOutlet var cameraSwitchButton: UIButton!
@IBOutlet var captureButtonView: CaptureButton!
@IBOutlet var cameraFlashButton: UIButton!
var captureSession = AVCaptureSession()
let movieOutput = AVCaptureMovieFileOutput()
var activeInput: AVCaptureDeviceInput!
var previewLayer = AVCaptureVideoPreviewLayer()
var outputURL: URL!
var connection : AVCaptureConnection!
override func viewDidLoad() {
if setupSession() {
setupPreview()
startSession()
connection = movieOutput.connection(with: AVMediaType.video)
if (connection?.isVideoStabilizationSupported)! {
connection?.preferredVideoStabilizationMode = AVCaptureVideoStabilizationMode.off
}
}
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(captureButtonTapped))
let longGesture = UILongPressGestureRecognizer(target: self, …Run Code Online (Sandbox Code Playgroud) 所以我面临一个问题
重新加载/添加行几次后,表视图变慢(滚动、点击响应变慢)
所以在用户登录后,应用程序会下载 10 个"WorldMessages"。它被加载到这个表视图中。
如果用户向下滚动,它会调用一个加载更多 10 的函数: loadOlderOwnWorldMessages()
每个单元格都有一个tapGestureRecognizer+longPressGestureRecognizer
而且我不得不提一下,如果用户重新加载 tableView,那么它会清除数据并再次加载前 10 个 WorldMessages
问题
我不知道为什么,但是例如,如果我重新加载 tableView 50 次并且每次向下滚动一点或更多,那么 tableView 就会变慢。
也许是因为点击/长按手势识别器或限制?
该应用程序如下所示:
卡顿后的视频:
https://www.youtube.com/watch?v=65NkjS-Kz3M
(如果我杀死应用程序并再次打开它,那么它会再次顺利运行,直到我重新加载它几次)
代码:
// 这不是整个代码,我删除了很多不重要的行(如重新加载函数等)
class ProfileViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITabBarDelegate {
// Classes
let handleData = HandleData()
let handleResponses = HandleResponses()
let worldMessagesFunctions = WorldMessagesFunctions()
let profileFunctions = ProfileFunctions()
// View Objects
@IBOutlet var tableView : UITableView!
// Variables
var userWorldMessages = [WorldMessage]()
var lastContentOffsetY : CGFloat?
var currentSelectedWorldMessageIndexPath …Run Code Online (Sandbox Code Playgroud)