我试图将一些领域支持添加到使用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的线程并对其进行所有操作,并根据需要将数据编组到其他线程?
这似乎很常见,所以我觉得我错过了一些明显的东西。