从服务器提取数据会导致内存警告

时间:2013-07-17 07:48:03

标签: objective-c memory-management

我正在开发一个IOS应用程序。此应用程序连接服务器并获取每个表的所有行。我的应用程序的一些代码如下;

for(NSString* tableName in dtTables)
{
    long PageCount=2000;

    long rowCount=0;
    long currCount=0;

    .
    .

    rowCount= [(NSNumber*)[row objectAtIndex:0] longValue];  // count row in the table

     while (currCount<rowCount)
     {

        long Next=MIN(PageCount,rowCount-currCount);

        SkylightQuery* query = [ServerQueryGenerator GenerateSelect:tableName :nil :nil :nil :nil :false :nil];
        query.LimitBegin=currCount;
        query.LimitLenght= Next;

        NSMutableDictionary* table = [[ServerDatabase SI] Select:query];

        .
        .
        currCount +=Next;
      } // while
}//for

Select类的ServerDatabase方法中,我将serizalized Skylight查询变量中的请求发送到服务器。 Command变量包含一个包含序列化服务器请求的字符串。

NSURLRequest *Request = [NSURLRequest requestWithURL:[NSURL URLWithString:[command stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30];
NSURLResponse *Response = nil;
NSError *err = nil;
NSData *response = [NSURLConnection sendSynchronousRequest: Request returningResponse: &Response error: &err];

服务器中有70个表。有些表有100条记录,有些表有10000条记录。 所以我在2000年的每个表2000中都获得了数据。

我在这里遇到两个问题。

  1. 获取一些表数据(5000行表等)之后,程序会多次导致memorv警告并退出。
  2. 从服务器获取2000行表太慢了。有时需要1分钟。
  3. 如何管理或解决这些问题? 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您的代码看起来像生成一个SQL select语句,因此您应该设置一些限制来过滤(或分页)您要检索的数据。如果需要,您仍然可以收集所有数据。您没有显示如何处理响应数据,但通常应在开始下一次下载之前将其存储到磁盘。