この解析操作は現在正常に動作していますが、UI がわずかにフリーズしていることに気付き始めたので、リファクタリングしてこれを非同期で実行しようとしています。しかし、私はいくつかの問題を抱えており、誰かが私を正しい方向に向けることを望んでいました. これが私の現在の(同期)コードです:
- (NSArray *)eventsFromJSON:(NSString *)objectNotation
{
NSParameterAssert(objectNotation != nil);
NSData *unicodeNotation = [objectNotation dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *eventsData = [NSJSONSerialization JSONObjectWithData:unicodeNotation options:0 error:&error];
if (eventsData == nil) {
//invalid JSON
return nil;
}
NSArray *events = [eventsData valueForKeyPath:@"resultsPage.results"];
if (events == nil) {
//parsing error
return nil;
}
NSLog(@"events looks like %@", events);
NSMutableArray *formattedEvents = [NSMutableArray arrayWithCapacity:events.count];
for (id object in [events valueForKeyPath:@"event"]) {
Event *event = [[Event alloc] init];
event.latitude = [object valueForKeyPath:@"location.lat"];
event.longitude = [object valueForKeyPath:@"location.lng"];
event.title = [object valueForKeyPath:@"displayName"];
event.venue = [object valueForKeyPath:@"venue.displayName"];
event.ticketsLink = [NSURL URLWithString:[object valueForKeyPath:@"uri"]];
event.artist = [object valueForKeyPath:@"performance.artist.displayName"];
event.date = [object valueForKeyPath:@"start.datetime"];
[formattedEvents addObject:event];
}
return [NSArray arrayWithArray:formattedEvents];
}
私は NSOperationQueue を調べてきましたが、このメソッドから配列を返したいのですが、操作キューは戻り値を持つことを意図していないため、解決策を見つけるのに苦労しています。私もGCDを見ていますが、次のようなものがあります:
- (NSArray *)eventsFromJSON:(NSString *)objectNotation
{
dispatch_queue_t backgroundQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
__block NSMutableArray *mutable = [NSMutableArray array];
dispatch_async(backgroundQueue, ^{
NSParameterAssert(objectNotation != nil);
NSData *unicodeNotation = [objectNotation dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *eventsData = [NSJSONSerialization JSONObjectWithData:unicodeNotation options:0 error:&error];
if (eventsData == nil) {
//invalid JSON
mutable = nil;
}
NSArray *events = [eventsData valueForKeyPath:@"resultsPage.results"];
if (events == nil) {
//parsing error
mutable = nil;
}
NSLog(@"events looks like %@", events);
NSMutableArray *formattedEvents = [NSMutableArray arrayWithCapacity:events.count];
for (id object in [events valueForKeyPath:@"event"]) {
Event *event = [[Event alloc] init];
event.latitude = [object valueForKeyPath:@"location.lat"];
event.longitude = [object valueForKeyPath:@"location.lng"];
event.title = [object valueForKeyPath:@"displayName"];
event.venue = [object valueForKeyPath:@"venue.displayName"];
event.ticketsLink = [NSURL URLWithString:[object valueForKeyPath:@"uri"]];
event.artist = [object valueForKeyPath:@"performance.artist.displayName"];
event.date = [object valueForKeyPath:@"start.datetime"];
[formattedEvents addObject:event];
}
mutable = [NSMutableArray arrayWithArray:formattedEvents];
});
return [mutable copy];
}
何らかの理由で、これは解析が完了する前にオブジェクトを返しているようですが、その可変オブジェクトからデータを取得していないため、解析が実際に行われていることに気付きました (結果をログアウトしています) )。この非同期処理を実行する方法について誰か教えてもらえますか?
ありがとう!!