8

我的NSMutableArray. 我有这个简洁的代码用于下载文件并显示文件的数据以UITextView用于测试目的。没有for循环,一切都很好。给我问题的代码在这个函数中:

- (void)complexDownload {
    int i;
    for (i=0; i < downloadArray.count; i++) {
        if (isBusy == NO) {
            [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
            downloadURL = [downloadArray objectAtIndex:i];
            NSLog(@"URL is %@", downloadURL);
            NSLog(@"Downloading object at index %i", i);
            NSURL *url = downloadURL;
            NSURLRequest *theRequest=[NSURLRequest requestWithURL:url
                                                      cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                  timeoutInterval:60.0];

            NSURLConnection *theConnection = [NSURLConnection connectionWithRequest:theRequest delegate:self];

                if (theConnection) {
                    self.downloadData = [NSMutableData data];
                    isBusy = YES;
                    NSLog(@"Busy value in download cycle equals %i, downloading", isBusy);
                } else {
                    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
                    NSLog(@"Connection failed");
                    isBusy = NO;
                }
        }
    }
}

我首先认为问题可能出在 中isBusy BOOL,但即使没有if条件,应用程序也会崩溃。除了这个,编译器没有给我任何错误: 这是大屏幕截图的链接

其余功能如下:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [downloadData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSString *dataString = [[NSString alloc] initWithData:downloadData encoding:NSASCIIStringEncoding];
    self.dataTextView.text = dataString;
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    NSLog(@"Download finished!");
    isBusy = NO;
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"%@", error);
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}

所有 NSLogged 值都很好,数组有链接,所有链接都是正确的。

4

4 回答 4

6

我的猜测是,在某些时候要么downloadArray[i]在某个时候损坏,要么它不是 NSUrl。CFURLCopyAbsoluteURL()代码在调用 from中崩溃[NSURLRequest requestWithURL...]

于 2012-12-19T15:05:56.113 回答
1

您使用异步 api initWithRequest:delegate:并尝试使用isBusy标志使其同步。这种方法一开始是非常错误的,NSURLConnection 类足够聪明,如果使用得当就不需要使用任意标志。您应该认真重新考虑使用 NSOperations 或 GCD。如果你打算做更复杂的连接编程,也许你应该考虑使用像 RestKit 这样的第三方框架。

于 2012-12-19T15:13:23.553 回答
1

摆脱 for 循环和 isBusy 指示器。始终只处理第一个或最后complexDownload一个(更合适的)对象,然后将其从数组中删除。再次connectionDidFinish调用。complexDownload为此使用performSelector。等待时间甚至可能是 0.0f。通过这样做,您downloadArray将充当某种队列。

于 2012-12-19T15:23:36.083 回答
1

我认为这是 [NSURLRequest requestWithURL:url 中的 url-object 的问题 没有必要将 URL 复制到额外的对象中。尝试这个:

NSLog(@"URL is %@", [downloadArray objectAtIndex:i]);
NSLog(@"Downloading object at index %i", i);
NSURL *url = [downloadArray objectAtIndex:i];

(或在downloadURL之前添加self.)

如果您的 downloadArray 包含 NSStrings:

NSURL *url = [NSURL URLWithString:[downloadArray objectAtIndex:i]];

我建议使用外部框架,如 [ASIHTTPRequest](http://allseeing-i.com/ASIHTTPRequest/

于 2012-12-19T15:24:55.907 回答