我有以下方法
+ (NSString*)getMeMyString
{
NSString *result;
dispatch_async(dispatch_get_main_queue(), ^{
result = [ClassNotThreadSafe getString];
});
return result;
}
Run Code Online (Sandbox Code Playgroud)
如何让块同步执行它的工作,以便它在返回之前不返回结果?
我开始使用GCD了,我需要知道某个线程何时结束了它的工作.
我的代码:
dispatch_queue_t registerDeviceQueue = dispatch_queue_create("RegisterDevice", NULL);
dispatch_async(registerDeviceQueue, ^{
[self registerDevice];
dispatch_async(dispatch_get_main_queue(), ^{
[aiRegisterDevice stopAnimating];
});
});
dispatch_release(registerDeviceQueue);
Run Code Online (Sandbox Code Playgroud)
我需要知道这个步骤何时结束,以便UIActivityView可以停止.它现在的方式,它在线程结束前停止.
谢谢,
RL
我有一个典型的"向下钻取"风格的应用程序DetailViewController包括UIImageView,UIWebView和一些UILabel秒.问题是imageView加载需要一段时间!它是白色(背景颜色)片刻,然后最终在3-5秒后加载(可能是下载所需的时间).
代码是:
- (void)loadSummary {
self.dogFood = [[IKFetcher sharedFetcher] fetchDogFoodInfoForId:self.dogFoodId];
self.dogFoodAnalysisArray = [[IKFetcher sharedFetcher] fetchDogFoodAnalysisArrayForId:self.dogFoodId];
self.dogFoodRating = [[IKFetcher sharedFetcher] getAvgDogFoodRatingForId:self.dogFoodId];
if ([self.dogFood.dfImageUrl length] != 0) {
self.dogFoodImage.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.dogFood.dfImageUrl]]];
}
}
Run Code Online (Sandbox Code Playgroud)
并且呼叫loadSummary包含在dispatch_async呼叫中.
我该怎么做才能让应用程序等待图像下载?
我正在尝试编译Desktop OS X Cocoa应用程序:
dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(@"Hello World"); });
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下编译时错误:
函数dispatch_sync的隐式声明
我已导入这些行:
#import <dispatch/dispatch.h>
#import <dispatch/queue.h>
#import <dispatch/base.h>
Run Code Online (Sandbox Code Playgroud)
Base SDK设置为10.6.还有什么需要寻找的吗?我错过了一个导入?
有任何想法吗?
我需要下载JSON并在iOS5的后台处理它,所以我不冻结我的主线程.我没有取得任何成功.
这是我在做的事情:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
NSURL *url = [NSURL URLWithString:myURL];
myData = [NSData dataWithContentsOfURL:url];
[self performSelectorOnMainThread:@selector(processTheData:)
withObject:myData
waitUntilDone:YES];
});
-(void)processTheData:(NSData *)data
{
//Parse JSON here
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,一旦下载完成,我在Main thrd处理它.当我知道我得到数据时,如何在后台运行它?
我尝试理解UITableView当表格可见时,当我处理大量行时要使用的最佳实践.
这是我的行为:
我有一个UITableView和一个线程试图将数据插入此表.我认为[UITableView reloadData]对于性能方面做一个糟糕的解决方案,我知道UIKit操作是在主线程上进行的,因此当数据源更新完成时我试图发送一个NSNotification进行UITableView更新操作(beginUpdate - insertRowAtIndex - endUpdate)在主线程上,但这种技术冻结了用户界面.我必须处理1000多行.
有人已经解决了这个问题吗?是否可以使用GDC异步和同步?如果有,怎么样?提前致谢.
multithreading objective-c uitableview grand-central-dispatch ios
我正在尝试学习如何在后台线程上调度计算,然后更新UI.当我在使用谷歌地图的现有项目中尝试此操作时,"背景"后跟"主"打印一次.不再进行打印,就好像计时器不重复一样.
此外,当我创建一个空白的应用程序并添加此代码时,根本没有任何打印.
let queue = dispatch_queue_create("myTimer", nil);
let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer) {
println("background")
dispatch_async(dispatch_get_main_queue(), { println("main") })
}
dispatch_resume(timer)
Run Code Online (Sandbox Code Playgroud) 我们最近修改了我们的线程机制,支持dispatch_async在大多数地方使用'(在做了很多关于NSOperation和dispatch_async的阅读之后)*.然后我们的代码开始在代码的各个部分与EXC_BAD_ACCESS崩溃,总是在dispatch_async(queue,...)部分,没有明确的模式.通常在20分钟后发生--2小时.
我们的dispatch_async块用于通知听众,如下所示:
NSMutableSet *_listeners; // Initialised elsewhere and filled with interested listeners
void(^block)(id listener); // Block to execute
@synchronized(_listeners) {
for (id listener in _listeners) {
dispatch_async_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // We used different queues for different listeners, but showing only one type of queue here for brevity
dispatch_async(queue, ^{ // CRASHING LINE
block(listener);
});
}
}Run Code Online (Sandbox Code Playgroud)
常见的症状是:
(这是一个自我回答的问题)
*我们喜欢简单dispatch_async,不需要阻止/依赖功能,NSOperationQueue我们很快就会转向C++,所以想保持低水平.
exc-bad-access dispatch grand-central-dispatch ios dispatch-async
我在向数组添加值时发生concurrentPerform错误.我按下按钮.在出错的那一刻,myArray01有133个.在其他运行中,myArray01有69个元素.如何删除此错误?
出错线
线程8:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)
在控制台
致命错误:UnsafeMutablePointer.deinitialize with negative count 2017-12-24 11:59:53.438933 + 0300 ap02 [7624:1873749]致命错误:UnsafeMutablePointer.deinitialize with negative count(lldb)
类似主题Swift:UnsafeMutablePointer.deinitialize在附加到数组 Swift时带有负数的致命错误:UnsafeMutablePointer.deinitialize在附加到数组时带有负数的致命错误
var myArray01 = [4444,5555]
@IBAction func button01Pressed(_ sender: Any) {
self.doIt01()
}
func doIt01() {
DispatchQueue.concurrentPerform(iterations: 1000) { iter in
var max = 100000
for iterB in 0..<100000 {
var k = 0
k = k + 1
var half:Int = max/2
if (iterB == half) {
myArray01.append(iter)
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,print语句按它们包含的数字的顺序执行(1,2,3等)
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.async {
print("4")
}
print("1")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
DispatchQueue.main.async {
print("5")
}
print("2")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
DispatchQueue.main.async {
print("6")
}
print("3")
}
Run Code Online (Sandbox Code Playgroud)
你能解释为什么执行过程会这样发生吗?是viewWillAppear和viewWillAppear方法已经在队列中,当我们派遣异步块中viewDidLoad?
ios ×7
objective-c ×4
swift ×2
cocoa ×1
dispatch ×1
iphone ×1
macos ×1
nsthread ×1
nstimer ×1
uiimageview ×1
uitableview ×1
xcode ×1