Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从iOS完成块中保存数据_Ios_Objective C Blocks - Fatal编程技术网

如何从iOS完成块中保存数据

如何从iOS完成块中保存数据,ios,objective-c-blocks,Ios,Objective C Blocks,我基本上实现了一个更高级的NSURLConnection类,它从服务器下载数据,将数据解析到字典中,然后返回一个数据字典。我试图添加一个完成块选项(除了一个委托选项),但每当我试图将该数据存储到另一个类中时,它就会崩溃 [dataFetcher_ fetchDataWithURL:testURL completionHandler:^(NSDictionary *data, NSInteger error) { contentDiction

我基本上实现了一个更高级的NSURLConnection类,它从服务器下载数据,将数据解析到字典中,然后返回一个数据字典。我试图添加一个完成块选项(除了一个委托选项),但每当我试图将该数据存储到另一个类中时,它就会崩溃

        [dataFetcher_ fetchDataWithURL:testURL completionHandler:^(NSDictionary *data, NSInteger error) {        
            contentDictionary_ = data;            
    }];
我可以很好地记录这些数据,基本上我想用它做什么就做什么,但一旦我试图将它保存到另一个变量中,它就会崩溃,并显示一条非常模糊的消息

编辑:崩溃消息为EXC\u BAD\u ACCESS,但堆栈跟踪为0x00000000错误:地址不包含指向对象文件中某个节的节

我在singleton的init方法中调用这个函数。如果我在完成块中设置它,它确实允许我保存数据

[SingletonClass sharedInstance].contentDictionary = data
但是,由于sharedInstance尚未返回,因此该应用程序将永远被卡住,因此singleton对象仍然为nil,因此完成块中的sharedInstance会一次又一次地调用init

编辑2:单例代码如下所示:

+ (SingletonClass*)sharedInstance {
   static SingletonClass *instance;
   if (!instance) {
       instance = [[SingletonClass alloc] init];
   }
   return instance;
}


- (id)init {
    self = [super init];
    if (self) {
        dataFetcher_ = [[DataFetcher alloc] init];
        NSString *testURL = @"..."  
        [dataFetcher_ fetchDataWithURL:testURL completionHandler:^(NSDictionary *data, NSInteger error) {        
            [SingletonClass sharedInstance].contentDictionary = data;

        }];

    }
    return self;
}

正如我所说,这很好,但会反复重复初始化代码,直到应用程序崩溃。这只发生在我第一次在设备上运行应用程序时,因为我缓存了返回的数据,一旦缓存了数据,它就不会崩溃。我想说self.contentDictionary=data,但这会崩溃

指定要在块中使用的变量,块外有_block指令:

__block NSDictionary *contentDictionary_;

[dataFetcher_ fetchDataWithURL:testURL completionHandler:^(NSDictionary *data, NSInteger error) {        
    contentDictionary_ = data;            
}];

您在设置“实例”之前调用递归。(我现在看到你从OP中理解了这一点)

在您的块中,您可以使用ivar或访问器来代替

[SingletonClass sharedInstance].contentDictionary

使用:
\u contentDictionary=[数据副本]
self.contentDictionary=数据
假设支持contentDictionary属性的ivar为_contentDictionary


听起来你好像试过self.contentDictionary,但失败了?我让它在一个测试中工作,并启用了ARC,所以您的dataFetcher可能会有一些影响。在我的测试中,dataFetcher只返回一个包含单个元素的字典。

结果表明问题出在一堆不同的部分上。我的URL有时是空的,我的数据获取程序会立即失败并调用完成块。在我的完成块中,我没有包含任何错误处理,因此如果singleton类没有初始化,它将永远重复。使用真实的URL,这不会发生


不过,我仍然想弄清楚,当我试图将数据分配给ivar时,它为什么会崩溃。

真正晦涩的消息是什么?这些信息可能与有相同问题的人或知道解决方案的人有关。什么是
contentDictionary\uuuu
?实例变量?局部变量?听起来你的单例初始值设定项有问题。你可以发布你的单例是如何存储的,以及它是如何初始化的吗?我更新了这篇文章来显示单例。contentDictionary是一个ivar,它的块NSDictionary或只是NSDictionary似乎没有什么区别。我想可能是这样,但我还是遇到了同样的崩溃。这可能是我如何实现fetchDataWithURL方法的问题吗?看起来可能是我的数据获取程序的问题。我试过每个人的建议,但没有一个有效,所以可能是别的。