我意識到這已被問了很多次,但我只是不知道錯誤在哪裏出現在我的代碼中,對於愚蠢而抱歉。集合<CALayerArray:0x1cdb9b90>在枚舉時發生了變化
我知道故障是由這種方法:
-(void)getDataFromDatabase {
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
indicator.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
indicator.center = self.view.center;
[indicator bringSubviewToFront:self.view];
[UIApplication sharedApplication].networkActivityIndicatorVisible = TRUE;
[indicator startAnimating];
CGRect screenRect = [[UIScreen mainScreen] bounds];
UIView *overlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0, screenRect.size.width, screenRect.size.height)];
overlay.backgroundColor = [UIColor whiteColor];
[self.view addSubview:overlay];
[self.view addSubview:indicator];
NSString *listingurl;
listingurl = [NSString stringWithFormat:@"http://www.herefordshire-tourism-guide.co.uk/app/query.php?getlisting=1&listingname=%@", rowSelectedName];
listingurl = [listingurl stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
NSURL *url = [NSURL URLWithString:listingurl];
NSError *error = nil;
NSStringEncoding encoding;
NSString *jsonreturn = [[NSString alloc] initWithContentsOfURL:url usedEncoding:&encoding
error:&error];
NSData *jsonData = [jsonreturn dataUsingEncoding:NSUTF32BigEndianStringEncoding];
// In "real" code you should surround this with try and catch
NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
if (dict)
{
rows = dict[@"listings"];
}
dict = rows[0];
self.photos.font = [UIFont fontWithName:@"ProximaNova-Regular" size:18.0];
self.likes.font = [UIFont fontWithName:@"ProximaNova-Regular" size:18.0];
self.businessName.font = [UIFont fontWithName:@"ProximaNova-Extrabld" size:20.0];
self.address.font = [UIFont fontWithName:@"ProximaNova-Regular" size:16.0];
self.navigationItem.title = dict[@"business"];
NSString *favdb = [NSString stringWithFormat:@"%@", dict[@"favs"]];
if ([favdb isEqualToString:@""]) {
NSString *fav = [NSString stringWithFormat:@"0 Likes"];
self.favourites.text = fav;
} else {
NSString *fav = [NSString stringWithFormat:@"%@ Likes", dict[@"favs"]];
self.favourites.text = fav;
}
if ([favdb isEqualToString:@"1"]) {
NSString *fav = [NSString stringWithFormat:@"1 Like"];
self.favourites.text = fav;
}
self.businessName.text = dict[@"business"];
self.address.text = dict[@"location"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
indicator.frame = CGRectMake(140, 85, 40.0, 40.0);
[indicator bringSubviewToFront:self.view];
[indicator startAnimating];
[self.view addSubview:indicator];
UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:dict[@"image1"]]]];
self.image.image = img;
[UIApplication sharedApplication].networkActivityIndicatorVisible = FALSE;
[indicator stopAnimating];
});
listingLoc = [[CLLocation alloc] initWithLatitude:[dict[@"lat"] doubleValue] longitude:[dict[@"lon"] doubleValue]];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
float kilometers = [appDelegate.currentLoc distanceFromLocation:listingLoc]/1000;
int milesint = kilometers * 0.621371192;
NSString *milesOut = [NSString stringWithFormat:@"%i miles", milesint];
self.distance.text = milesOut;
networkImages = [[NSMutableArray alloc] init];
if (dict[@"image1"] != @"") {
[networkImages addObject:dict[@"image1"]];
}
[indicator stopAnimating];
[overlay removeFromSuperview];
}
和IM呼籲在viewWillAppear中方法的方法...
[self performSelectorInBackground:@selector(getDataFromDatabase) withObject:nil];
任何提示,我的代碼可能是以次充好,任何幫助都非常感謝!
謝謝。
這是很多代碼。你在哪裏迭代數組元素? –
好吧,無論何時你使用UIKit方法進行交互(如上面添加和刪除子視圖),它必須在主線程上完成,而不是在後臺線程中完成,就像你在這裏做的那樣。 UIKit是**不是線程安全的! – lnafziger