- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 iOS 开发新手。我不知道 dispatch_get_main_queue()
所以我想从我的服务器图像 url 中获取图像大小,如
首先,我解析我的 JSON 数据并获取图像大小,如下所示
[self.feedArray addObjectsFromArray:[pNotification.userInfo valueForKey:@"items"]];
[self fillHeightArray];
在这里,我在我的 self.feedArray
中设置了解析数据,然后我得到了像这样的高度
-(void)fillHeightArray
{
NSMutableArray *requestArray=[[NSMutableArray alloc]init];
NSMutableArray *dataArray=[[NSMutableArray alloc]init];
for (int i=0; i<[self.feedArray count];i++)
{
NSString *urlString = [[self.feedArray objectAtIndex:i]valueForKey:@"photo"];
NSURL *imageFileURL = [NSURL URLWithString:urlString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:imageFileURL];
[requestArray addObject:urlRequest];
}
dispatch_queue_t callerQueue = dispatch_get_main_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("Lots of requests", NULL);
dispatch_async(downloadQueue, ^{
for (NSURLRequest *request in requestArray) {
[dataArray addObject:[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]];
}
dispatch_async(callerQueue, ^{
for (int i=0; i<[dataArray count]; i++)
{
UIImage *imagemain=[UIImage imageWithData:[dataArray objectAtIndex:i]];
UIImage *compimage =[self resizeImage:imagemain resizeSize:CGSizeMake(screenWidth/2-16,180)];
CGSize size = CGSizeMake(screenWidth/2-16,compimage.size.height);
[self.cellHeights addObject:[NSValue valueWithCGSize:size]];
}
[GlobalClass StopSpinner:self.view];
self.cltItem.hidden=FALSE;
[self.cltItem reloadData];
[self.cltItem.collectionViewLayout invalidateLayout];
[[NSUserDefaults standardUserDefaults]setValue:@"1" forKey:Loading];
});
});
}
然后像这样调整我的图片大小
-(UIImage *)resizeImage:(UIImage *)orginalImage resizeSize:(CGSize)size
{
float oldWidth = orginalImage.size.width;
float scaleFactor = size.width / oldWidth;
float newHeight = orginalImage.size.height * scaleFactor;
float newWidth = oldWidth * scaleFactor;
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
[orginalImage drawInRect:CGRectMake(0,0,newWidth,newHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
所以,从这段代码我第一次得到了很好的结果但是当我想加载更多数据所以这段代码第二次运行时我得到了无效的图像大小
我不明白那里的问题是什么,但我认为我的
dispatch_queue_t callerQueue = dispatch_get_main_queue();
dispatch_queue_t downloadQueue = dispatch_queue_create("Lots of requests", NULL);
加载更多数据时出现问题。
请帮助我。
最佳答案
您总是在此行中添加对象:
[self.cellHeights addObject:[NSValue valueWithCGSize:size]];
当您第二次运行代码时,数组会变大,并且旧值仍然存在于其开头。当您第二次运行代码时,这可能会给您带来不好的结果。
编辑:
它可能会运行得更慢,因为您已经进行了一些保留周期/存在内存泄漏。在这种情况下,它第一次运行正常,每次额外运行都会变慢。除了 self.cellHeights 表不断增长之外,我确实没有看到您的代码有任何问题。检查过程的其余部分是否有每次变大的元素,并确保不再使用的对象被释放。
此外,尝试使用“构建和分析”[ALT + CMD + B]。这可能会指出一些内存泄漏或其他问题。
分析工具在定位泄漏方面也非常有效,您可以使用键盘上的 [CMD + I] 访问它们。
您可以尝试的另一件事是直接调用 main_queue,例如:
dispatch_async(dispatch_get_main_queue(), ^(void) {
//do sth
});
您将避免创建另一个对象,而且您在整个代码段中只使用一次 main_queue。
尝试这样做,如果你有任何收获,请告诉我。
关于ios - dispatch_get_main_queue() 运行得不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32739571/
我有一个启用了分页的 UIScrollView,我想显示一些带有图像的“页面”。 我在主线程中加载第一页的图像并显示它。然后我开始在后台线程中加载其他页面图像 dispatch_async(l
我是 iOS 开发新手。我不知道 dispatch_get_main_queue() 所以我想从我的服务器图像 url 中获取图像大小,如 首先,我解析我的 JSON 数据并获取图像大小,如下所示 [
我使用 Reachability 和 dispatch_async(dispatch_get_main_queue() 测试互联网连接当我测试以下代码时,它可以正常工作,但会被多次调用。 家长: @p
我在 iOS 中学到了一条全局规则 -> 永远不要阻塞主线程。但是,有几次我遇到了违反此规则的开源代码片段。 下面是两个这样的例子: 以下函数取自 https://github.com/piwik/p
在完成例程中 [NSURLConnection sendAsynchronousRequest:request queue:que
我有一个 ViewController,点击按钮后我想从网络获取数据。 let myClass = Class() myClass.myMethod() { dispatch_
我有这段代码,有时变量 dConfiguration 是 Nil,我得到一个 EXC_BAD_ACCESS 错误,大多数时候变量说 0 键/值对,错误几乎不可能重现,我只需点击我的按钮大部分时间都能正
Utility.managedObjectContext().performBlockAndWait({ }) dispatch_sync(dispatch_get_main_queue(), { }
我有一些如下代码: - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"1"); dispatch_async(dispatc
如何使用 DispatchQueue 类为 iOS 替换以下 Swift 代码?这是旧的 Swift 3 代码,最新的 Xcode 不会将其转换为 Swift 5。 dispatch_async(di
我有在某些情况下更改 UI 的方法。 例如: -(void) myMethod { if(someExpressionIsTrue) { // make some UI changes
关于this question我想知道关于何时使用 NSNotification(在主线程中有观察者)与使用 GCD 将工作从后台线程分派(dispatch)到主线程,是否有任何普遍接受的逻辑? 似乎
我的应用程序中有一个场景,我想在一个方法中执行一些耗时的任务,其中包括一些数据处理以及 UI 更新。我的方法是这样的, - (void)doCalculationsAndUpdateUIs {
当基本 SDK 设置为 10.9 时,我在 SWIFT 中使用“dispatch_get_main_queue()”时遇到困难。我使用的代码是一个简单的dispatch_async调用,如下所示: d
我想将所有读/写数据库操作放到后台队列中,并在完成时更新当前的 UI View 。 如果用户在我处理数据库时停留在 View 中,则没有问题。但是,如果用户在数据库操作完成之前离开该 View ,它将
我正在尝试在后台进程中创建多个 WKWebView View ,然后在它们全部完成加载后将它们添加到主线程上的 View 。 每个 WKWebView 都包含一个通过 javascript 呈现的图表
我继承了一个使用以下线程结构的代码库: dispatch_async(dispatch_get_main_queue(), { () -> Void in dispatch_async(dis
在 tutorial from Ray Wenderlich Series, 之一中他在完成 block 中使用了 dispatch_get_main_queue() 如下 func startFil
我刚刚开始在 iOS 上工作,并且一直在浏览 GCD 上的 Apple 引用资料。 dispatch_get_global _queue 返回一个并发队列,可以向其中提交要执行的 block 。 但是
我继承了一些具有这种相当不寻常的嵌套序列的代码。通常的范例将对主队列进行一次分派(dispatch)以更新 UI。下面显示的代码将对主队列的调度嵌套在对主队列的另一个调度中。 - (void)view
我是一名优秀的程序员,十分优秀!