0

如何将完成处理程序的响应保存在静态变量中?在示例代码中

GTLQueryTictactoe *query = [GTLQueryTictactoe queryForScoresList];
[service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLTictactoeScores *object, NSError *error) {
  NSArray *items = [object items];
  // Do something with items.
}];

它说// Do something with items我想将它保存items在一个静态变量中,以便任何人都可以调用getMyItems来获取这些项目。我该怎么做?我的意思是客观c意义上的静态变量,其中值被记住。

图片上面的片段在 class 内Dog。并且 classPaper将需要使用这些项目,以便getMyItems从 class 内部调用Paper。我希望不必将项目保存在核心数据中。

现在我认为我的解决方案涉及static NSArray *items在块之外声明。但是那么其他方法将如何访问它呢?这甚至是一个好的解决方案吗?

下面的“解决方案”会因为我self在块内调用而导致内存泄漏吗?

@implementation Dog

static NSArray *items;

-(void) callToServer
{
GTLQueryTictactoe *query = [GTLQueryTictactoe queryForScoresList];
    [service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLTictactoeScores *object, NSError *error) {
      self.items = [object items];
    }];
}


-(NSArray *) getMyItems
{
  return items;
}
@end
4

1 回答 1

1

请注意,此解决方案绝不是线程安全的。将其用作更灵活解决方案的起点。

MyLoader.h

typedef void(^CallbackBlock)(id object);

@interface MyLoader : NSObject
+ (void)loadItemsWithCallback:(CallbackBlock)callback; //callback takes an NSArray* of MyData*
+ (void)invalidateCache;
@end

MyLoader.m

#import "MyLoader.h"

static NSArray *myCachedItems;

@implementation MyLoader

+ (void)loadItemsWithCallback:(CallbackBlock)callback {
    if (myCachedItems == nil) {
        [self executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLTictactoeScores *object, NSError *error) {
            myCachedItems = [object items];
            if (callback) callback(myCachedItems);
        }];
    } else {
        if (callback) callback(myCachedItems);
    }
}

+ (void)invalidateCache {
    myCachedItems = nil;
}

@end

使用 MyLoader

[MyLoader loadItemsWithCallback:^(NSArray *items) {
    /* When this callback executes, we have either just received data from the server
     * or cached data depending on if this request has been run already */
    self.items = items;
    [self reloadData]; //if this is for a UITableView
}];
于 2014-07-13T06:44:27.800 回答