我在后台线程中运行一些代码以从服务获取文本文件。该代码在某个时刻触发了代理。一旦调用了委托,它就会抛出SIGABRT错误,而且我的概念听起来也不合适。
在后台线程运行的代码:
- (void)FetchStores
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Fetch from service
NSString *serviceURL = @"http://../index.html";
NSURL *myURL = [NSURL URLWithString:serviceURL];
NSData *dataRep = [NSData dataWithContentsOfURL:myURL];
storesList = [[Stores alloc] init];
storesList.storesDelegate = self;
[storesList FetchWithNSData:dataRep];
[pool release];
}
一旦从服务中提取了所有商店,storesList
对象将触发委托。委托被主线程中的函数捕获。
你有什么建议我做错了吗?
谢谢,
F。
答案 0 :(得分:1)
FetchWithNSData:
似乎很可能不会保留传递的dataRep
,并且数据会在您排空本地自动释放池的下一行被取消分配?
答案 1 :(得分:1)
在某个地方调用委托时,你应该切换到主线程。 特别是如果在某个地方,您将根据提取的数据更新UI。
你可以使用
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
进行转换。
也许是这样的:
storesList = [[Stores alloc] init];
storesList.storesDelegate = self;
[storesList performSelectorOnMainThread:@selector(FetchWithNSData:) withObject:dataRep waitUntilDone:TRUE];
在您的情况下,您应该使用waitUntilDone:TRUE
,以便FetchWithNSData方法有机会保留数据。