我的代码有效,但我有一个最佳实践问题:我在状态中有一个对象数组,用户交互将一次更改一个对象的值.据我所知,我不应该直接改变状态,我应该总是使用setState
.如果我想以任何代价避免这种情况,我将通过迭代深度克隆数组,并更改克隆.然后将状态设置为克隆.在我看来,避免改变我以后会改变的状态只会降低我的表现.
详细版本:
this.state.data是一个对象数组.它代表论坛中的主题列表,收藏夹按钮将切换,调用clickCollect()
.由于我在状态中有一个数组,当我更改一个项的is_collected属性时,我需要创建一个要使用的数组的副本,并在更改为新值后,我可以将其设置为状态.
Run Code Online (Sandbox Code Playgroud)var data = this.state.data.slice(0); data[index].is_collected = !data[index].is_collected; this.setState({data: data});
var data = this.state.data
:这会将指针复制到数组,push(),shift()等会直接改变状态.双方data
并this.state.data
会受到影响.
var data = this.state.data.slice(0)
:这使得浅层克隆,推送和移位不会改变状态,但在我的克隆中,我仍然有指向状态数组元素的指针.所以,如果我改变data[0].is_collected
,this.state.data[0].is_collected
也会改变.这发生在我打电话之前setState()
.
通常我应该这样做:
Run Code Online (Sandbox Code Playgroud)var data = []; for (var i in this.state.data) { data.push(this.state.data[i]); }
然后我更改index的值,当它为false时将其设置为true,否则为true时:
Run Code Online (Sandbox Code Playgroud)data[index].is_collected = !data[index].is_collected;
并改变状态:
Run Code Online (Sandbox Code Playgroud)this.setState({data: data});
考虑我的阵列相对较大或非常大,我想这次迭代会降低我的APP的性能.如果我知道这是出于任何原因的正确方法,我会支付这笔费用.但是,在这个函数(clickCollect
)中,我总是将新值设置为状态,我不是在等待一个错误的API响应,它会说停止进行更改.在所有情况下,新值都将进入状态.实际上我setState
只调用UI再次渲染.所以问题是:
for var i in ...
).slice(0)
如果我的数组包含对象,那么生成浅层clone()是否有意义?正在对数组内部的对象进行更改,因此浅层克隆仍会更改我的状态,就像copy(data = this.state.data
)一样.为简单起见,我的代码被简化并且API调用被删除.
这是一个初学者的问题,所以也欢迎采用完全不同的方法.或链接到其他问答.
Run Code Online (Sandbox Code Playgroud)import React from …
嗨,我想建立一个Flutter应用程序,但想在我的应用程序中放置一些广告,我可以用Flutter做到吗?我看着本地反应,他们有可用的广告,但我找不到任何有关Flutter的信息.
什么是ios中的同步和异步?我是客观的新人.当我从服务器获取数据时,我应该在我的代码中使用哪一个.所以请帮助我.
提前致谢.
我正在创建一个演示项目来显示表单进度。我的意思是,当用户分四个步骤填写表单时,我想显示用户每个步骤的进度。
为了更好地理解,请查看下面的屏幕截图。
我想创建类似上面屏幕截图的内容。所以请建议我。任何帮助或建议将不胜感激。
我无法使用 UISlider,因为不可能在一个 UISlider 中创建四个拇指。
提前致谢... :)
我是使用Swift快速学习的自学开发iPhone应用程序。我正在设计一个使用FBSDK进行Facebook身份验证的登录页面。我已经成功实现了登录和注销的登录按钮。它返回用户名和ID,但无法绘制用户电子邮件ID的图形,并显示代码2500错误。另外,我无法使用新用户登录。它会自动以同一用户登录。
这是错误:
UserInfo={com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey=0, com.facebook.sdk:FBSDKGraphRequestErrorHTTPStatusCodeKey=400, com.facebook.sdk:FBSDKErrorDeveloperMessageKey=An active access token must be used to query information about the current user., com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode=2500, com.facebook.sdk:FBSDKGraphRequestErrorParsedJSONResponseKey={
body = {
error = {
code = 2500;
"fbtrace_id" = BimF4Nuqx0v;
message = "An active access token must be used to query information about the current user.";
type = OAuthException;
};
};
code = 400;
}})
Successfully logged in with Facebook...
123
result Optional({
id = 120008981838163;
name = "Nisha Ios";
})
Did Logout of Facebook
Run Code Online (Sandbox Code Playgroud)
这是我在AppDelegate.swift中的代码:
import UIKit …
Run Code Online (Sandbox Code Playgroud) 我正在使用设备麦克风录制音频,AVAudioRecorder
该麦克风以.caf格式返回文件,该文件只能在 Apple 设备上播放,但不能在 Android 设备上播放。由于 Apple 不支持.mp3文件,所以我想在上传到服务器之前将其转换为.mp4格式。为.MP4是良好的只有音频?我可以转换它AVAssetExportSession
吗?
以下是录音机代码:
func setupAudioRecorder ()
{
let fileMgr = FileManager.default
let dirPaths = fileMgr.urls(for:.documentDirectory,
in:.userDomainMask)
let soundFileURL = dirPaths[0].appendingPathComponent("myaudio.caf")
let recordSettings =
[AVEncoderAudioQualityKey: AVAudioQuality.min.rawValue,
AVEncoderBitRateKey: 16,
AVNumberOfChannelsKey: 2,
AVSampleRateKey: 44100.0] as [String : Any]
do {
try audioSession.setCategory(
AVAudioSessionCategoryPlayAndRecord)
} catch let error as NSError {
print("audioSession error: \(error.localizedDescription)")
}
do {
try audioRecorder = AVAudioRecorder(url: soundFileURL,
settings: recordSettings as [String : …
Run Code Online (Sandbox Code Playgroud) 有人可以解释在这里使用自签名证书验证证书之间的区别:
和SSL固定如下所述:
https://infinum.co/the-capsized-eight/how-to-make-your-ios-apps-more-secure-with-ssl-pinning
SecPolicyCreateSSL
意思?SecTrustEvaluate
做什么的?谢谢
我正在尝试使用以下代码在swift4中访问相机和照片库
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
let alert = UIAlertController(title: "", message: "", preferredStyle: .actionSheet)
alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: {(action: UIAlertAction) in
imagePickerController.sourceType = .camera
print(1)
}))
alert.addAction(UIAlertAction(title: "Photo Album", style: .default, handler: {(action: UIAlertAction) in
imagePickerController.sourceType = .photoLibrary
}))
alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
但它不起作用。即使我确保plist具有相机和照片库的授权,也没有收到访问授权请求。我对以下代码进行了一些操作
AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in
}
let photos = PHPhotoLibrary.authorizationStatus()
if photos == .notDetermined {
PHPhotoLibrary.requestAuthorization({status in
})
}
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = …
Run Code Online (Sandbox Code Playgroud) 提前致谢.我在数组中获取图像url.
myarray = { "http://www.abc.com/uploads/sarab.jpg", .... };
Run Code Online (Sandbox Code Playgroud)
现在我不知道如何在表格视图中访问图像?是否有任何示例代码可以提供帮助?
ios ×6
swift ×3
iphone ×2
arrays ×1
camera ×1
fbsdk ×1
flutter ×1
https ×1
ipad ×1
javascript ×1
objective-c ×1
photolibrary ×1
pinning ×1
reactjs ×1
self-signed ×1
setstate ×1
ssl ×1
state ×1
swift3 ×1
xcode ×1