ここで少し混乱していますが、キューを使用しています。ディスパッチキューはどのように動作するのですか
私はgetPeople
という名前のメソッドを持っています。このメソッドは、サーバーからユーザーの画像を取得する必要があります。アプリをブロックしないために、私はこれを使用しました:
-(IBAction)seeMorePeople{
dispatch_queue_t getPeopleQueue = dispatch_queue_create("Pinta Ocupantes", NULL);
dispatch_async(getPeopleQueue, ^{
[self getPeople];
});
dispatch_release(getPeopleQueue);
}
前のコードは、ユーザーがボタンをタップするたびに実行されます。 「このアルバムから私に写真を渡してください」と別のタップ「今、私はその他のアルバムからの人々の写真を望んでいます」、写真と写真の量が違うようなものです。ユーザーがボタンをすばやくタップすると、2番目のボタンが既に開始しているときに、最初のキューはデータの取得を終了しません。 getPeople
でデータをNSMutableArrayに格納するので、2つのキューが同時に実行されているときに、両方が同じ配列に書き込まれているため、境界外の例外が原因でアプリケーションがクラッシュします。 getPeople
はデータを通過 方法は、このようなものです:私は把握することはできませんどのような
-(void)getPeople:(NSDictionary *)peopleDictionary{
//I receive an NSDictionary and I go through it
NSArray *keys = [peopleDictionary allKeys];
int indexOfArray = 0;
for(NSString *key in keys){
//Complex operation that are not important
[peopleInArray insertObjetAtIndex:indexOfArray];//People in array is a global variable
indexOfArray++;
}
}
このうち取得する方法で、私は2番目の1が入ってくる時に最初のキューを停止すると思ったが、 GCDはこのオプションを持っていません...これをやり遂げるための他の方法は、うまくいけば主要な記録がなくても、今はアイデアがないからです。
私はリンクを見ていきますが、私が望むのは、彼がもう興味がない場合、ユーザーがデータをダウンロードするのを待たないということです。ユーザーがボタンをタップするたびに別のキューをディスパッチすることができれば、私はうまくいくだろう。それをしてもいいですか?:)もし – subharb
スレッドが最新でない場合、コードをブロックするセマフォもありますか?それは可能ですか? – subharb