首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当UIActivityIndicatorView单击IBAction时,IBAction不能工作

当UIActivityIndicatorView单击IBAction时,IBAction不能工作
EN

Stack Overflow用户
提问于 2014-07-26 20:07:23
回答 1查看 79关注 0票数 0

我有一个将图像上传到服务器的代码,当图像上传到服务器时,我会放置一个UIActivityIndicatorView。its的UIActivityIndicatorView直到代码结束才会出现,只有在图像上传之后才会出现UIActivityIndicatorView。

这是代码:

代码语言:javascript
复制
- (IBAction)sendTHE:(id)sender {

    _sendTHE.enabled = NO;
    LodingactivityIndicator.hidden = NO;
    [LodingactivityIndicator startAnimating];

    if ([_textmsg.text isEqualToString:@""]) {
        UIAlertView *userExists = [[UIAlertView alloc] initWithTitle:@"Error:" message:@"Please write some message" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [userExists show];
        _sendTHE.enabled = YES;
    }
    else {

        NSString *URLString;
        NSData *storeData = UIImageJPEGRepresentation(_imageView.image, 90);
        if (_imageView.image==NULL)
        {    URLString = [NSString stringWithFormat:@"http://37.142.62.22/the/sendmsg.php?f=ns&t=%@&sn=%@&re=%@", _textmsg.text,_userid,_reciverid];
        }
        else if (_imageView.image!=NULL)
        {    URLString = [NSString stringWithFormat:@"http://37.142.62.22/the/sendmsg.php?f=fs&t=%@&sn=%@&re=%@", _textmsg.text,_userid,_reciverid];
        }
        NSMutableURLRequest *request  = [[NSMutableURLRequest alloc] init];
        [request setURL:[NSURL URLWithString:URLString]];
        [request setHTTPMethod:@"POST"];

        NSString *boundary = @"---------------------------14737809831466499882746641449";
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
        [request addValue:contentType forHTTPHeaderField:@"Content-Type"];

        NSMutableData *body = [NSMutableData data];
        [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.jpg\"\r\n", @"the"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[NSData dataWithData:storeData]];
        [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [request setHTTPBody:body];

        NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
        NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
        [LodingactivityIndicator stopAnimating];


        //NSLog(@"%@",returnString);
        //[self performSegueWithIdentifier:@"showfriends" sender:self];

    }


}

UIActivityIndicatorView在NSURLConnection执行请求后启动。如何在执行请求时显示UIActivityIndicatorView?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-26 20:22:41

您正在主线程上同步执行请求。这意味着在请求返回之前,sendTHE:方法不会返回(并且所有视图都被禁用)。

你有几个选择。

您可以在主线程之外的另一个线程上同步执行请求:

代码语言:javascript
复制
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    /* Do your networking */ 

    dispatch_async(dispatch_get_main_queue(), ^{

        /* Update your UI with the result */

    });
});

你可以用[NSURLConnection +sendAsynchronousRequest:queue:completionHandler:]

您可以使用像AFNetworking这样的库来处理这一切。

请记住:

  • 不要用耗时的网络和磁盘操作阻止主线程。
  • 始终在主线程上更新您的UI
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24975082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档