出于某种目的,我创建了单例,通过这个新对象组织Dropbox的所有作品。
所以我有下面的单例,初始化代码如下:
- (id)init
{
self = [super init];
if (self)
{
self.cloudName = @"Dropbox";
DBSession* dbSession = [[DBSession alloc] initWithAppKey:DP_App_KEY
appSecret:DP_App_SECRET
root:ROOT];
[DBSession setSharedSession:dbSession];
self.restClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
self.restClient.delegate = self;
}
return self;
}
如果你能看到我在我的singleton init方法中直接初始化DBSession。应用程序调用init方法,似乎一切都应该运行良好。
因此,当我登录应用程序时,请在打开的URL方法中调用它:
if ([[DBSession sharedSession] isLinked])
和app输出这里Dropbox已链接,但是当我尝试获取root @" /"的元数据时文件夹(文件列表)并调用此方法:
[self.restClient loadMetadata:folder];
该应用输出此错误:
[WARNING] DropboxSDK: error making request to /1/metadata/dropbox - (403) Parameter not found: oauth_token
2014-04-25 00:30:15.652 PDF-Notes[75257:70b] Error loading metadata: Error Domain=dropbox.com Code=403 "The operation couldn’t be completed. (dropbox.com error 403.)" UserInfo=0xb666600 {path=/, error=Parameter not found: oauth_token}
但是当我再次通过Xcode重新运行app时,一切都运行良好。此外,如果我在app delegate中设置DBSession
,它也可以。我真的不明白为什么它在单例中不起作用,因为调用方法以相同的方式工作,但只有在app中初始化DBSession
它才能正常工作。
答案 0 :(得分:2)
首先 - 您必须在会话链接后才创建REST客户端 - 这将确保您将DBRestClient连接到真实会话。
第二 - 如果您的应用程序在设备上安装了Dropbox应用程序,则可能会出现问题。在这种情况下,您的应用程序将推送到数据库应用程序的身份验证。
第三 - 你的类的 - (id)init的实现不是单例。当您的对象仅存在于一个公共对象中并且无法进行重新创建时,单例是一种模式。我的目标C我们也必须关注保留计数(在非Arc代码中,shode是被覆盖的内存管理方法)。但无论如何,你的init方法(通常称为共享实例)应如下所示:
static Singleton * sharedInstance= nil;
+(Singleton *) sharedInstance
{
static dispatch_once_t once_token = 0;
dispatch_once(&once_token, ^
{
sharedInstance = [Singleton new];
});
return sharedInstance ;
}
希望这可以帮助您进行数据库集成