Objective-C:从 JSON 文件读取远程通知太慢

Posted

技术标签:

【中文标题】Objective-C:从 JSON 文件读取远程通知太慢【英文标题】:Objective-C : reading from JSON file too slow for remote notifications 【发布时间】:2017-06-25 00:47:48 【问题描述】:

我正在尝试设置可变的新 ios 10 推送通知,并且在 didReceiveRequest 方法中我尝试读取一些参数,一个存储在 NSUserDefaults 中,一个存储在本地 JSON 文件中,如下所示:

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler 
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSInteger index = [defaults integerForKey:@"index"];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Words" ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

    NSString *word = dict[@"Irish"][index];

    self.bestAttemptContent.body = [NSString stringWithFormat:@"%@", word];
    self.contentHandler(self.bestAttemptContent);

问题是方法运行太慢并且没有完成。我知道是这种情况,因为苹果会警告它,因为如果我用一个简单的行替换上面的整个方法,将标题更改为随机字符串,那么它运行良好。有谁知道如何使它更快或解决这个问题?

我想要完成的是每天收到每日推送通知时“索引”变量都会增加,它应该从 json 文件中读取该索引。所以我基本上希望用户每天都能收到 JSON 文件中的下一个字符串

谢谢

【问题讨论】:

您的 Words.json 文件有多大?可以使用效率更高的存储,比如 sqlite 吗? 我想过。我找到了一种方法来获取存储在用户默认值中的单词,但现在遇到了一些奇怪的问题,当我将正文文本返回 Null 时......在一些我知道存在的文本上 您收到serviceExtensionTimeWillExpire 了吗? Apple 给了你 30 秒的时间来处理这个请求,而且看起来你的代码运行时间并不长。问题可能出在其他地方。 我同意我认为问题可能不在这里。我找到了一种将我想要的单词存储在 NSUserDefaults 中的方法,但仍然遇到问题(请参阅此处:***.com/questions/44751398/…) 【参考方案1】:

为什么不在一个新线程中进行实际处理,然后返回完成方法调用:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^
   self.contentHandler = contentHandler;
   ...
);    

【讨论】:

我会试试这个,谢谢。如果有效,会回帖。 不幸的是没有工作。无论如何,谢谢你的建议!

以上是关于Objective-C:从 JSON 文件读取远程通知太慢的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS 应用程序中的远程 HTML/json 项读取 json

Objective-C:如何在 JSON 中读取 JSON?

使用 swift 5 从远程读取 json 内容并在 Xcode 的主界面上打印

在 Objective-C 中解析 JSON 后的随机结果

在 Objective-C 中使用 JSON 数据的 NSJSONSerialization 读取 NSDictionary 集的键值

从.Net Core 2.0 Web应用程序中的apppsettings.json文件中读取值[重复]