0

我在后台线程中运行一些代码以从服务中获取文本文件。该代码在某些时候会触发一个委托。一旦调用了委托,它就会抛出 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。

4

2 回答 2

1

似乎很可能FetchWithNSData:不会保留传递dataRep的数据,并且数据会在您耗尽本地自动释放池的下一行被释放?

于 2011-02-21T19:28:51.487 回答
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:TRUEFetchWithNSData 方法有机会保留数据。

于 2011-02-21T19:36:23.190 回答