PubNub 和多视图控制器

PubNub and Multiple View Controllers

我正在制作一个应用程序,它将使用 PubNub 作为应用程序的群聊部分。我在我的应用程序上打开了 Playback,并完成了设置代码的教程。不过我很困惑,因为所有代码都在 AppDelegate 中,并且我将聊天视图控制器作为故事板的一部分。我的问题是,我必须在我的视图控制器中执行哪些设置代码,以便我可以使用 historyForChannel:start:end:limit:withCompletion: 方法获取所有过去的 100 条消息。我必须创建一个新的 PubNub 客户端实例吗?这没有意义,因为用户将切换视图控制器并且它应该长期存储 属性。

我必须在视图控制器中执行哪些设置代码才能获取过去的消息? (要加载到非常精细的表格视图设置中)

所以我想出了一个可行的解决方案。首先,您必须通过在 AppDelegate.h 文件中定义 PubNub 客户端 属性 public,而不是 .m 实现。

// AppDelegate.h
#import <UIKit/UIKit.h>
#import <PubNub/PubNub.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate, PNObjectEventListener>

@property (strong, nonatomic) UIWindow *window;

// Stores reference on PubNub client to make sure what it won't be released.
@property (nonatomic) PubNub *pnClient;

@end

并且不要忘记从 AppDelegate.m

中删除
#import "AppDelegate.h"

@interface AppDelegate ()
/*
// Stores reference on PubNub client to make sure what it won't be released.
@property (nonatomic) PubNub *pnClient;    
*/ // Delete from here
@end

@implementation AppDelegate

如果您想发出通知等,请将 AppDelegate 作为 [self.pnClient] 属性 的侦听器。如果没有,只需删除 AppDelegate.h 中的 <PNObjectEventListener>AppDelegate.m 中的 [self.pnClient addListener:self];。如果您想保留它,请不要删除它。

现在,#import 你的 AppDelegate 在你的 ChatViewController.h 或你喜欢的 .m 中。然后,使您的 .h 符合 <PNObjectEventListener> 委托。然后,在您忘记之前,在您的 .h.m 中添加另一个客户端,以将您的 PubNub 客户端的 属性 存储在您的 AppDelegate 中。 :

// Stores reference on PubNub client to make sure what it won't be released.
    @property (nonatomic) PubNub *pnClient;

接下来,在您的 viewDidLoad 方法中,添加:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

self.pnClient = appDelegate.pnClient;

[self.pnClient addListener:self];

此代码首先获取您应用的 AppDelegate(因此不涉及共享实例或单例)。然后,它将您的应用程序委托的 pnClient 设置为您的视图控制器中的 "temporary" 客户端。 (明白为什么我们将 AppDelegate 的客户端移动到 .h 了吗?)最后,它将 self 添加为侦听器,因此您可以在视图控制器中执行操作。

仅此而已!

我建议使用您的聊天控制器来填充 UITableView 或其他东西,并使用 AppDelegate 来处理通知。