使用 do while 循环加载背景

Posted

技术标签:

【中文标题】使用 do while 循环加载背景【英文标题】:setbackground loading with do while loop 【发布时间】:2014-03-27 18:18:50 【问题描述】:

我正在开发一个应用程序,我使用以下代码检查 url。

-(无效)存在 NSString *strImg = @"一些网址"; NSURL *aImgUrl = [NSURL URLWithString:strImg]; NSMutableURLRequest *imgRequest = [NSMutableURLRequest requestWithURL:strImg]; [imgRequest setHTTPMethod:@"HEAD"]; imgConnection = [NSURLConnection connectionWithRequest:imgRequest delegate:self];

当我得到回复时,我会这样做。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response if ([(NSHTTPURLResponse *)response statusCode] == 200) // 网址存在 appDel.isExists = TRUE; 温度=假; [自加载数据]; NSLog(@"%ld",(long)[(NSHTTPURLResponse *)response statusCode]); 否则如果([(NSHTTPURLResponse*)响应状态码] == 404) //url不存在 appDel.isExists = FALSE; 温度=真; [自加载数据]; NSLog(@"%ld",(long)[(NSHTTPURLResponse *)response statusCode]);

这是我的加载数据代码

-(无效)加载数据 结果=假; isReqSent = 假; 做 如果(appDel.isExists == TRUE) NSURL *aTxtUrl = [NSURL URLWithString:apiText]; NSURL *aImgUrl = [NSURL URLWithString:apiImage]; NSURLRequest *imgRequest = [NSURLRequest requestWithURL:aImgUrl]; NSURLRequest *txtRequest = [NSURLRequest requestWithURL:aTxtUrl]; [NSURLConnection sendAsynchronousRequest:txtRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 如果(数据) NSString *strTxt = [[NSString alloc]initWithData:数据编码:NSUTF8StringEncoding]; [lblTime setText:strTxt]; [policyImgWebView loadRequest:imgRequest]; 结果=真; ]; 如果(结果) appDel.isExists = TRUE; 别的 如果(!isReqSent) NSString *soapMessage = @"我的肥皂信息"; NSString *soapAction = @"我的肥皂网址"; [objWebServiceParser xmlParsing:soapMessage:soapAction:Number]; isReqSent = TRUE; 如果(温度) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ [自背景进程]; ); 而(结果 == FALSE);

这是我的后台进程

-(void)backgroundProcess NSString *strImg = @"一些网址"; NSURL *aImgUrl = [NSURL URLWithString:apiImage]; NSMutableURLRequest *imgRequest = [NSMutableURLRequest requestWithURL:aImgUrl]; [imgRequest setHTTPMethod:@"HEAD"]; imgConnection = [NSURLConnection connectionWithRequest:imgRequest delegate:self];

我不知道我哪里做错了,谁能指导我?

我希望后台进程继续运行,直到它获取数据,当接收到的数据 appdel.isExists 为真并进入主线程以更新 ui。

我尝试了 GCD 和 performSelectorInTheBackground,但我没有做对,我得到 NSThread 失败错误 35。


它与 NSURLSessionDownloadTask 一起工作,但仍在寻找更好的选择。

【问题讨论】:

你的意思是 performSelectorInTheBackground ? 是的,当我处理到后台时,我在 NSURLConnection 委托方法中没有得到响应。 您只想从 URL 加载图像吗? 是的@AkshitZaveri,但在后台(继续检查直到 url 有效,一旦有效加载它) 【参考方案1】:

不要在后台调用NSURLConnection。因为NSURLConnection 会自动工作。由于您没有发送异步请求,因此它将在后台工作并且不会挂起您的主线程。在您的加载数据中删除调度。你有:

if (temp)
    
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^
            [self backgroundProcess];
        );
    

制作:

if (temp)
    
        [self backgroundProcess];
    

你不需要使用 dispatch。

【讨论】:

然后做while循环会消耗大量内存 内存和后台执行任务没有任何关系。记忆是完全不同的东西。你在使用 ARC 吗?【参考方案2】:

要从服务器加载UIImageView 中的图像,您可以使用以下框架。

SDWebImage

您将获得 completionBlockprogressBlock 以及更多可用于更新 UI 的属性。它会分块通知您,然后您可以在 UI 上更新您想要的任何内容。

示例:

如果imageURL 有效(这是你的情况),只需加载图像就像这段代码一样简单

UIImageView *imageView;
[imageView setImageWithURL:[NSURL URLWithString:YOUR_URL]];

而且它也有如下丰富的方法

UIImageView *imageView;
[imageView setImageWithURL:[NSURL URLWithString:YOUR_URL] 
           placeholderImage:[UIImage imageNamed:@"placeholder.png"]
           completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) 
           
               // in "image" you'll get the downloaded image from the URL
               ... completion code here ...

           ];

【讨论】:

以上是关于使用 do while 循环加载背景的主要内容,如果未能解决你的问题,请参考以下文章

代码宏定义中使用循环语句

代码宏定义中使用循环语句

在 while 循环中更新 UIView 的背景颜色

嵌入式宏定义中do...while的意义

for while do-while三种循环体的特点和缺点

do…while循环