gpt4 book ai didi

iOS 8 widget,在应用组之间向前和向后共享数据

转载 作者:行者123 更新时间:2023-11-29 02:25:11 25 4
gpt4 key购买 nike

我有一个消息应用程序,我开始创建一个小部件。当用户打开应用程序时,会用新消息更新核心数据。我的愿望是:

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler

调用我将获取 UIViewController 并调用我的获取消息线程。将 UIViewController 链接到我的小部件目标时出现错误:

'sharedApplication' is unavailable....

所以我取消了它。

我要实现的目标:1. widgetPerformUpdateWithCompletionHandler 被调用2.应用程序启动获取消息线程/方法3. 完成后,它使用 NSUserDefaults 将数据发送回小部件

我的代码:

1:

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler
{
// Perform any setup necessary in order to update the view.

[self startGetMessages];

// If an error is encountered, use NCUpdateResultFailed
// If there's no update required, use NCUpdateResultNoData
// If there's an update, use NCUpdateResultNewData

completionHandler(NCUpdateResultNewData);
}

2:

- (void)startGetMessages
{
NSLog(@"%s", __PRETTY_FUNCTION__);

NSBundle *deviceBundle = [NSBundle mainBundle];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:deviceBundle];
id MainController = [storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"];
SEL getMessagesSelector = NSSelectorFromString(@"startGetMessages:");

if (MainController)
{
NSThread *startGetMessagesThread = [[NSThread alloc] initWithTarget:MainController
selector:getMessagesSelector
object:StringForInt(HRTableDataSourceKindUpdate)];
[startGetMessagesThread start];
}
}

3:

- (void)notifyWidgetForChanges
{

__block NSMutableDictionary *newMessages = [NSMutableDictionary new];

NSArray *results = [CoreDataPhotoRecord MR_findAllSortedBy:@"message.originalDate"
ascending:NO
withPredicate:[NSPredicate predicateWithFormat:@"(message.delete_message == %@) AND (message.type.integerValue == %d) AND (message.originalDate >= %@)",
@NO, NORMAL_MESSAGE, _notiftWidgetDate]];

NSLog(@"%s, _notiftWidgetDate: %@, newMessages.count: %d", __PRETTY_FUNCTION__, _notiftWidgetDate, newMessages.count);

[results enumerateObjectsUsingBlock:^(CoreDataPhotoRecord *photoDetails, NSUInteger idx, BOOL *stop)
{
if (photoDetails != nil && photoDetails.message != nil)
{
NSString *cleanMobile = [[ABAddressBook sharedAddressBook] getCleanMobile:photoDetails.message.mobile];
Contact *person = [[ABAddressBook sharedAddressBook] findContactWithPhoneNumber:cleanMobile];
ContactWidget *contact = [[ContactWidget alloc] init];
contact.name = (person != nil && person.name != nil && person.name.length > 0) ? person.name : cleanMobile;

[newMessages setObject:contact forKey:cleanMobile];
}
}];

[SharedUtilities archiveObject:newMessages.copy forKey:MESSAGES_KEY_NEW widget:true];

[DEFAULTS_WIDGET setObject:@"111" forKey:@"111"];
[DEFAULTS_WIDGET synchronize];

newMessages = nil;
results = nil;
}

widgetDefaults = [[NSUserDefaults alloc] initWithSuiteName:WIDGET_GROUP_NAME];

没有任何事情发生,因为第 2 步中的 MainController 为 nil。我能做什么?

最佳答案

nil出现问题是因为您尝试从小部件访问应用程序的 Storyboard。这并不简单,因为包含的应用程序和小部件扩展被保存在单独的包中。所以 [NSBundle mainBundle]在第 2 步中)与您应用中的 bundle 不同。

可能的解决方案包括:

  • 包括应用的 Main.storyboard在扩展包中,通过将其添加到 Copy Bundle resources在小部件的目标列表 Build Phases选项卡或仅将小部件目标添加到 Main.storyboard 目标成员列表

  • 移动负责从 MainController startGetMessages: 获取消息的代码进入共享框架,应用和小部件均可访问该框架,最好进入专用对象。

第二个更好。根据经验,在进行面向对象 编程时最好遵循SOLID 原则,其中S 代表单一职责 view controller 不应该负责提供系统范围内的消息获取。创建一个只有一项工作的专用对象 - 获取消息 - 并在目标之间共享它是一种可行的方法。

有关如何创建共享框架的详细说明,请参阅文档:https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

关于iOS 8 widget,在应用组之间向前和向后共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27648902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com