从NSURLSessionDataTask完成处理程序更新领域对象

时间:2018-06-06 10:34:28

标签: objective-c multithreading realm grand-central-dispatch nsurlsession

我试图将一些领域支持添加到使用Objective-C编写的现有应用程序中,并且在所有者的请求下它将保持为Objective-C。

我有一个像这样的对象

//Realm managed class
@interface Foo : RLMObject <MyDownloadDelegate>
@property NSString* result;
@end

@interface FOO

{
    self = [super init];
    if (self) {
        [self downloadResult];
    }
    return self;
}


-(void) downloadResult {


    NSURL *url = [NSURL URLWithString:@"https://www.lemurmonitors.com/cgi-bin/brd-edmunds.pl?service=decode&vin=19XFB2F81FE267130&country=US"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url
                                             cachePolicy:NSURLRequestReloadIgnoringCacheData
                                         timeoutInterval:30];

    NSURLSession *session = [NSURLSession sharedSession];
    @weafiky(self); //Create weak ref macro
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
                                      {
                                          @strongify(self) //weak to strong macro
                                          if (!error) {
                                              NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

                                              if(self) {
                                                  [self downloadComplete:str];
                                              }
                                          }
                                      }];
    [dataTask resume];
}

-(void)downloadComplete:(NSString*)result{
    self.result = result; //Blows up here with CRASH: Realm accessed from incorrect thread.
}
@end

当我运行此操作时,下载完成,应用程序崩溃并出现错误&#34; Realm从错误的线程访问。&#34;

所以我理解只能在创建它们的线程上访问领域对象,但是我在执行它时遇到了麻烦。实现这种操作的最佳方法是什么? 几点想法: 我是否有NSURLSessionDataTask在首次创建RLMObject的主线程上调度块? 我是否创建了一个新的realm实例并进行了更新? 创建一个专用于Realm的线程并对其进行所有操作,并根据需要将数据编组到其他线程?

这似乎很常见,所以我觉得我错过了一些明显的东西。

0 个答案:

没有答案