小编Joa*_*edt的帖子

为什么 JSON 文档没有被完全消耗?

我正在尝试从外部来源检索 JSON 数据以进行练习。我已准备好所有代码,但由于某种原因,我收到一条错误消息,指出该文档未完全使用。我已经观看并阅读了多个教程和指南,但似乎仍然无法正确理解。我还搜索了堆栈以寻找答案,但由于我不知道出了什么问题,所以我真的不知道要寻找什么。

代码全部到位,没有明显的过错。JSON 数据已经过验证,它可以作为原始 JSON 数据进行检索,如日志中所示。当数据应该传输到 java 数据类时,问题发生在 Gson 转换中。任何想法可能是错误的?

public class JSONimport extends AsyncTask<Void, Void, DeserializedContainer> {

private static final String TAG = "TAG";

//VARIABLES TO HOLD JSON DATA
private OnLoadListener mListener;


//CONSTRUCTOR
public JSONimport(OnLoadListener listener) {
    this.mListener = listener;
}

//ASYNK, DO IN BACKGROUND THREAD
@Override
protected DeserializedContainer doInBackground(Void... voids) {
    String myJSON = ""; //TEMP VARIABLE TO HOLD JSON DATA
    String completeJSONdata = ""; //VARIABLE TO HOLD COMPLETE JSON DATA

    try {
        URL urlObject = new …
Run Code Online (Sandbox Code Playgroud)

java android json network-programming gson

5
推荐指数
1
解决办法
2万
查看次数

有没有办法在调试视图层次结构中查看对象名称?

debug view hierarchy是查看构成 的不同层的好方法UI,但据我所知,无法查看对象具有哪些出口引用名称。它们简单地称为它们是什么类型的对象。例如,按钮仅被称为而UIButton不是插座的名称。是的,我们可以看到它所viewController在的位置,但这并不容易,而且追踪某些物体仍然非常困难。

那么,有没有办法查看对象的引用出口被称为什么?

debugging xcode iboutlet

5
推荐指数
2
解决办法
2414
查看次数

为什么我不能让 passthrough 主题为组合工作?

刚刚进入Combine,由于某种原因我无法passthrough subjects上班。尽管我从多个不同来源复制粘贴了示例,但它们只是不会打印任何内容。我尝试过使用PublishersCurrentValueSubjects,它们工作得很好,但是使用PassThroughSubjects; 没有。这是我尝试过的一个例子:

let mySubject = PassthroughSubject<String, Error>()

mySubject.sink(receiveCompletion: { completion in
        print("-- completion", completion)
    }, receiveValue: { value in
        print("-- value", value)
}).cancel()

mySubject.send("one")
mySubject.send("two")
mySubject.send("three")
Run Code Online (Sandbox Code Playgroud)

这是运行在viewDidLoad. 我究竟做错了什么?

就像我说的,我已经尝试过PublishersCurrentValueSubjects取得了成功:

["one", "two", "three"].publisher
    .sink(receiveValue: { v in
        print("-- hello", v)
}).cancel()

let subject = CurrentValueSubject<String, Error>("Initial Value")

subject.send("Hello")

subject.sink(receiveCompletion: { c in
    print("-- completion", c)
}, receiveValue: { v in
    print("-- value", v)
}).cancel()
Run Code Online (Sandbox Code Playgroud)

ios swift combine

5
推荐指数
1
解决办法
1375
查看次数

如何检查userDefault是否为空?

如果userDefault为空,我试图拒绝访问某个视图控制器,但是代码似乎无法正常工作。为了更清楚一点,我将收藏夹列表保存到userDefault中。这是我的代码:

 if UserDefaults.standard.array(forKey: "favorites") == nil {

        navigationController?.popToRootViewController(animated: true)
        return
    }
Run Code Online (Sandbox Code Playgroud)

错误是索引超出范围,这意味着整个块都将被忽略(此块运行后的代码,并且由于用户默认值为空,因此在尝试检索不存在的信息时会崩溃)。

有趣的是,代码在我第一次尝试进入viewController时起作用(它拒绝我访问)。但是,如果我最喜欢标记一个对象(保存到userDefault),然后取消收藏同一对象(userDefault变为空),然后输入viewController,程序将崩溃。

我试过了:

if let favExist = UserDefaults.standard.array(forKey: "favorites") {
        print("")
        print("FAV EXISTS")
        print("")

    }else {
        print("")
        print("NOPE")
        print("")
        navigationController?.popToRootViewController(animated: true)
        return
    }
Run Code Online (Sandbox Code Playgroud)

...同样的问题仍然存在。在print()中,日志告诉我“我喜欢的标记”,“然后不喜欢的标记”之后“收藏夹存在”,然后尝试访问页面(即使userDefault现在应该为空)。

我也尝试过其他线程的代码。从另一个线程解决我的问题的建议代码是:

let defaults = UserDefaults.standard

    if (!defaults.bool(forKey: "favorites")) {
        defaults.set(true, forKey: "favorites")
    }
Run Code Online (Sandbox Code Playgroud)

我不太确定如何实现它?我在哪里使用?它是做什么的?

知道有什么问题吗?

swift userdefaults

3
推荐指数
1
解决办法
4557
查看次数

如何解码对象数组并从用户默认值中检索它?

我有一个arraywith 类型[NotificationTriggers],我想存储在userdefaults. 为此,数据需要是encodeddecoded。我在这里遵循了教程:

https://cocoacasts.com/ud-5-how-to-store-a-custom-object-in-user-defaults-in-swift

和这里:

https://www.hackingwithswift.com/example-code/system/how-to-load-and-save-a-struct-in-userdefaults-using-codable

但我仍然收到一个我似乎无法解决的错误。

我有一个我在变量的 get 和 set 中施展魔法extensionuserDefaults地方。NotificationTriggers Struct看起来像这样:

struct NotificationTriggers: Equatable, Codable {
    var doorName: String
    var notificationTrigger: String
}
Run Code Online (Sandbox Code Playgroud)

Encoding似乎工作,但在decoding我得到一个error说法

无法将“[Any]”类型的值转换为预期的参数类型“Data”

这是代码:

extension UserDefaults {
    var notificationTrigger: [NotificationTriggers] {
        get {
            if let data = self.array(forKey: UserDefaultsKey.notificationTrigger.rawValue) {
                do {
                    let decoder = JSONDecoder()
                    //CODE BELOW PRODUCE ERROR
                    if let decodedData = try …
Run Code Online (Sandbox Code Playgroud)

encoding decoding ios swift userdefaults

2
推荐指数
1
解决办法
101
查看次数