从 NSObject 调用时 DBRESTClient 不起作用
Posted
技术标签:
【中文标题】从 NSObject 调用时 DBRESTClient 不起作用【英文标题】:DBRestClient not working when called from an NSObject 【发布时间】:2014-01-20 15:58:14 【问题描述】:我对 ios 还很陌生,我现在正在从事这个需要从存储通道(如 Dropbox 和 googleDrive)访问文件的大型项目...
我设法访问了保管箱文件并对其进行了操作,但问题是如果没有视图类上的 DBResClient 属性(在我的情况下为UITableView
),我无法做到这一点,这不是 MVC。
当我尝试在另一个类上使用它时,比如实现 DBRESTClientDelegate 的 NSObject
,什么都没有发生。
我知道这个问题之前已经发布过,有人说NSObject
需要对其进行强引用,以便它不会被释放,但我这样做了,仍然没有任何反应。
这是我的一些代码:
NSObject
类 DropboxServices
@interface DropboxServices : NSObject <DBRestClientDelegate>
@property (nonatomic, readonly) DBRestClient *restClient;
@implementation DropboxServices
@synthesize restClient=_restClient;
- (DBRestClient *)restClient
if (!_restClient)
if ( [[DBSession sharedSession].userIds count] )
_restClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
_restClient.delegate = self;
return _restClient;
- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata
NSLog(@"method called!!!!!!!!!!!!!!!!!!!");
这是我曾经拥有 DBRESTClient 的 UITableView
类:
@interface DropboxFolderItemsTableView : UITableView
@property (nonatomic, readonly) DropboxServices *dropboxServices;
但是当我尝试加载元数据时:
[[self.dropboxFolderItemsTableView.dropboxServices restClient] loadMetadata:@"/"];
什么都没有发生。
【问题讨论】:
【参考方案1】:在将近 2 周没有回应之后,我尝试了一种完全不同的方法。 我在这篇帖子Custom UIView as UITableView delegate and datasource? 中发现了一个有趣的事实,那就是我的每个 UITableViews 的委托控制器不一定是显示它的视图控制器。
所以我可以将我的 DBRESTClient 放在一个新创建的 viewController(或在我的情况下为 dropboxFolderItemsTableViewController 的 tableViewController)中,并从实际上包含表视图的视图控制器中对其进行强引用,然后分配实际的 dropbox tableView ( dropboxFolderItemsTableView) 作为这个新创建的 viewController 的表视图。
self.dropboxFolderItemsTableViewController=[[DropboxFolderItemsTableViewController alloc]init];
self.dropboxFolderItemsTableViewController.tableView=self.dropboxFolderItemsTableView;
【讨论】:
我面临同样的问题,尽管我认为这个解决方案不能清楚地解决 MVC 问题。我会寻找更合适的解决方案。以上是关于从 NSObject 调用时 DBRESTClient 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
-[NSObject(NSObject) doesNotRecognizeSelector:] 调用时崩溃 -[ViewController prepareForSegue:sender:]