Ios 按钮';s来自url的图像-等待10秒后返回失败。主运行循环模式:KCFRUnlopDefaultMode
我有一个包含json格式的URLIos 按钮';s来自url的图像-等待10秒后返回失败。主运行循环模式:KCFRUnlopDefaultMode,ios,objective-c,json,url,Ios,Objective C,Json,Url,我有一个包含json格式的URL { "name":"RAI Radiodue", "cat":"Adult Contemporary", "img":"http://www.rai.it/dl/portaleRadio/images/ico_radio2.jpg", "url":"http://www.listenlive.eu/rai2.m3u" }, { "name":"RAI Radiotre", "ca
{
"name":"RAI Radiodue",
"cat":"Adult Contemporary",
"img":"http://www.rai.it/dl/portaleRadio/images/ico_radio2.jpg",
"url":"http://www.listenlive.eu/rai2.m3u"
},
{
"name":"RAI Radiotre",
"cat":"Classical/Culture",
"img":"http://www.rai.it/dl/portaleRadio/images/ico_radio3.jpg",
"url":"http://www.listenlive.eu/rai3.m3u"
}........etc
我尝试使用以下代码显示许多单选按钮:
for (int i = 0; i<[namesArray count]; i++) {
NSURL *url = [NSURL URLWithString: [pictureUrl objectAtIndex:i]];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImageView *subview = [[UIImageView alloc] init];
[subview setImage:[UIImage imageWithData:data]];
UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
int xxx = i%3;
int yyy = i/3.0f;
[bt setFrame:CGRectMake(35+95*xxx, 15+100*yyy, 60, 60)];
[bt setBackgroundImage:subview forState:UIControlStateNormal];
bt.tag = 200+i;
bt.selected = NO;
[bt.layer setMasksToBounds:NO];
[bt.layer setShadowColor:[UIColor blackColor].CGColor];
[bt.layer setShadowOpacity:0.8f];
[bt.layer setShadowOffset:CGSizeMake(1.0f, 1.0f)];
[bt addTarget:self action:@selector(Play:) forControlEvents:UIControlEventTouchUpInside];
[mainscroll addSubview:bt];
}
我该怎么办
NSData *data = [NSData dataWithContentsOfURL:url];
此行阻塞主线程,主线程在运行此行之前等待数据加载:
UIImageView *subview = [[UIImageView alloc] init];
[subview setImage:[UIImage imageWithData:data]];
您必须在其他线程中运行下载数据,并在下载数据时设置映像。pictureUrl阵列可能有问题,或者您在运行代码时没有internet连接。当我运行代码时,传入您在帖子中显示的2个字符串,代码运行良好
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *stringsArray = @[@"http://www.rai.it/dl/portaleRadio/images/ico_radio2.jpg", @"http://www.rai.it/dl/portaleRadio/images/ico_radio3.jpg"];
[self downloadImagesFromNamesArray:stringsArray];
}
-(void)downloadImagesFromNamesArray:(NSArray *) namesArray {
for (int i = 0; i<[namesArray count]; i++) {
NSURL *url = [NSURL URLWithString: [namesArray objectAtIndex:i]];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [UIImage imageWithData:data];
UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
int xxx = i%3;
int yyy = i/3.0f;
[bt setFrame:CGRectMake(35+95*xxx, 15+100*yyy, 60, 60)];
[bt setBackgroundImage:img forState:UIControlStateNormal];
bt.tag = 200+i;
bt.selected = NO;
[bt.layer setMasksToBounds:NO];
[bt.layer setShadowColor:[UIColor blackColor].CGColor];
[bt.layer setShadowOpacity:0.8f];
[bt.layer setShadowOffset:CGSizeMake(1.0f, 1.0f)];
[bt addTarget:self action:@selector(Play:) forControlEvents:UIControlEventTouchUpInside];
[self.mainscroll addSubview:bt];
}
}
-(void)viewDidLoad{
[超级视图下载];
NSArray*stringsArray=@[@”http://www.rai.it/dl/portaleRadio/images/ico_radio2.jpg", @"http://www.rai.it/dl/portaleRadio/images/ico_radio3.jpg"];
[从NamesArray自下载图像:stringsArray];
}
-(void)从namesArray下载ImagesFromNamesArray:(NSArray*)namesArray{
对于(int i=0;ii)如果您记录url(在循环的第一行之后),它是否为您提供了正确的url?此外,在使用setBackgroundImage:forState:的行中,您传递的是一个UIImageView,而不是一个不正确的UIImage。NSURL*url=[NSURL URLWithString:[pictureUrl objectAtIndex:i]];=它返回正确的url,但NSData*data=[NSData dataWithContentsOfURL:url];没有。我使用了dispatch_async。在第一个块中,我从url获取数据,在第二个块中,我设置了映像。现在我的问题是:新的视图控制器存在,但应用程序好像没有网络连接。您是否尝试使用类似asyncImageView的东西?:并且尝试只使用数据制作一个按钮?对于第一个选项:sam第二个问题,当它到5号线的时候,它从街区出去了。
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *stringsArray = @[@"http://www.rai.it/dl/portaleRadio/images/ico_radio2.jpg", @"http://www.rai.it/dl/portaleRadio/images/ico_radio3.jpg"];
[self downloadImagesFromNamesArray:stringsArray];
}
-(void)downloadImagesFromNamesArray:(NSArray *) namesArray {
for (int i = 0; i<[namesArray count]; i++) {
NSURL *url = [NSURL URLWithString: [namesArray objectAtIndex:i]];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [UIImage imageWithData:data];
UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
int xxx = i%3;
int yyy = i/3.0f;
[bt setFrame:CGRectMake(35+95*xxx, 15+100*yyy, 60, 60)];
[bt setBackgroundImage:img forState:UIControlStateNormal];
bt.tag = 200+i;
bt.selected = NO;
[bt.layer setMasksToBounds:NO];
[bt.layer setShadowColor:[UIColor blackColor].CGColor];
[bt.layer setShadowOpacity:0.8f];
[bt.layer setShadowOffset:CGSizeMake(1.0f, 1.0f)];
[bt addTarget:self action:@selector(Play:) forControlEvents:UIControlEventTouchUpInside];
[self.mainscroll addSubview:bt];
}
}
-(void) downloadImagesFromNamesArray:(NSArray *) imageURLStrings {
static int count = 0;
NSString *urlString = imageURLStrings[count];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *req = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
NSLog(@"%@", connectionError);
count ++;
if (count < imageURLStrings.count) {
[self downloadImagesFromNamesArray:imageURLStrings];
}
}else{
UIImage *img = [UIImage imageWithData:data];
if (img) {
UIButton *bt = [UIButton buttonWithType:UIButtonTypeCustom];
int xxx = count%3;
int yyy = count/3.0f;
[bt setFrame:CGRectMake(35+95*xxx, 15+100*yyy, 60, 60)];
[bt setBackgroundImage:img forState:UIControlStateNormal];
bt.tag = 200+ count;
bt.selected = NO;
[bt.layer setMasksToBounds:NO];
[bt.layer setShadowColor:[UIColor blackColor].CGColor];
[bt.layer setShadowOpacity:0.8f];
[bt.layer setShadowOffset:CGSizeMake(1.0f, 1.0f)];
[bt addTarget:self action:@selector(Play:) forControlEvents:UIControlEventTouchUpInside];
[self.mainscroll addSubview:bt];
}else{
NSLog(@"Data was received but no image was created from the data");
}
count ++;
if (count < imageURLStrings.count) {
[self downloadImagesFromNamesArray:imageURLStrings];
}
}
}];
}